Spring之bean二生命周期

上一博客主要学习了下bean的配置、注入、自定义属性编辑器,今天来熟悉bean的生命周期。在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的。关于bean的生命周期我在网上也找了好多,基本都差不多。这里我主要是想通过代码来验证,毕竟学的知识都是一样的,都是学的Java,最重要的是动手练习,这样印象更深。下面是它生命周期的描述,我们通过demo来进行验证。下图是它执行的顺序。

一、创建LiftCycle类实现BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware5个接口方法

package Cuiyw.Spring.Service;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


public class LifeCycle  implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware{
    
    private String name;
    public String getName() {
        System.out.println("getName name="+name);
        return name;
    }
    public void setName(String name) {
         System.out.println("setName name="+name);
        this.name = name;
    }
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
         System.out.println("InitializingBean.afterPropertiesSet()");
    }
    public void setBeanName(String arg0) {
        // TODO Auto-generated method stub
        System.out.println("BeanNameAware.setBeanName");

    }
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("BeanFactoryAware.setBeanFactory");
    }
    public void destroy() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("DisposableBean.destroy");
    }
    public void myInit() {
        System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");
    }

    public void myDestory() {
        System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
    }
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        // TODO Auto-generated method stub
         System.out.println("ApplicationContextAware.setApplicationContext");
    }
    
}
View Code

二、注册InstantiationAwareBeanPostProcessor接口

package Cuiyw.Spring.Service;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor{

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInitialization");
        return bean;
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization");
        return bean;
    }

    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation");
        return true;
    }

    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation");
        return null;
    }

    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
            String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("InstantiationAwareBeanPostProcessor.postProcessPropertyValues");
        return pvs;
    }

}
View Code

三、注册BeanPostProcessor接口

其实InstantiationAwareBeanPostProcessor继承BeanPostProcessor,所以在上面我也实现了BeanPostProcessor接口的方法

package Cuiyw.Spring.Service;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements  BeanPostProcessor {

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("BeanPostProcessor.postProcessAfterInitialization  ");
        return bean;
    }

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("BeanPostProcessor.postProcessBeforeInitialization");
        return bean;
    }

}
View Code

四、注册BeanFactoryPostProcessor接口

package Cuiyw.Spring.Service;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

public class MyBeanFactoryPostProcessor implements  BeanFactoryPostProcessor {

    public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("BeanFactoryPostProcessor.postProcessBeanFactory");
    }
}
View Code

五、在上下文中配置

这里还是在上一个博客demo的基础上进行修改,为了有其他干扰,我先把service去掉了。

<?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="beanPostProcessor" class="Cuiyw.Spring.Service.MyBeanPostProcessor"></bean>
<bean id="instantiationAwareBeanPostProcessor" class="Cuiyw.Spring.Service.MyInstantiationAwareBeanPostProcessor"></bean>
<bean id="beanFactoryPostProcessor" class="Cuiyw.Spring.Service.MyBeanFactoryPostProcessor"></bean>
<bean id="lifeCycle" class="Cuiyw.Spring.Service.LifeCycle" init-method="myInit" destroy-method="myDestory">
<property name="name" value="cuiyw1"></property>
</bean>
</beans>
View Code

六、在main中使用bean

package Cuiyw.SpringAop;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import Cuiyw.Spring.IService.IService;
import Cuiyw.Spring.Service.LifeCycle;

public class App 
{
    public static void main( String[] args )
    {
        ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});
        BeanFactory factory=context;
        LifeCycle lifeCycle=factory.getBean("lifeCycle",LifeCycle.class);
        lifeCycle.setName("cuiyw2");
         System.out.println("lifeCycle.name="+lifeCycle.getName());
        ((ClassPathXmlApplicationContext)factory).registerShutdownHook();

     
        /*service=(IService)factory.getBean("ServiceA");
        service.service("Cuiyw ServiceA"); 
        service=(IService)factory.getBean("ServiceImpl");
        service.service("Cuiyw ServiceImpl"); */
    }

}
View Code

七、输入打印结果

可以发现输出的顺序和上面图的顺序基本一致。

posted @ 2017-12-12 22:27  社会主义接班人  阅读(556)  评论(0编辑  收藏  举报