今天在配置spring的调度器的时候,意外的发现带有@Configuration注解的类中的方法,如果该方法需要调用另外一个方法获取返回值,且被调用的方法上带有@Bean注解的话,spring框架会优先从容器中获取该bean实例来替代返回值。初步猜测是由org.springframework.context.annotation.ConfigurationClassEnhancer这个类,依靠CGLIB实现这个功能的。
代码如下:
@Configurationpublic 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); }}
@SpringBootApplicationpublic 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好强大,先记录下来,日后好好研究原理。