浅谈spring——Bean的生命周期(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aalansehaiyang52/article/details/8656942

spring通过配置文件描述bean与bean之间的依赖关系,利用java的反射机制来实例化bean并建立bean之间的依赖关系。

其中BeanFactory是spring框架最核心的接口,管理不同类型的java对象,面对spring本身。

ApplicationContext建立在BeanFactory的基础之上,提供面向应用的功能,称为应用上下文,面向使用spring框架的开发者。

注:两者有一个很大的不同,后者会利用java反射机制自动识别配置文件定义的BeanPostProcessor、InstantiationAwareBeanPostProcessor,并自动注册到应用上下文中;而前者则要在代码中通过手动调用addBeanPostProcessor()方法进行注册。正因为如此,我们在应用开发时,普遍使用ApplicationContext.


反射会用到几个重要的类,分别是ClassLoader,Class,Constructor,Method,Field,这些类协助就可以间接的调用目标类的各项功能了。

可参考文章:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html,里面介绍反射各种案例,还是挺全面的

类装载器由ClassLoader及其子类负责,是一个重要的java运行时系统组件,它负责在运行时查找和装载Class字节码文件。步骤:

1. 装载:查找并导入字节码文件

2. 链接

    校验:检查字节码文件的正确性

    准备:为静态变量分配存储空间

    解析:将符号引用转变成直接引用

3. 初始化:对静态变量、静态代码块执行初始化工作


其中类加载器有三种:根装载器、ExtClassLoader(扩展类装载器),AppClassLoader(系统类装载器),其中根装载器是用C++编写的,其它两个是java编写的。根装载器负责加载JRE核心类库,ExtClassLoader负责加载ext目录下的jar包;AppClassLoader负责加载Classpath路径下的jar包。

例子:

public static void main(String[] args) {
	ClassLoader loader = Thread.currentThread().getContextClassLoader();
	System.out.println("current loader:"+loader);
	System.out.println("parent loader:"+loader.getParent());
	System.out.println("grandparent loader:"+loader.getParent().getParent());
}



ApplicationContext类继承体系类图



ApplicationContext的主要实现类有两个:ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者从类路径加载配置文件,后者是从文件系统加载配置文件。

ApplicationEventPublish:让容器发布应用上下文事件功能,包括容器启动事件,关闭事件等

MessageSource:为应用提供i18n国际化消息访问功能

ResourceLoader:装载资源

LifeCycle:spring2.0引入的,有start和stop两个方法,控制异步处理过程

HierarchicalBeanFactory:使用容器可以建立父子层级关联容器,子容器可以访问父容器中的Bean,而父容器不能访问子容器的Bean。可以应用在Spring MVC,表现层的Bean存于子容器中,业务层和持久层的Bean存于父容器中。


Bean的生命周期:


涉及的关键点大致划分为三类:

1) Bean自身的方法:如调用Bean构造函数实例化Bean,调用setter属性设置Bean属性值及通过<bean>的init-method和destory-method所指定的方法

2) Bean级生命周期接口方法:如BeanNameAware,BeanFactoryAware,initializingBean以及DisposableBean,这些接口由直接实现

3) InstantiationAwareBeanPostProcessor和BeanPostProcessor这两个接口,一般称为它们的实现类为“后处理器”。后处理器一般不由bean本身实现,

它们独立于Bean,实现类以附加形式注册到Spring容器中,可以理解为bean的过滤器。当Spring创建任何Bean的时候,这些后处理器就会发挥作

用,其影响范围具有全局性。开发者可以通过编写后处理器,对感兴趣的Bean加工处理(instanceof 匹配类型)

注:通过init-method和destory-method属性配置的方法为Bean指定初始化和销毁的方法,另一种通过实现initializingBean和DisposableBean接口,两者的效果是一样的。但是前者采用配置的方式,使用bean不需要和特定的spring框架接口绑定,达到和框架解耦的目地。


BeanPostProcessor的使用例子:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

import com.baobaotao.Car;

public class MyBeanPostProcessor implements BeanPostProcessor{

	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {		
		if(beanName.equals("car")){
			Car car = (Car)bean;
			if(car.getMaxSpeed() >= 200){
				System.out.println("调用MyBeanPostProcessor.postProcessAfterInitialization(),将maxSpeed调整为200。");
				car.setMaxSpeed(200);
			}
		}
		return bean;

	}

	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {		
		if(beanName.equals("car")){
			Car car = (Car)bean;
			if(car.getColor() == null){
				System.out.println("调用MyBeanPostProcessor.postProcessBeforeInitialization(),color为空,设置为默认黑色。");
				car.setColor("黑色");
			}
		}
		return bean;
	}
}



猜你喜欢

转载自blog.csdn.net/aalansehaiyang52/article/details/8656942