码迷,mamicode.com
首页 > 其他好文 > 详细

Bean的生命周期

时间:2017-12-31 15:30:35      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:classpath   实例   handler   完成后   post   www.   ace   sso   property   

完整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的生命周期

标签:classpath   实例   handler   完成后   post   www.   ace   sso   property   

原文地址:https://www.cnblogs.com/weishao-lsv/p/8157697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!