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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>