这次的博客比较Spring中@PostConstruct、@PreDestroy、InitializingBean、DisposableBean、initMethod、destoryMethod的执行顺序,顺便会将construct以及与注入顺序一并比较
为了方便起见,这次不使用xml文件定义bean,完全采用注解配置,共3个类,都放在annotations包下
下面是定义的两个bean,Bean2直接加上@Conponent注解,加入到ioc容器
而Bean1,有1个注入属性、1个普通属性、1个构造器、3个初始化方法、3个销毁方法
public class Bean1 implements InitializingBean, DisposableBean{ @Autowired public Bean2 bean2; public String state; public Bean1 (){ state = "construct!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } public void init_method (){ state = "init-method!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } public void destory_method (){ state = "destory-method!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } @PostConstruct public void postConstruct (){ state = "postConstruct!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } @PreDestroy public void preDestory (){ state = "preDestory!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } @Override public void destroy() throws Exception { state = "destory!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } @Override public void afterPropertiesSet() throws Exception { state = "afterPropertiesSet!"; System.out.println("bean1 -> " + state + "..." + "bean2: " + bean2); } } @Component public class Bean2 { }
不要奇怪为什么Bean1没有加入到ioc容器,我们下面马上进行:
@Configuration @org.springframework.context.annotation.ComponentScan(basePackages = "annotations") public class ComponentScan { @Bean(initMethod = "init_method", destroyMethod = "destory_method") public Bean1 bean1 (){ return new Bean1(); } public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(ComponentScan.class); ctx.refresh(); ctx.registerShutdownHook(); } }
可以通过@Configuration注册bean,和xml是一样的效果
打印结果为
bean1 -> construct!...bean2: null bean1 -> postConstruct!...bean2: annotations.Bean2@35fc6dc4 bean1 -> afterPropertiesSet!...bean2: annotations.Bean2@35fc6dc4 bean1 -> init-method!...bean2: annotations.Bean2@35fc6dc4 bean1 -> preDestory!...bean2: annotations.Bean2@35fc6dc4 bean1 -> destory!...bean2: annotations.Bean2@35fc6dc4 bean1 -> destory-method!...bean2: annotations.Bean2@35fc6dc4
所以执行顺序如下:
初始化时:构造器Construct -> 属性注入 -> @PostConstruct -> InitializingBean接口 -> bean定义的initMethod
销毁时:@PreDestroy -> DisposableBean接口 -> bean定义的destoryMethod
When you work directly in Java, you can do anything you like with your objects and do not always need to rely on the container lifecycle!