Spring中Bean的生命周期

来源:互联网 发布:怀孕b超数据怎么看 编辑:程序博客网 时间:2024/06/05 08:43
1、Spring bean 生命周期相关接口
    Spring bean生命周期过程中涉及的相关接口可分为如下几类:

    1)、Bean自身的方法:这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

    2)、Bean级生命周期接口方法:这个包括了BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean和DiposableBean这些接口的方法

    3)、容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。

    4)、工厂后处理器接口方法:这个包括了BeanFactoryPostProcessor、AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

2、生命周期过程接口调用实例验证

1)、首先是一个简单的Spring Bean,调用Bean自身的方法和Bean级生命周期接口方法,为了方便演示,它实现了BeanNameAware、
BeanFactoryAware、ApplicationContextAwareInitializingBean和DiposableBean接口,同时有2个方法,对应配置文件中<bean>的init-method和destroy-method。如下:
package com.xl.springtest;import org.omg.CORBA.PRIVATE_MEMBER;import org.springframework.beans.BeansException;import org.springframework.beans.factory.*;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * Created by xl on 2016/6/22. */public class Student  implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware {private BeanFactory beanFactory;    private ApplicationContext applicationContext;    private String  beanName ;     private String name ;     private String address;     private String Phone;    public Student() {        System.out.println("这是Student实现类无参数构造器!!");}public Student(String name, String address, String phone) {this.name = name;        this.address = address;Phone = phone;System.out.println("这是Student实现类 带参数 构造器!!");}public String getAddress() {return address;}public void setAddress(String address) {        System.out.println("【注入属性】注入属性address");        this.address = address;}public String getPhone() {return Phone;}public void setPhone(String phone) {        System.out.println("【注入属性】注入属性phone");Phone = phone;}public String getName() {return name;}public void setName(String name) {        System.out.println("【注入属性】注入属性name");        this.name = name;}/**     * 这是ApplicationContextAware接口方法* @param applicationContext* @throws BeansException     */@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        System.out.println("ApplicationContextAware 接口 ,setApplicationContext()方法被调用");        this.applicationContext = applicationContext;}/**     * 这是BeanFactoryAware接口方法* @param beanFactory* @throws BeansException     */@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {        System.out.println("BeanFactoryAware 接口 ,setBeanFactory()方法被调用");            this.beanFactory = beanFactory;}/**     *  // 这是BeanNameAware接口方法* @param name*/@Overridepublic void setBeanName(String name) {        System.out.println("BeanNameAware 接口 ,setBeanName()方法被调用");           this.beanName = beanName;}/**     * 这是DisposableBean接口方法* @throws Exception     */@Overridepublic void destroy() throws Exception {        System.out.println("DisposableBean 接口 ,destroy()方法被调用");}/**     * 这是InitializingBean接口方法* @throws Exception     */@Overridepublic void afterPropertiesSet() throws Exception {        System.out.println("InitializingBean 接口 ,afterPropertiesSet()方法被调用");}/**     *   通过<bean>的init-method属性指定的初始化方法*/public void myInit() {          System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");}/**     *  通过<bean>的destroy-method属性指定的初始化方法*/public void myDestory() {           System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");}@Overridepublic String toString() {return "Student{" +"address='" + address + '\'' +", Phone='" + Phone + '\'' +", name='" + name + '\'' +'}';}}
2)、接下来是实现BeanFactoryPostProcessor接口的工厂后置处理器类,如下:
package com.xl.springtest;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanDefinition;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;/** * Created by xl on 2016/6/22. */public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor{public MyBeanFactoryPostProcessor() {super();System.out.println("这是MyBeanFactoryPostProcessor实现类构造器!!");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {        System.out.println("BeanFactoryPostProcessor调用postProcessBeanFactory方法");BeanDefinition bd = beanFactory.getBeanDefinition("student");bd.getPropertyValues().addPropertyValue("phone","1399999999");}}
3)、接下来是实现BeanPostProcessor接口的后置处理器类,如下:
package com.xl.springtest;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.context.annotation.Bean;/** * Created by xl on 2016/6/22. */public class MyBeanPostProcessor implements BeanPostProcessor {public MyBeanPostProcessor() {        System.out.println("这是MyBeanPostProcessor实现类构造器!!");}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        System.out.println("MyBeanPostProcessor  postProcessBeforeInitialization 方法被调用");        return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        System.out.println("MyBeanPostProcessor  postProcessAfterInitialization 方法被调用");        return bean;}}
4)、下面是InstantiationAwareBeanPostProcessor 接口实现类,InstantiationAwareBeanPostProcessor 本质是BeanPostProcessor的子接口,一般继承Spring为其提供的适配器类InstantiationAwareBeanPostProcessorAdapter来使用它,如下:
package com.xl.springtest;import org.springframework.beans.BeansException;import org.springframework.beans.PropertyValues;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;import java.beans.PropertyDescriptor;/** * Created by xl on 2016/6/22. */public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {public MyInstantiationAwareBeanPostProcessor() {super();System.out.println("这是MyInstantiationAwareBeanPostProcessorAdapter实现类构造器!!");}// 接口方法、实例化Bean之前调用@Overridepublic Object postProcessBeforeInstantiation(Class beanClass,String beanName) throws BeansException {        System.out.println("MyInstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法");      return null;}// 接口方法、实例化Bean之后调用@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {      System.out.println("MyInstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法");        return bean;}// 接口方法、设置某个属性时调用@Overridepublic PropertyValues postProcessPropertyValues(PropertyValues pvs,PropertyDescriptor[] pds, Object bean, String beanName)throws BeansException {       System.out.println("InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法");            return pvs;}}
5)、 Bean配置文件bean-life.xml如下:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">      <bean id="myBeanPostProcessor" class="com.xl.springtest.MyBeanPostProcessor"/>       <bean id="myMyInstantiationAwareBeanPostProcessor" class="com.xl.springtest.MyInstantiationAwareBeanPostProcessor"/>       <bean id="myBeanFactoryPostProcessor" class="com.xl.springtest.MyBeanFactoryPostProcessor"/>       <bean id="student" class="com.xl.springtest.Student" init-method="myInit" destroy-method="myDestory" >             <property name="address" value="一路21号"/>              <property name="name" value="xxl"/>              <property name="phone" value="1388888888"/><!--              <constructor-arg index="0" value="xxl"/>              <constructor-arg index="1" value="一路21号"/>              <constructor-arg index="2" value="1388888888"/>         --></bean></beans>

