Разница между @Configuration и @Component как классами конфигурации

задняя часть

Аннотированный класс @Configuration:

/**
 * @Description 测试用的配置类
 * @Author 弟中弟
 * @CreateTime 2019/6/18 14:35
 */
@Configuration
public class MyBeanConfig {
  @Bean
  public Country country(){
    return new Country();
  }
  @Bean
  public UserInfo userInfo(){
    return new UserInfo(country());
  }
}

Аннотированный класс @Component:

/**
 * @Description 测试用的配置类
 * @Author 弟中弟
 * @CreateTime 2019/6/18 14:36
 */
@Component
public class MyBeanConfig {
  @Bean
  public Country country(){
    return new Country();
  }
  @Bean
  public UserInfo userInfo(){
    return new UserInfo(country());
  }
}

контрольная работа:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoTest {

    @Autowired
    private Country country;

    @Autowired
    private UserInfo userInfo;

    @Test
    public void myTest() {
        boolean result = userInfo.getCountry() == country;
        System.out.println(result ? "同一个country" : "不同的country");
    }

}

Если @Configuration выводит одну и ту же страну, @Component — другую страну, то почему?

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

Когда вы нажмете на @Configuration, вы обнаружите, что он фактически изменен @Component, поэтомуcontext:component-scan/Либо @ComponentScan может обрабатывать аннотированные классы @Configuration.

Классы, отмеченные @Configuration, должны соответствовать следующим требованиям:

Классы конфигурации должны предоставляться как класс (а не как экземпляр, возвращаемый фабричным методом), что позволяет улучшать среду выполнения (динамические прокси-серверы cglib) путем создания подклассов.

Классы конфигурации не могут быть конечными классами (без динамического проксирования).

Аннотации конфигурации обычно используются для создания классов Spring, управляемых контейнером, с помощью аннотации @Bean.

Класс конфигурации должен быть нелокальным (т. е. не может быть объявлен в методе, не может быть закрытым).

Любые вложенные классы конфигурации должны быть объявлены статическими.

Методы @Bean не могут, в свою очередь, создавать дополнительные классы конфигурации (то есть возвращаемый компонент с

@Configuration также не обрабатывается специально, как обычный bean-компонент).

ноКогда контейнер Spring запускается, существует класс, который имеет дело с @Configuration, который улучшит динамический прокси-сервер cglib класса, измененного @Configuration.Это одна из причин, по которой @Configuration должен соответствовать вышеуказанным требованиям.Что будет повышенная? Вот идея личной сортировки.Если есть какая-то ошибка, дайте указатели

country() вызывается в userInfo(), потому что это метод, который country() должен генерировать новый новый contry(), поэтому добавление динамического прокси-сервера будет оценивать его.Если метод, вызываемый в userInfo, также украшен @Bean, затем экземпляр страны в контейнере Spring будет вызываться напрямую, а страна() больше не будет вызываться.Это должен быть объект, потому что bean-компонент в контейнере Spring по умолчанию является одноэлементным. Не понимает настроенные bean-компоненты, такие как xml

<bean id="country" class="com.hhh.demo.Country" scope="singleton"/>

Область действия здесь по умолчанию является одноэлементной.

Вышеизложенное является моим личным пониманием, подробности см. https://www.jb51.net/article/153430.htm для анализа исходного кода.

Но если я просто хочу использовать @Component, что, если класс без @Component не имеет динамического прокси?

/**
 * @Description 测试用的配置类
 * @Author 弟中弟
 * @CreateTime 2019/6/18 14:36
 */
@Component
public class MyBeanConfig {
  @Autowired
  private Country country;
  @Bean
  public Country country(){
    return new Country();
  }
  @Bean
  public UserInfo userInfo(){
    return new UserInfo(country);
  }
}

Это гарантированно будет одним и тем же экземпляром Country.


Если есть какая-либо ошибка, пожалуйста, дайте указатели на больших парней, спасибо 0.0