zoukankan      html  css  js  c++  java
  • spring bean生命周期

    概要:



    IOC容器中Bean的生命周期

    • Spring IOC容器能够管理Bean的生命周期,Spring同意在Bean生命周期的特定点运行定制的任务
    • Spring IOC容器对Bean的生命周期进行管理的过程:
      • 通过构造器或工厂方法创建Bean实例
      • 为Bean的属性设置值和对其它Bean的引用
      • 调用Bean的初始化方法
      • Bean能够使用了
      • 当容器关闭时。调用Bean的销毁方法
    • 在Bean的声明里设置 init-method和destroy-method属性,为Bean指定初始化和销毁方法

    创建Bean后置处理器
    • Bean后置处理器同意在调用初始化方法前后对Bean进行额外的处理。
    • Bean后置处理器对IOC容器里的全部Bean实例逐一处理,而非单一实例。其典型应用是:检查Bean属性的正确性或依据特定的标准更改Bean的属性
    • 对Bean后置处理器而言,须要实现org.springframework.beans.factory.config Interface BeanPostProcessor接口,在初始化方法被调用后,Spring将把每一个Bean实例分别传递给上述接口的下面两个方法:



    加入Bean后置处理器后Bean的生命周期
    • Spring IOC容器对Bean的生命周期进行管理的过程:
      • 通过构造器或工厂方法创建Bean实例
      • 为Bean的属性设置值和对其它Bean的引用
      • 将Bean实例传递给Bean后置处理器的postProcessBeforeInitialization方法
      • 调用Bean的初始化方法
      • 将Bean实例传递给Bean后置处理器的postProcessAfterInitialization方法
      • Bean能够使用了
      • 当容器关闭时,调用Bean的销毁方法 




    实例代码具体解释
    文件夹结构:



    Car.java

    package com.coslay.beans.cycle;
    
    public class Car {
    	public Car() {
    		System.out.println("Car's constructor...");
    	}
    
    	private String brand;
    
    	public String getBrand() {
    		return brand;
    	}
    
    	public void setBrand(String brand) {
    		System.out.println("setBrand...");
    		this.brand = brand;
    	}
    
    	public void init() {
    		System.out.println("init...");
    	}
    
    	public void destroy() {
    		System.out.println("destroy...");
    	}
    
    	@Override
    	public String toString() {
    		return "Car [brand=" + brand + "]";
    	}
    
    }
    

    Main.java

    package com.coslay.beans.cycle;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Main {
    	public static void main(String[] args) {
    		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
    				"beans-cycle.xml");
    
    		Car car = (Car) ctx.getBean("car");
    		System.out.println(car);
    
    		// 关闭IOC容器
    		ctx.close();
    	}
    }
    

    MyBeanPostProcessor.java

    package com.coslay.beans.cycle;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
    	@Override
    	public Object postProcessBeforeInitialization(Object bean, String beanName)
    			throws BeansException {
    		System.out.println("postProcessBeforeInitialization:" + bean + ","
    				+ beanName);
    
    		if ("car".equals(beanName)) {
    			// ...进行过滤处理
    		}
    
    		return bean;
    	}
    
    	@Override
    	public Object postProcessAfterInitialization(Object bean, String beanName)
    			throws BeansException {
    		System.out.println("postProcessAfterInitialization:" + bean + ","
    				+ beanName);
    		Car car = new Car();
    		car.setBrand("Ford");
    		return car;
    	}
    
    }
    


    beans-cycle.xml
    <?

    xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.coslay.beans.cycle.Car" init-method="init" destroy-method="destroy"> <property name="brand" value="Audi"></property> </bean> <!-- 实现BeanPostProcessor接口,并详细提供 Object postProcessBeforeInitialization(Object bean, String beanName):init-method之前被调用 Object postProcessAfterInitialization(Object bean, String beanName):init-method之后被调用 的实现 bean:bean实例本身 beanName:IOC容器配置的bean的名字 返回值:是实际上返回给用户的那个Bean,注意:能够在以上两个方法中改动返回的bean。甚至返回一个新的bean --> <!-- 配置bean的后置处理器:不须要配置id,IOC容器自己主动识别是一个 PostProcessor--> <bean class="com.coslay.beans.cycle.MyBeanPostProcessor"></bean> </beans>





  • 相关阅读:
    为什么Java不支持多重继承
    thymeleaf生成页面时报错:An error happened during template parsing (template: "class path resource [templates/index.html]")的解决办法
    MySQL操作数据时区分大小写
    java.lang.NoClassDefFoundError: com/jhlabs/image/RippleFilter
    多线程学习系列:(六)线程池基础下
    多线程学习系列:(四)线程同步基础下
    多线程学习系列:(八)Winform中多线程编程基础上
    多线程学习系列:(五)线程池基础上
    多线程学习系列:(七)基于多线程的基本组件
    HTTP头部
  • 原文地址:https://www.cnblogs.com/llguanli/p/7116838.html
Copyright © 2011-2022 走看看