学习内容见:聊透spring @Configuration配置类
通过片段思考结果:
component代码片段
@Component
public class ComponentTest {
@Bean
public User a(){
System.out.println("ComponentTest A----");
return new User();
}
@Bean
public User b(){
a();
System.out.println("ComponentTest B----");
return new User();
}
@Scheduled(initialDelay = 2000,fixedDelay = 20000)
public void execute(){
System.out.println("ComponentTest execute----");
b();
}
}
先输出
ComponentTest A----
ComponentTest A----
ComponentTest B----
然后定时输出
ComponentTest execute----
ComponentTest A----
ComponentTest B----
configuration代码片段
@Configuration
public class ConfigurationTest {
@Bean
public User a1(){
System.out.println("ConfigurationTest A----");
return new User();
}
@Bean("b1")
public User b1(){
a1();
System.out.println("ConfigurationTest B----");
return new User();
}
@Scheduled(initialDelay = 2000,fixedDelay = 20000)
public void execute(){
System.out.println("ConfigurationTest execute----");
b1();
}
}
先输出
ConfigurationTest A----
ConfigurationTest B----
然后定时输出
ConfigurationTest execute----
总结:对于使用configuration中配置的bean,其底层会对方法a1()、b1()加上拦截器,对于调用方法a1,拦截器拦截后,本质上从spring容器中直接取出a1的内容,该内容底层使用的是代理的方式实现的,因此运行结果上看a1中的方法没有在b1中执行