Spring之Bean的生命周期
---恢復內容開始---
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的生命周期