Аннотированный класс @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