zoukankan      html  css  js  c++  java
  • spring框架学习笔记(八)

    bean的生命周期

    在配置bean的时候指定 bean的初始化方法和析构函数。

    下面的例子展示了从Ioc容器创建到创建bean实例到Ioc容器销毁的过程。

    配置文件如下:

    	<bean id="flowerBean2" class="com.pfSoft.spel.Flower" init-method="testInitFun" destroy-method="testDestory">
    		<property name="flowerName" value="rose"></property>
    		<property name="color" value="red"></property>
    		<property name="price" value="20"></property>
    	</bean>
    

     将原实体类改写,在构造函数、属性赋值、中增加out输出,方便查看先后顺序,并新增init和destory方法:

    public class Flower {
    	
    	private String flowerName;
    	
    	private Double price;
    	/**
    	 * 
    	 * @return the flowerName
    	 */
    	public String getFlowerName() {
    		return flowerName;
    	}
    	/**
    	 * @param flowerName the flowerName to set
    	 */
    	public void setFlowerName(String flowerName) {
    		System.out.println("这里执行属性的set方法,setFlowName");
    		this.flowerName = flowerName;
    	}
    	private String color;
    	/**
    	 * 
    	 * @return the color
    	 */
    	public String getColor() {
    		return color;
    	}
    	/**
    	 * @param color the color to set
    	 */
    	public void setColor(String color) {
    		System.out.println("这里执行属性的set方法,setcolor");
    		this.color = color;
    	}
    	
    	
    	/**
    	 * 
    	 * @return the price
    	 */
    	public Double getPrice() {
    		return price;
    	}
    	/**
    	 * @param price the price to set
    	 */
    	public void setPrice(Double price) {
    		this.price = price;
    	}
    	/* (non-Javadoc)
    	 * @see java.lang.Object#toString()
    	 */
    	@Override
    	public String toString() {
    		return "Flower [flowerName=" + flowerName + ", price=" + price
    				+ ", color=" + color + "]";
    	}
    
    	private Flower(){
    		System.out.println("这里执行构造函数");
    	}
    	
    	private void testInitFun() {
    		System.out.println("这里执行初始化方法");
    	}
    	private void testDestory() {
    		System.out.println("这里执行destory方法");
    	}
    	
    }
    

     测试代码如下:

    ApplicationContext applicationContext;
    
    	@Before
    	public void init() {
    
    		applicationContext = new ClassPathXmlApplicationContext(
    				"spring-SpEL.xml");
    	}
    
    	@Test
    	public void testFlower() {
    		Flower flower = (Flower) applicationContext.getBean("flowerBean2");
    		System.out.println(flower);
    	}
    
    	@After
    	public void after() {
    		ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
    		context.close();
    	}
    

     输出结果为:

    这里执行构造函数
    这里执行属性的set方法,setFlowName
    这里执行属性的set方法,setcolor
    这里执行初始化方法
    Flower [flowerName=rose, price=20.0, color=red]
    四月 26, 2016 10:19:33 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
    信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Tue Apr 26 22:19:33 CST 2016]; root of context hierarchy
    这里执行destory方法
    

    由此可见执行先后顺序为   bean的构造函数——》set方法——》配置bean时指定的init-method方法——》销毁时,bean中配置指定的destroy-method方法

    创建bean后置处理器

    需要实现BeanPostProcessor接口,并且这个处理器是针对所有bean的。

     配置文件如下:

    	<bean id="flowerBean" class="com.pfSoft.spel.Flower" init-method="testInitFun" destroy-method="testDestory">
    		<property name="flowerName" value="rose"></property>
    		<property name="color" value="red"></property>
    		<property name="price" value="20"></property>
    	</bean>
    	
    	<bean class="com.pfSoft.spel.MyBeanProcess"></bean>
    

    Processor代码如下,在这里可以对实例化bean之前进行修改,返回的bean将是这里修改后的:

    public Object postProcessBeforeInitialization(Object bean, String beanName)
    			throws BeansException {
    
    		return bean;
    	}
    
    	public Object postProcessAfterInitialization(Object bean, String beanName)
    			throws BeansException {
    		System.out.println("执行BeforeInitialization");
    		System.out.println(MessageFormat.format("修改前的bean为:{0}", bean));
    		if("flowerBean".equals(beanName))
    		{
    			System.out.println("开始修改值");
    			 Flower flower= (Flower) bean;
    			 flower.setColor("白色");
    		}
    		System.out.println(MessageFormat.format("修改后的bean为:{0}", bean));
    		return bean;
    	}
    

    测试代码如下:

    @Before
    	public void init() {
    
    		applicationContext = new ClassPathXmlApplicationContext("spring-SpEL.xml");
    	}
    
    	@Test
    	public void testFlower() {
    		com.pfSoft.spel.Flower flower = (Flower) applicationContext.getBean("flowerBean");
    		System.out.println(MessageFormat.format("测试输出flower:{0}", flower) );
    	}
    
    	@After
    	public void after() {
    		ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
    		context.close();
    	}
    

     测试输出如下:

    这里执行构造函数
    这里执行属性的set方法,setFlowName
    这里执行属性的set方法,setcolor
    这里执行初始化方法
    执行BeforeInitialization
    修改前的bean为:Flower [flowerName=rose, price=20.0, color=red]
    开始修改值
    这里执行属性的set方法,setcolor
    修改后的bean为:Flower [flowerName=rose, price=20.0, color=白色]
    测试输出flower:Flower [flowerName=rose, price=20.0, color=白色]
    四月 28, 2016 4:35:35 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
    信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Thu Apr 28 16:35:34 CST 2016]; root of context hierarchy
    这里执行destory方法
    

     由上可以看出bean的生命周期,执行过程。

  • 相关阅读:
    WPF Window对象的生命周期
    MVC 控制器中传递dynamic(对象) 给视图
    MVC 获取路由的 URL 参数值和默认值的集合。
    mvc路由配置.html结尾的伪静态
    javascript 模拟按键点击提交
    微信小程序调用接口返回数据或提交数据
    清理电脑文件夹中的Thumbs.db文件
    asp.net动态增加服务器端控件并提交表单
    c# asp.net 实现分页(pager)功能
    注册时发短信如何防止别人恶意调用短信接口
  • 原文地址:https://www.cnblogs.com/falcon-fei/p/5437170.html
Copyright © 2011-2022 走看看