Spring點滴四:Spring Bean生命周期


Spring Bean 生命周期示意圖:

   了解Spring的生命周期非常重要,我們可以利用Spring機制來定制Bean的實例化過程。

---------------------------------------------------------------------------------------------------------------------------------------------------

spring-service.xml:

<?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 -->
     <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl">
     </bean>
   
    <bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
 
    <bean id="beanLifecycle" class="com.test.spring.BeanLifecycle" init-method="init" destroy-method="close">
        <property name="name" value="張三"></property>
        <property name="sex" value="男"></property>
    </bean>
    
    <bean id="postProcessor" class="com.test.spring.PostProcessor"/> </beans>

Service Class:

package com.test.spring;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
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.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ImportAware;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata;

import com.sun.org.apache.xml.internal.security.Init;

/**
 * 測試Spring Bean的生命周期
 * @author zss
 *
 */
public class BeanLifecycle implements InitializingBean,DisposableBean
,BeanFactoryAware,BeanNameAware,ApplicationContextAware{
    private String name;
    private String sex;
    
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("》》》調用BeanLifecycle對象"+this.getName()+"屬性set方法,設值為:"+name);
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        System.out.println("》》》調用BeanLifecycle對象"+this.getSex()+"屬性set方法,設值為:"+sex);
        this.sex = sex;
    }
    /**
     * 依次開始調用初始化回調方法
     */
    @PostConstruct
    public void initPostConstruct(){
        System.out.println("》》》注解初始化方法被調用");
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("》》》BeanLifecycle調用了InitailizingBean的afterPorpertiesSet方法了.....");
    }
    
    public void init (){
        System.out.println("》》》init方法被調用");
    }

    /**
     * 依次開始調用銷毀回調方法
     */
    
    @PreDestroy
    public void preDestroy(){
        System.out.println("》》》注解銷毀方法被調用");
    }
    
    @Override
    public void destroy() throws Exception {
        System.out.println("》》》BeanLifecycle從Spring IoC容器中移除了.......");
    }
    public void  close() {
        System.out.println("》》》close方法被調用");
    }

    @Override
    public void setApplicationContext(ApplicationContext paramApplicationContext)
            throws BeansException {
        System.out.print("》》》調用ApplicationContextAware接口setApplicationContext方法:");
        System.out.println(paramApplicationContext);    
        
    }

//    @Override
//    public void setResourceLoader(ResourceLoader paramResourceLoader) {
//        System.out.print("》》》調用ResourceLoaderAware接口setResourceLoader方法:");
//        System.out.println(paramResourceLoader);        
//    }

//    @Override
//    public void setImportMetadata(AnnotationMetadata paramAnnotationMetadata) {
//        System.out.println(333333);        
//    }

//    @Override
//    public void setEnvironment(Environment paramEnvironment) {
//        System.out.print("》》》調用EnvironmentAware接口setEnvironment方法:");
//        System.out.println(paramEnvironment);        
//    }

    @Override
    public void setBeanName(String paramString) {
        System.out.println("》》》調用BeanNameAware接口setBenaName方法: "+paramString);
        
    }

    @Override
    public void setBeanFactory(BeanFactory paramBeanFactory)
            throws BeansException {
        
        System.out.print("》》》調用BeanFactoryAware接口setBeanFactory方法:");
        System.out.println(paramBeanFactory);
        
    }

//    @Override
//    public void setBeanClassLoader(ClassLoader paramClassLoader) {
//        System.out.print("》》》調用BeanClassLoaderAware接口setBeanClassLoader方法:");
//        System.out.println(paramClassLoader);        
//    }

//    @Override
//    public void setApplicationEventPublisher(
//            ApplicationEventPublisher paramApplicationEventPublisher) {
//        System.out.print("》》》調用ApplicationEventPublisherAware接口setApplicationEventPublisher方法:");
//        System.out.println(paramApplicationEventPublisher);    
//    }

    @Override
    public String toString() {
        return "BeanLifecycle [name=" + name + ", sex=" + sex + "]";
    }

    
}

 

Test:

package com.test.spring;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class T {
    ClassPathXmlApplicationContext applicationcontext=null;
    @Before
    public void before() {
        System.out.println("》》》Spring ApplicationContext容器開始初始化了......");
        applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
        System.out.println("》》》Spring ApplicationContext容器初始化完畢了......");
    }
    @Test
    public void  test() {
        BeanLifecycle beanLifecycle =applicationcontext.getBean("beanLifecycle",BeanLifecycle.class);
        //applicationcontext.close();
        applicationcontext.registerShutdownHook();   
    }
}

測試結果:

》》》Spring ApplicationContext容器開始初始化了......
2017-03-19 00:08:01  INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
2017-03-19 00:08:01  INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
》》》調用BeanLifecycle對象null屬性set方法,設值為:張三
》》》調用BeanLifecycle對象null屬性set方法,設值為:男
》》》調用BeanNameAware接口setBenaName方法: beanLifecycle
》》》調用BeanFactoryAware接口setBeanFactory方法:org.springframework.beans.factory.support.DefaultListableBeanFactory@75a6bd5: defining beans [narCodeService,org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0,beanLifecycle,postProcessor]; root of factory hierarchy
》》》調用ApplicationContextAware接口setApplicationContext方法:org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
后置處理器處理bean=【beanLifecycle】開始
》》》注解初始化方法被調用
BeanLifecycle [name=張三, sex=男]
》》》BeanLifecycle調用了InitailizingBean的afterPorpertiesSet方法了.....
BeanLifecycle [name=張三, sex=男]
》》》init方法被調用
后置處理器處理bean=【beanLifecycle】完畢!
》》》Spring ApplicationContext容器初始化完畢了......
2017-03-19 00:08:03  INFO:ClassPathXmlApplicationContext-Closing org.springframework.context.support.ClassPathXmlApplicationContext@6c7e6b26: startup date [Sun Mar 19 00:08:01 CST 2017]; root of context hierarchy
》》》注解銷毀方法被調用
》》》BeanLifecycle從Spring IoC容器中移除了.......
》》》close方法被調用

 

關於Spring BeanPostProcessor(后置處理器)講解請查看:http://www.cnblogs.com/sishang/p/6576665.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM