Spring
IOC
BeanFactory 低级容器 定义了一些容器的基础行为
ApplicationContext 高级容器
ApplicationContext 为什么说是高级容器:它除了继承Bean Factory还继承了很多其他的接口,Listablexxxxxxx(可以获取beanname的list:xml 配置的那些 beanid),resourcexxxxx(加载一些资源),configurationxxxxx(加载配置文件之类的)…还有一堆其他的.
FactoryBean:这个是一个接口(理解成类也行),其中有三个方法,第一个可以生成对象,并将对象放入bean工厂。第二个方法,第三个是判断作用域是否单例。
BeanPostProcesser:bean的后置处理器
BeanFactoryPostProcesser:bean工厂的后置处理器
区别和作用看下图:
SpringIOC的源码部分:
源码中自己建一个module,获取bean:DemoTest类,debug查看调用栈
DemoTest的构造器调用栈:abstractApplicationContext的refresh方法的finishBeanFactoryInitialization方法
DemoTest的init方法调用栈:abstractApplicationContext的refresh方法的finishBeanFactoryInitialization方法
BeanPostProcesser后置处理器的构造器初始化调用栈:abstractApplicationContext的refresh方法的registerBeanPostProcessors
BeanPostProcesser后置处理器的before调用栈:abstractApplicationContext的refresh方法的finishBeanFactoryInitialization
BeanPostProcesser后置处理器的after调用栈:abstractApplicationContext的refresh方法的finishBeanFactoryInitialization
BeanFactoryPostProcesser后置处理器的构造器初始化调用栈:abstractApplicationContext的refresh方法的invokeBeanFactoryPostProcessorsinvokeBeanFactoryPostProcessors
BeanFactoryPostProcesser后置处理器方法调用调用栈:abstractApplicationContext的refresh方法的invokeBeanFactoryPostProcessorsinvokeBeanFactoryPostProcessors
反正就是集中在 abstractApplicationContext的refresh方法
看下源码的大概步骤:
---------------------------------------refresh方法开始-----------------------------------------------
-
第一步prepare一样,不重要,预处理环境之类的吧
-
第2步就是获取bean工厂,默认实现类是 DefaultListableBeanFactory
-
…
-
一堆环境之类的准备工作
-
…
-
实例调用实现了BeanFactoryPostProcessor的类
-
实例注册那个BeanPostProcessor
-
…
-
初始化之类的
-
注册监听之类的
-
…
-
这步就是调用finishBeanFactoryInitialization方法啦~~~初始化所有非懒加载单例bean
-
完成context容器刷新
---------------------------------------refresh方法结束-----------------------------------------------
bean的初始化流程
---------------------------------------finishBeanFactoryInitialization方法开始-----------------------------------------------
进入finishBeanFactoryInitialization方法:
1.最后一行beanFactory.preInstantiateSingletons() //立即初始化所有单例非懒加载bean
2.进入preInstantiateSingletons()方法(注意:这里进入的是DefaultListableBeanFactory的preInstantiateSingletons方法。)
1). 获取到beanName的list,开始遍历,判断是否是单例非懒加载非抽象bean
2).第一步满足,里面继续会判断是否FactoryBean(bean有两种,一种是工厂启动时就自己加载进来的bean,一类就是Factory创建的bean)
3).不是FactoryBean,进入getBean()方法
4) …
5).一直下推,直到doGetBean()(备注:在源码里,真正做业务的是 doXXXX 方法)
6).初始化,填充属性,加载beanPostProcessor后置处理器
---------------------------------------finishBeanFactoryInitialization方法结束-----------------------------------------------
AOP
SpringAOP面向切面编程技术,它是通过动态代理来实现的,目前使用两种动态代理,一类是jdk动态代理,还有一类是cglib动态代理。在目标对象实现接口的时候会自动使用jdk动态代理,没有实现接口的目标对象则会使用cglib获取到代理对象。aop就是利用代理对象的模式在目标资源的前后实现一些增强型操作。
比如事务:在代理对象执行db操作的前开启事务,执行结束后进行提交或者回滚的操作。
AOP的话可以用来做权限的校验,日志,事务等等等的吧。