Spring中Bean的生命週期

一、未加入BeanPostProcessor前的生命週期

二、加入BeanPostProcessor生命週期後的生命週期

三、代碼說明

    1、applicationContext.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 id="car" class="com.lh.bean_cycle.bean.Car" init-method="init" destroy-method="destroy">
		<property name="brand" value="Audi"></property>
	</bean>
	
	<!-- 
		1、實現BeanPostProcessor接口,並具體提供
		Object postProcessBeforeInitialization(Object bean, String beanName):init-method方法前調用
		Object postProcessAfterInitialization(Object bean, String beanName):init-method方法後調用
		的實現。
		
		bean:實例本身
		beanName:IOC容器配置的bean的名字
		返回值:實際上返回給用戶的bean,注:可以在以上兩個方法中修改返回的bean,甚至返回一個新的bean(偷樑換柱)
	
		無需指定id
	 -->
	<bean class="com.lh.bean_cycle.config.MyBeanPostProcessor"/>
</beans>

    2、MyBeanPostProcessor.java

package com.lh.bean_cycle.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import com.lh.bean_cycle.bean.Car;

/** 
* @ClassName: MyBeanPostProcessor 
* @Description: TODO
* @author Liu 
* @date 2018年6月1日 下午9:34:16 
*/
public class MyBeanPostProcessor implements BeanPostProcessor {

	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("----------------postProcessBeforeInitialization--------------" + bean + "," + beanName);
		return bean;
	}

	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("----------------postProcessAfterInitialization--------------" + bean + "," + beanName);
		if(bean instanceof Car) {
			return new Car("Ford");
		}
		return bean;
	}

}

    3、Car.java

package com.lh.bean_cycle.bean;

/**
 * @ClassName: Car
 * @Description: Car定義
 * @author Liu
 * @date 2018年6月1日 下午9:22:17
 */
public class Car {
	private String brand;

	public Car() {
		System.out.println("Car's constructor...");
	}

	public Car(String brand) {
		this.brand = brand;
	}

	public void setBrand(String brand) {
		System.out.println("Car's setBrand()...");
		this.brand = brand;
	}

	@Override
	public String toString() {
		return "Car [brand=" + brand + "]";
	}

	// bean的初始化方法
	public void init() {
		System.out.println("Car's init()...");
	}

	// bean的銷燬方法
	public void destroy() {
		System.out.println("Car's destroy()...");
	}

}

    4、輸出結果

package com.lh.bean_cycle;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lh.bean_cycle.bean.Car;

/** 
* @ClassName: Main 
* @Description: TODO
* @author Liu 
* @date 2018年6月1日 下午9:30:37 
*/
public class Main {

	public static void main(String[] args) {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		System.out.println(ctx.getBean(Car.class));
		
		ctx.close();
	}

}
Car's constructor...
Car's setBrand()...
----------------postProcessBeforeInitialization--------------Car [brand=Audi],car
Car's init()...
----------------postProcessAfterInitialization--------------Car [brand=Audi],car
Car [brand=Ford]
Car's destroy()...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章