6)、测试应用程序:
public static void main(String args[] ){    ApplicationContext appContext = new ClassPathXmlApplicationContext("bean-life.xml");Student student = appContext.getBean("student",Student.class);System.out.println(student);System.out.println("现在开始关闭容器!");((ClassPathXmlApplicationContext)appContext).registerShutdownHook();}

7)、验证结果输出
这是MyBeanFactoryPostProcessor实现类构造器!!BeanFactoryPostProcessor调用postProcessBeanFactory方法这是MyBeanPostProcessor实现类构造器!!这是MyInstantiationAwareBeanPostProcessorAdapter实现类构造器!!MyInstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法这是Student实现类无参数构造器!!InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法【注入属性】注入属性address【注入属性】注入属性name【注入属性】注入属性phoneBeanNameAware 接口 ,setBeanName()方法被调用BeanFactoryAware 接口 ,setBeanFactory()方法被调用ApplicationContextAware 接口 ,setApplicationContext()方法被调用MyBeanPostProcessor  postProcessBeforeInitialization 方法被调用InitializingBean 接口 ,afterPropertiesSet()方法被调用【init-method】调用<bean>的init-method属性指定的初始化方法MyBeanPostProcessor  postProcessAfterInitialization 方法被调用MyInstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法Student{address='一路21号', Phone='1399999999', name='xxl'}现在开始关闭容器!DisposableBean 接口 ,destroy()方法被调用【destroy-method】调用<bean>的destroy-method属性指定的初始化方法Process finished with exit code 0


0 0
原创粉丝点击