Spring中Bean的生命周期

原创
2018/06/01 21:55
阅读数 96

一、未加入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()...

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部