• 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的生命周期,执行过程。

  • 相关阅读:
    [POJ2104]K-th Number(区间第k值 记录初始状态)
    [POJ2007]Scrambled Polygon(计算几何 极角排序)
    [POJ1269]Intersecting Lines (计算几何)
    [POJ2318]TOYS (计算几何 行列式(叉乘)+二分)
    [HDOJ1394]Minimum Inversion Number(线段树,逆序数)
    Codeforces Round #319 (Div. 2) C. Vasya and Petya's Game 数学题
    BZOJ 1934 [Shoi2007]Vote 善意的投票 最小割
    BZOJ 1055 区间DP
    HDU4267 树状数组 不连续区间修改(三维)
    HDU 3308 线段树单点更新+区间查找最长连续子序列
  • 原文地址:https://www.cnblogs.com/falcon-fei/p/5437170.html
Copyright © 2020-2023  润新知