Sping中bean的生命周期!(超级容易理解的实例)
1.普通情况
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 调用 Bean 的初始化方法
- Bean 可以使用了
- 当容器关闭时, 调用 Bean 的销毁方法
例子:
1).
package com.coship.spring.beanlifecycle;
public class Car {
private String brand;
public Car() {
System.out.println("Cars constructor....");
}
public void setBrand(String brand){
System.out.println("brand setter....");
this.brand=brand;
}
public void init(){
System.out.println("init....");
}
public void destory(){
System.out.println("destory....");
}
@Override
public String toString() {
return "Car []";
}
public String getBrand() {
return brand;
}
}
2 ).
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--bean的生命周期
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法-->
<bean id="car" class="com.coship.spring.beanlifecycle.Car" init-method="init" destroy-method="destory">
<property name="brand" value="Benz"></property>
</bean>
</beans>
3).
package com.coship.spring.beanlifecycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanLifeCycleMain {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-lifecycle.xml");
Car car = ctx.getBean(Car.class);
((AbstractApplicationContext) ctx).close();
}
}
运行结果:
bean的生命周期
Cars constructor....
brand setter....
init....
destory....
2.引入bean的前置管理器与后置管理器
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
1.通过构造器或工厂方法创建 Bean 实例
2.为 Bean 的属性设置值和对其他 Bean 的引用
3.将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
4.调用 Bean 的初始化方法
5.将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
6.Bean 可以使用了
7.当容器关闭时, 调用 Bean 的销毁方法
实例:
1).
package com.coship.spring.beanlifecycle;
public class Car {
private String brand;
public Car() {
System.out.println("Cars constructor....");
}
public void setBrand(String brand){
System.out.println("brand setter....");
this.brand=brand;
}
public void init(){
System.out.println("init....");
}
public void destory(){
System.out.println("destory....");
}
@Override
public String toString() {
return "Car []";
}
public String getBrand() {
return brand;
}
}
2).
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--bean的生命周期 -->
<bean id="car" class="com.coship.spring.beanlifecycle.Car" init-method="init" destroy-method="destory">
<property name="brand" value="Benz"></property>
</bean>
<!--
实现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 ioc容器会自动扫描识别-->
<bean class="com.coship.spring.beanlifecycle.MyBeanProcessor"></bean>
</beans>
3.
package com.coship.spring.beanlifecycle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanProcessor implements BeanPostProcessor {
//bean的后置处理器
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessAfterInitialization..."+">>>"+ bean + ">>>"+beanName);
return bean;
}
//bean的前置处理器
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization..."+">>>"+ bean + ">>>"+beanName);
Car car = (Car) bean;
car.setBrand("Audi");
return bean;
}
}
4.
package com.coship.spring.beanlifecycle;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanLifeCycleMain {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-lifecycle.xml");
Car car = ctx.getBean(Car.class);
((AbstractApplicationContext) ctx).close();
/**
*bean的生命周期
*Cars constructor....
*brand setter....
*init....
*destory....
*在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法
*/
System.out.println(car.getBrand());
}
}
运行结果:
Cars constructor....
brand setter....
postProcessBeforeInitialization...>>>Car []>>>car
brand setter....
init....
postProcessAfterInitialization...>>>Car []>>>car
destory....
Audi
划重点:
实现BeanPostProcessor接口并对里面两个方法进行实现
Object postProcessBeforeInitialization(Object bean, String beanName)(init-method之前被调用)
Object postProcessAfterInitialization(Object bean, String beanName)(init-method之后被调用)
参数:bean
beanName
返回值:实际在Ioc容器中的bean 所以可以修改bean的属性 甚至返回一个新的bean
版权声明:本文为zhaoliubao1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。