索引
1.IoC(单例模式,工厂模式)
容器级别的类:
Resource:xml等配置文件的通用表示类,对IoC容器来说,资源对象只有一种,就是Resource
ResourceLoader:将xml等配置文件转换为Resource对象,方便后续进行配置信息读取
BeanDefinition:配置文件中配置的bean的信息对应的一个个对象。
BeanDefinitionReader:从Resource中读取信息,映射为BeanDefinition对象。
BeanDefinitionRegistry:一个大Map,用于装BeanDefinition。
BeanFactory:从BeanDefinitionRegistry获取BeanDefinition的信息,采用对应的InstantiationStrategy(实例化策略)去生成对应的Bean实例。
InstantiationStrategy:实例化策略,如Cglib,即采用何种方式实例化Bean。
BeanFactoryPostProcessor(所有Bean受影响):在有了BeanFactory,但还没有开始实例化Bean的时候,调用该接口的postProcessBeanFactory
方法,可以用于处理BeanDefinition的信息。
BeanWrapper:用于将实例化后的Bean的各种内部属性给配置好(未初始化)。如,一个Bean中有一个Integer的属性a,则需要BeanWrapper先生成一个bean.a=0,这样的属性值。若之后该值有对应的数值,如5,则在Bean的初始化中进行。和BeanWrapper相关的类还涉及到了PropertyEditor,BeanInfo,PropertyDescriptor等类,暂不展开。
BeanPostProcessor(所有Bean受影响):BeanWrapper修饰好Bean后,会交由该类进行自定义再修饰。postProcessBeforeInitialization
方法先执行,然后执行Bean本身的初始化方法,然后执行postProcessAfterInitialization
方法。
Bean级别的类:
InitializingBean(实现的Bean受影响):在Bean本身初始化之前,若Bean实现了该接口的afterPropertiesSet
方法,则会先执行该方法,再初始化(进行赋值等操作)。若Bean还实现了@PostConstruct,则在afterPropertiesSet
方法后,执行@PostConstruct注解标注的方法
2.容器事件(观察者模式)
要搭建事件模型,就需要注册表,事件,广播器,监听器4种元素。即监听器注册到注册表中,用广播器产生事件,在注册表中找到对应事件的监听器,调用监听器相关方法,处理该事件。
Spring中,ApplicationContext接口的抽象实现类中就有一个广播器ApplicationEventMulticaster,所以,我们可以采用获取ApplicationContext的方式来发布事件,只要提前实现好对应的监听器接口GenericApplicationListener(其他的也可以,具体的可以看继承关系),然后定义好事件(实现ApplicationEvent接口)就可以了。
3.AOP(代理模式)
Aspect Oriented Programing,面向切面编程。Java的类继承机制用于了对纵向代码结构的抽象,但是对于横向的每个方法中都有的非业务代码,却不能很好的进行抽象。因此有人提出了采用AOP的方式,将后者进行抽象。对于java来说,AOP的方案可以从3个方面入手:
- 编译阶段
- 类加载阶段
- 程序运行期间
Spring对AOP的实现
Spring主要是从 3.程序运行期 进行AOP的。Spring的AOP的粒度是方法级别的,其对应方案有两种,一种是基于JDK的动态代理的AOP,一种是基于CGLib方法拦截的AOP。后者可以完成方法代理范围比JDK的要广。
基于JDK动态代理的AOP
JDK本身提供了Proxy
类和InvocationHandler
这两个类进行接口方法的代理,其具体操作就是利用InvocationHandler
实现想要代理的接口方法,然后在Proxy
中传入InvocationHandler
实例和需要代理的接口,