zoukankan      html  css  js  c++  java
  • 管理Bean的生命周期

    【IOC容器中Bean的生命周期方法】

    1.SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。

    2.Spring IOC容器对Bean的生命周期进行管理的过程:

    --通过构造器或工厂方法创建Bean实例

    --为Bean的属性设置值和对其他Bean的引用

    --调用Bean的初始化方法

    --Bean可以使用了

    --当容器关闭时,调用Bean的销毁方法

    3.在Bean的声明里设置init-method和destroy-method属性,为Bean指定初始化和销毁方法。

    【示例】

    beans-cycle.xml:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5         http://www.springframework.org/schema/beans/spring-beans.xsd">
     6 
     7     <bean id="car" class="com.hk.beans.cycle.Car"
     8           init-method="init"
     9           destroy-method="destroy">
    10        <property name="brand" value="Audi"></property>
    11     </bean>
    12 </beans>

    /spring-1/src/com/hk/beans/cycle/Car.java:

     1 package com.hk.beans.cycle;
     2 
     3 public class Car {
     4     Car() {
     5         System.out.println("Car's Constructor...");
     6     }
     7 
     8     private String brand;
     9     public void setBrand(String brand) {
    10         System.out.println("setBrand...");
    11         this.brand = brand;
    12     }
    13     
    14     public void init(){
    15         System.out.println("init.....");
    16     }
    17     
    18     public void destroy(){
    19         System.out.println("destroy......");
    20     }
    21 }

    /spring-1/src/com/hk/beans/cycle/Main.java:

     1 package com.hk.beans.cycle;
     2 
     3 import org.springframework.context.ApplicationContext;
     4 import org.springframework.context.support.ClassPathXmlApplicationContext;
     5 
     6 public class Main {
     7     public static void main(String[] args) {
     8         ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
     9         Car car = (Car) ctx.getBean("car");
    10         System.out.println(car);
    11         
    12         //关闭IOC容器
    13         ctx.close();
    14     }
    15 }

    运行结果:

    注:通过结果可知Spring IOC容器对Bean的生命周期进行管理的过程和上述一致。

    【创建Bean后置处理器】

    1.Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理

    2.Bean后置处理器对IOC容器里的所有Bean实例逐一处理,而非单一实例。其典型应用是:检查Bean属性的正确性或根据特定的标准更改Bean的属性。

    3.对Bean后置处理器而言,需要实现Interface BeanPOSTProcessor接口。在初始化方法被调用前后,Spring将把每个Bean实例分别传递给上述接口的以下两个方法:

    -postProcessAfterInitialization(Object bean,String beanName)

    -postProcessBeforeInitialization(Object bean,String beanName)

    【添加Bean后置处理器后Bean的生命周期】

    Spring IOC容器对Bean的生命周期进行管理的过程:

    --通过构造器或工厂方法创建Bean实例

    --为Bean的属性设置值和对其他Bean的引用

    --将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法

    --调用Bean的初始化方法

    --将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法

    --Bean可以使用了

    --当容器关闭时,调用Bean的销毁方法

    配置文件beans-cycle.xml:

    1     <!-- 配置bean的后置处理器  -->
    2     <bean class="com.hk.beans.cycle.MyBeanPostProcessor"></bean>

    /spring-1/src/com/hk/beans/cycle/MyBeanPostProcessor.java:

     1 package com.hk.beans.cycle;
     2 
     3 import org.springframework.beans.BeansException;
     4 import org.springframework.beans.factory.config.BeanPostProcessor;
     5 
     6 public class MyBeanPostProcessor implements BeanPostProcessor{
     7 
     8     @Override
     9     public Object postProcessAfterInitialization(Object bean, String beanName)
    10             throws BeansException {
    11         System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
    12         return bean;
    13     }
    14 
    15     @Override
    16     public Object postProcessBeforeInitialization(Object bean, String beanName)
    17             throws BeansException {
    18         System.out.println("postProcessBeforeInitialization:"+ bean + "," + beanName);
    19         return bean;
    20     }
    21 }

    运行结果:

    应用:

    首先确定配置文件中value="Audi":

    1     <bean id="car" class="com.hk.beans.cycle.Car"
    2           init-method="init"
    3           destroy-method="destroy">
    4        <property name="brand" value="Audi"></property>
    5     </bean>

    在MyBeanPostProcessor.java中改变postProcessAfterInitialization中的代码:

    1     public Object postProcessAfterInitialization(Object bean, String beanName)
    2             throws BeansException {
    3         System.out.println("postProcessAfterInitialization:"+ bean + "," + beanName);
    4         Car car = new Car();
    5         car.setBrand("Ford");
    6         return car;
    7     }

    运行结果:

    【小结】

    实现BeanPostProcessor接口,并具体提供两个方法的实现:
    Object postProcessAfterInitialization(Object bean, String beanName):init-method之前被调用
    Object postProcessBeforeInitialization(Object bean, String beanName):init-method之后被调用

    参数:
    bean:bean实例的本身
    beanName:IOC容器中配置bean的名字
    返回值:是实际上返回给用户的那个bean,注意:可以在以上两个方法中修改返回的bean,甚至返回一个新的bean.

    配置bean的后置处理器 :不需要id,IOC容器自动识别是一个BeanPostProcessor

    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    「Codeforces 79D」Password
    「算法笔记」BSGS
    「Codeforces 468C」Hack it!
    「算法笔记」快速傅里叶变换(FFT)
    「算法笔记」2-SAT 问题
    「算法笔记」基础数论 2
    《算法笔记》二分—木棒切割问题&求凸多边形外接圆最大半径
    《算法笔记》区间贪心
    《算法笔记》PAT B1020 月饼、PAT B1023 组个最小数
    《算法笔记》n皇后问题
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9628706.html
Copyright © 2011-2022 走看看