Bean的生命周期

Posted weishao-lsv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bean的生命周期相关的知识,希望对你有一定的参考价值。

完整Bean的生命周期

1. instantiate bean对象实例化
2. populate properties 封装属性
3. 如果Bean实现BeanNameAware 执行 setBeanName
4. 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
5. 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6. 如果Bean实现InitializingBean 执行 afterPropertiesSet 
7. 调用<bean init-method="init"> 指定初始化方法 init
8. 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
9. 执行业务处理
10.如果Bean实现 DisposableBean 执行 destroy
11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy

 

以下代码示例进行讲解

UserDao

public interface UserDao {
     public void addUser();
}

 

UserDaoImpl

public class UserDaoImpl implements UserDao, BeanNameAware,
ApplicationContextAware, InitializingBean, DisposableBean {
    
    private String name;
    
    public UserDaoImpl() {
        System.out.println("第一步 Bean的构造器执行....");
    }
    public void setName(String name) {
        System.out.println("第二步  属性依赖注入....");
        this.name = name;
    }
    @Override
    public void setBeanName(String beanName) {
        System.out.println("第三步 获得当前Bean在Spring 注册 Bean 名字 :" + beanName);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        System.out.println("第四步 获得当前 Spring上下文 :" + applicationContext);
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("第六步 属性封装完成 ....");
    }
    public void myinit() {
        System.out.println("第七步  自定义初始化方法...");
    }
    @Override
    public void addUser() {
        System.out.println("第九步 ,使用业务Bean 执行业务操作....");
        System.out.println("用户添加");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("第十步, 不需要配置 调用释放资源方法");
    }
    public void mydestroy() {
        System.out.println("第十一步  自定义 释放资源方法");
    }
}

 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p" 
    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="userDao" class="com.demo.UserDaoImpl" init-method="myinit" destroy-method="mydestroy">
       <property name="name" value="helloWorld"></property>
    </bean>    
    <bean class="com.demo.MyBeanPostProcessor"></bean>
</beans>

 

MyBeanPostProcessor

    @Override
    public Object postProcessAfterInitialization(final Object bean, String beanName)
            throws BeansException {
        System.out.println("第八步 BeanPostProcessor 后处理Bean 初始化完成后增强....");
        if (beanName.equals("userDao")) {
            return Proxy.newProxyInstance(bean.getClass().getClassLoader(),
                    bean.getClass().getInterfaces(), new InvocationHandler() {
                
                        public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
                            
                            if (method.getName().equals("addUser")) {
                                System.out.println("增强addUser================");
                            }

                            // 不增强
                            return method.invoke(bean, args);
                        }
                    });
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("第五步BeanPostProcessor 后处理Bean 初始化完成前增强... "+beanName);
        return bean;
    }

 

UserTest

@Test
    public void demo() {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) applicationContext.getBean("userDao");
        userDao.addUser();
        applicationContext.close();
     }

 

打印结果

  

第一步 Bean的构造器执行....
第二步  属性依赖注入....
第三步 获得当前Bean在Spring 注册 Bean 名字 :userDao
第四步 获得当前 Spring上下文 
第五步BeanPostProcessor 后处理Bean 初始化完成前增强... userDao
第六步 属性封装完成 ....
第七步  自定义初始化方法...
第八步 BeanPostProcessor 后处理Bean 初始化完成后增强....
增强addUser================
第九步 ,使用业务Bean 执行业务操作....
用户添加
第十步, 不需要配置 调用释放资源方法
第十一步  自定义 释放资源方法

 

以上是关于Bean的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务,Bean生命周期

关于片段生命周期

调用 replace() 时片段的生命周期是啥?

Spring应用上下文中Bean的生命周期

Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

在不存在的片段上调用片段生命周期和 onCreate 的问题