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

Spring之Bean的生命周期

web nec connector start jasper dep oca cep table

---恢復內容開始---

Spring中關於Bean的生命周期,我總結的大致過程如下:

1、用戶調用BeanFactory接口的getBean()方法請求一個Bean時,如果容器註冊了InstantiationAwareBeanPostProcessor接口則調用postProcessorBeforeInstantiation()方法,這個過程在實例化Bean之前進行。

2、調用該請求Bean的構造函數進行實例化。

3、如果容器註冊了InstantiationAwareBeanPostProcessor接口則調用postProcessorAfterInstantiation()方法,這個過程在實例化Bean之後進行。

4、如果配置信息裏有<property>調用InstantiationAwareBeanPostProcessor接口下的PostPropertyValues()方法。

5、調用該請求Bean的set方法設置屬性值。

6、如果該Bean實現了BeanNameAware接口則調用setBeanName()方法,設置bean名稱。

7、如果該Bean實現了BeanFactoryAware接口則調用setBeanFactory()方法,設置BeanFactory容器。

8、如果容器註冊了BeanPostProcessor後處理器接口則調用 Object postProcessorBeforeInitialization(Object bean,String beanName)方法,其中bean為當前正在處理的bean,beanName為當前Bean的配置名,返回對象為處理後的bean。

9、如果該 bean實現了InitializingBean接口則調用afterPropertiesSet()方法。

10、如果在<bean init-method="myInit">中定義了init-method屬性則執行該方法。

11、如果容器註冊了BeanPostProcessor後處理器接口則調用Object postProcessorAfterInitialization(Object bean,String beanName)。

12、如果指定作用域<bean scope="prototype">則將bean返回給調用者,調用者負責該bean的後續管理,如果指定作用域<bean scope="singleton">則將bean放入IOC緩沖池,並將bean返回給調用者,由Spring容器繼續管理該bean。

Spring中Bean生命周期的實例:

1、新建一個maven項目,pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.smart</groupId>
  <artifactId>chapter3</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <useSystemClassLoader>false</useSystemClassLoader>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2、結構如下紅色標記內容:

技術分享圖片

3、Car.java類:

package com.smart.beanfactory;

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;

public class Car implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {

    private String brand;
    
    private String color;
    
    private int maxSpeed;
    
    private BeanFactory beanFactory;
    
    private String beanName;
    
    public Car() {
        // TODO Auto-generated constructor stub
        System.out.println("調用Car()構造函數....");
    }
    
    public void setBrand(String brand) {
        
        System.out.println("調用setBrand()方法設置屬性....");
        
        this.brand = brand;
    }
    
    public void introduce() {
        
        System.out.println("brand:"+brand+",color:"+color+",maxSpeed:"+maxSpeed);
    }
    
    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        
        System.out.println("調用setMaxSpeed()方法設置屬性....");
        
        this.maxSpeed = maxSpeed;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        
        System.out.println("調用setColor()方法設置屬性....");
        
        this.color = color;
    }

    @Override
    public void destroy() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("調用DisposableBean下的destroy()方法....");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("調用InitializingBean下的afterPropertiesSet()方法....");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("調用BeanFactoryAware下的setBeanFactory()方法....");
        
        this.beanFactory = beanFactory;
    }

    @Override
    public void setBeanName(String beanName) {
        // TODO Auto-generated method stub
        System.out.println("調用BeanNameAware下的setBeanName()方法....");
        
        this.beanName = beanName;
    }
    
    public void myInit() {
        
        System.out.println("調用<bean init-method=‘myInit‘>方法,將maxSpeed設置為240....");
        
        this.maxSpeed = 240;
    }
    
    public void myDestroy() {
        
        System.out.println("調用<bean destroy-method=‘myDestroy‘>....");
    }

}

4、MyInstantiationAwareBeanPostProcessor.java類:

package com.smart.beanfactory;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;

public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if(beanName.equals("car")) {
            
            Car car = (Car)bean;
            
            if(car.getMaxSpeed() >= 200) {
                
                System.out.println("調用InstantiationAwareBeanPostProcessorAdapter中的postProcessAfterInitialization()方法...");
                
                car.setMaxSpeed(200);
            }
        }
        
        return bean;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if(beanName.equals("car")) {
            
            System.out.println("在實例化Bean之後調用postProcessorAfterInstantiation()方法....");
        }
        
        return true;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if(beanName.equals("car")) {
            
            Car car= (Car)bean;
            
            if(car.getColor() == null) {
                
                System.out.println("調用InstantiationAwareBeanPostProcessorAdapter中的postProcessorInitialization()方法....");
                
                car.setColor("黑色");
            }
        }
        
        return bean;
    }

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if(beanName.equals("car")) {
            
            System.out.println("實例化bean之前調用postProcessorBeforeInstantiation()方法...");
        }
        
        return null;
    }

    @Override
    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
            String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if(beanName.equals("car")) {
            
            System.out.println("如果配置信息裏設置了屬性則調用postPropertyValues()方法....");
        }
        
        return pvs;
    }

    
}

5、BeanLifeCycle.java類:

package com.smart.beanfactory;

import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class BeanLifeCycle {

    private static void lifeCycleBeanFactory() {
        
        Resource res = new ClassPathResource("bean.xml");
        
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        
        reader.loadBeanDefinitions(res);
        
        beanFactory.addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());
        
        Car car1 = (Car) beanFactory.getBean("car");
        
        car1.introduce();
        
        car1.setColor("紅色");
        
        Car car2 = (Car) beanFactory.getBean("car");
        
        System.out.println("car1==car2:"+(car1==car2));
        
        beanFactory.destroySingletons();
        
    }
    
    public static void main(String[] args) {
        
        lifeCycleBeanFactory();
    }
}

6、bean.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" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-4.0.xsd
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
       
       
    <bean id="car" class="com.smart.beanfactory.Car" init-method="myInit" destroy-method="myDestroy">
        <property name="brand" value="紅旗CA72"/>
        <property name="maxSpeed" value="200"/>
    </bean>
</beans>

7、運行結果:

技術分享圖片

Spring之Bean的生命周期