zoukankan      html  css  js  c++  java
  • 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

    七、输入打印结果

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

  • 相关阅读:
    mysql source命令可以导入比较大的文件
    开源 小程序
    React-Native项目在Android真机上调试
    react-native中长度单位换算
    webpack 去console
    微信H5移动端真机调试--vConsole
    记录
    盘点ES7、ES8、ES9、ES10新特性
    Mach-o可执行文件简述
    堆排序算法
  • 原文地址:https://www.cnblogs.com/5ishare/p/8030038.html
Copyright © 2011-2022 走看看