前置
反射:程序运行状态时,能动态创建对象,操作对象(方法、属性)
Spring 架构设计思想
Spring创建对象过程:首先通过 BeanDefinationReader 接口将我们在profiles、annotation或者其他文件中的内容注入到Spring容器的bean信息中,在创建对象之前,先配置Spring的运行环境,然后通过 BeanFactory 创建实例对象。为了提高扩展性,我们希望在 BeanFactory 之前和之后能进行一些操作,因此抽象出来了 BeanFactoryPostProcessor 接口。同样的,在 BeanFactory 创建对象之前和之后也希望能对对象进行一些操作,因此抽象出 BeanPostProcessor 接口。很明显,这里是观察者设计模式的思想。
以上便是Spring的整体设计思想。本质上就是在抽接口,体现了高扩展性,高内聚、低耦合的软件设计理念。
BeanFactory && FactoryBean 的区别
BeanFactory是生产bean的工厂,FactoryBean是BeanFactory生产的一个对象
当我们想要自己操作对象的时候,例如通过 getObject() 反射获取对象并进行其他操作的时候,就可以使用FactoryBean
并且由于FactoryBean是BeanFactory生产的对象,那么也可以使用BeanFactory生产的对象的特有方法
IOC / AOP 实现原理以及在Spring中的具体实现
- IOC / DI:控制反转 / 依赖注入,即原先由new创建对象,或者通过工厂模式创建对象以及管理对象的这些事交给spring完成
实现原理:反射 - AOP:面向切面编程,即将与业务无关的重复性代码封装成一个模块
实现原理:动态代理 - 具体实现:BeanPostProcessor 进行运行期增强
IOC与AOP的主要目的都是为了降低耦合度,提高扩展性
Spring 生命周期
这是在Spring源码中BeanFactory接口中的一段注释,已经写的很明白了
这里简单总结下,方便大家记忆:
- 经历一些xxxAware接口,把需要的spring组件通过 setXXX() 注入到bean
- 然后经过BeanPostProcessor,执行postProcessBeforeInitialization()
- 用户自定义 init-method
- 执行postProcessAfterInitialization()
- DisposableBean的 destroy()
- 用户自定义 destroy-method
可以看到,无非就是在初始化前做点事,初始化后做点事;先Spring做事,后用户做事