Spring IOC 容器源码分析&AOP实现原理

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

反正就是集中在 abstractApplicationContextrefresh方法

看下源码的大概步骤:

---------------------------------------refresh方法开始-----------------------------------------------

  1. 第一步prepare一样,不重要,预处理环境之类的吧

  2. 第2步就是获取bean工厂,默认实现类是 DefaultListableBeanFactory

  3. 一堆环境之类的准备工作

  4. 实例调用实现了BeanFactoryPostProcessor的类

  5. 实例注册那个BeanPostProcessor

  6. 初始化之类的

  7. 注册监听之类的

  8. 这步就是调用finishBeanFactoryInitialization方法啦~~~初始化所有非懒加载单例bean

  9. 完成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的话可以用来做权限的校验,日志,事务等等等的吧。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值