Spring Bean的生命周期

匿名 (未验证) 提交于 2019-12-03 00:27:02


一种方式:指定初始化和销毁方法,通过@Bean指定init-method和destory-method

public class Car {
public Car(){
System.out.println("调用Car类的构造方法。。。。");
}
public void init(){
System.out.println("调用Car init方法。。。。。");
}
public void destory(){
System.out.println("调用Car类的销毁方法。。。。。");
}
}

@Configuration   public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } }

@Test   public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.classSystem.out.println("容器创建完成"Object bean = applicationContext.getBean(Car.classSystem.outapplicationContext.close(); }

输出结果:

调用Car类的构造方法。。。。

调用Car init方法。。。。。

容器创建完成

com.jbit.pojo.Car@1460a8c0

调用Car类的销毁方法。。。。。

第二种方式:通过接口InitialiaingBean(定义初始化逻辑),通过接口DisposableBean(定义销毁逻辑)

@Component   public class Cat implements public void destroy() throws out.println("Cat类销毁方法启动。。。。。"}    public void afterPropertiesSet() throws System.out.println("Cat类初始化方法启动。。。。"} }

@ComponentScan(value="com.jbit.pojo")   @Configuration   public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } }

@Test   public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.classObject bean = applicationContext.getBean(Cat.classSystem.out.println(bean.getClass());    }

输出结果:

Cat类初始化方法启动。。。。

调用Car类的构造方法。。。。

调用Car init方法。。。。。

class com.jbit.pojo.Cat

第三种方式:使用JSR250

@PostConstruct,在Bean创建完成并且属性赋值完成,来执行初始化。

@PreDestory,在容器销毁Bean之前通知我们进行清理工作。

public class public out.println("Dog.....构造方法被调用。。。。。"} public void System.out.println("Dog。。。。初始化方法被调用。。。。"} public void System.out.println("Dog....销毁方法被调用。。。。。"} }

@ComponentScan(value="com.jbit.pojo")   @Configuration   public class @Bean(initMethod = "init",destroyMethod = "destory"public return new }    public return new } }

@Test   public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.classObject bean = applicationContext.getBean(Dog.classSystem.out.println(bean.getClass());    }

输出结果:

Cat类初始化方法启动。。。。

调用Car类的构造方法。。。。

调用Car init方法。。。。。

Dog.....构造方法被调用。。。。。

Dog。。。。初始化方法被调用。。。。

class com.jbit.pojo.Dog

第四种方式:

使用接口BeanPostProcessor,Bean的后置处理器,在Bean的初始化前后做一些工作

PostProcessBeforeInitialization():在任何Bean初始化之前进行工作

postProAfterInitialization():在初始化之后进行工作

/** * 后置处理器,在所有Bean* */   @Component//将后置处理器加入到容器中   public class MyBeanPostProcessor implements public Object postProcessBeforeInitialization(Object o, String s) throws System.out.println("postProcessBeforeInitialization...."+"beanName:"return }    public Object postProcessAfterInitialization(Object o, String s) throws System.out.println("postProcessAfterInitialization...."+"beanName:"return } }
@ComponentScan(value="com.jbit.pojo")//将后置处理器,扫描进IOC容器中   @Configuration   public class @Bean(initMethod = "init",destroyMethod = "destory"public return new } public return new  }
启动测试
@Test   public void AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); }
输出信息:
postProcessBeforeInitialization....beanName:org.springframework.
context.event.internalEventListenerProcessor
postProcessAfterInitialization....beanName:org.springframework.
context.event.internalEventListenerProcessor
postProcessBeforeInitialization....beanName:org.springframework.
context.event.internalEventListenerFactory
postProcessAfterInitialization....beanName:org.springframework.
context.event.internalEventListenerFactory
postProcessBeforeInitialization....beanName:mainConfigOfLifeCycle
postProcessAfterInitialization....beanName:mainConfigOfLifeCycle
postProcessBeforeInitialization....beanName:cat
Cat类初始化方法启动。。。。
postProcessAfterInitialization....beanName:cat
调用Car类的构造方法。。。。
postProcessBeforeInitialization....beanName:car
调用Car init方法。。。。。
postProcessAfterInitialization....beanName:car
Dog.....构造方法被调用。。。。。
postProcessBeforeInitialization....beanName:dog
Dog。。。。初始化方法被调用。。。。
postProcessAfterInitialization....beanName:dog
观察以上结果可见,spring的后置处理器将会在IOCp容器中每个Bean初始化前后进行工作。
执行方式:
遍历得到容器所有的BeanPostProcessor,挨个执行beforeInitialization,一旦返回null,跳出for循环,不会执行后面的BeanPostProcessor. postProcessBeforeInitialization()方法。(参见源码!)

Processor的其它用法

//返回applicationContex获取IOC容器
public class Dog implements //实现ApplicationContextAware接口返回private ApplicationContext applicationContextpublic System.out.println("Dog.....构造方法被调用。。。。。"} public void System.out.println("Dog。。。。初始化方法被调用。。。。"} public void System.out.println("Dog....销毁方法被调用。。。。。"} //实现ApplicationContextAware接口返回public void setApplicationContext(ApplicationContext applicationContext) throws this.applicationContext } }
Spring底层对PostProcessor的运用
BeanValidationPostProcessor:进行数据校验
InitDestroyAnnotationBeanPostProcessor:寻找初始化注解与销毁注解,执行。
AutowiredAnnotationBeanPostProcessor:处理@Autowrited注解。
Bean赋值。注入其它组件,@AutoWrited,生命周期注解功能,@Async,等。。。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!