您的位置:首页 > 其它

关于@Configuration和@Bean的新发现

2016-02-02 00:00 197 查看
今天在配置spring的调度器的时候,意外的发现带有@Configuration注解的类中的方法,如果该方法需要调用另外一个方法获取返回值,且被调用的方法上带有@Bean注解的话,spring框架会优先从容器中获取该bean实例来替代返回值。初步猜测是由org.springframework.context.annotation.ConfigurationClassEnhancer这个类,依靠CGLIB实现这个功能的。

代码如下:

@Configuration
public class Configurer implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Object taskExecutor = taskExecutor();
System.err.println(System.identityHashCode(taskExecutor));
taskRegistrar.setScheduler(taskExecutor);
}

@Bean(name="taskExecutor",destroyMethod="shutdown")
public Object taskExecutor() {
System.err.println(getClass().getName());
System.err.println("方法被调用");
return Executors.newScheduledThreadPool(20);
}

}

@SpringBootApplication
public class Application {

public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
Object bean = context.getBean("taskExecutor");
System.err.println(System.identityHashCode(bean));
}

}

输出结果显示如下:



好神奇,taskExecutor()方法只被调用了一次。

spring好强大,先记录下来,日后好好研究原理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: