1. 程式人生 > >Bean的生命周期

Bean的生命周期

示例 test 釋放 rop getclass == inter tom 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的生命周期