spring原理总结

Spring中的Scope的作用
  1. Scope为对象在Spring容器中的创建方式,也可以理解为对象在容器中的生命周期。
  2. Scope的类型有:Single、Prototype、Request、Session、Global Session五种:
    • Single:单例模式,从容器启动到第一次getBean被实例化后,就一直存在于容器中,知道容器退出或销毁。
    • Prototype:多例模式,每次getBean都会实例化一个新的对象,但是对象实例化后容器就不再持有改对象的引用(即不进行维护),对象请求方负责对该对象的生命周期进行维护,包括销毁。
    • Request、Session、Global Session:只存在web项目中,对象的生命周期跟web项目的request和session的周期一样,相当于Prototype的特例。
Spring的IOC源码解析
  1. IOC主要分为几步:资源定位、解析载入、注册到容器、依赖注入。
  2. 主要架构体系:
    • 容器:基础容器BeanFactory和高级容器ApplicationContext。
    • BeanFactory还有3个基础子类,共同定义了Bean的集合、Bean之间的关系、以及Bean行为。XmlBeanFactory就是针对最基本的IOC容器的实现,这个IOC容器可以读取XML文件定义的BeanDefinition。
    • ApplicationContext在基础IOC容器的基础上还定义了一些高级特性,如支持信息源,可以实现国际化、访问资源、支持应用事件等。
    • Bean对象在容器的结构BeanDefinition。
  3. 初始化的基本步骤:
    • 入口是容器实现的refresh()调用来完成的。
    • 通过ResourceLoader来完成资源文件位置的定位,以从类路径、文件系统、URL等方式来定为资源位置。接下来以xml为配置文件来解析。
    • BeanDefinitionParserDelegate对xml文件进行解析,从而转换成BeanDefinition对象来表示。
    • 然后通过BeanDefinitionRegistry对BeanDefinition进行注册,通过一个ConcurrentHashMap来进行维护,这个就是IOC容器持有bean信息的场所,以后都是围绕这个HashMap对bean进行操作。
    • 接下来就是依赖注入,有两种情况会触发,第一种是第一次调用getBean的时候,第二种是在bean定义那里配置了lazy-init=false触发预实例化。
    • getBean的时候,如果bean是单例,则会先从缓存中查找,找不到再创建一个实例,并缓存起来;如果是多例,则直接创建一个新的实例。bean的实例化一般通过JDK的反射机制进行,但如果bean的方法有被覆盖,则用CGLIB实例化。
  4. 高级特性:
    • 使用lazy-init属性对Bean预初始化。
    • FactoryBean产生或者修饰Bean对象的生成。
    • BeanPostProcessor后置处理器对Bean声明周期事件管理和IoC容器的autowiring自动装配功能。AOP切面的织入也是在这里处理的。
BeanFactory和FactoryBean的对比
  1. BeanFactory:Bean工厂,是一个工厂(Factory),我们Spring IoC容器的最顶层接口就是这个BeanFactory,它的作用是管理Bean,即实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
  2. FactoryBean:工厂Bean,是一个Bean,作用是产生其他bean实例。
IoC容器中管理Bean依赖关系的方式
  1. 显式管理:通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理。
  2. autowiring(自动装配):SpringIoC容器的依赖自动装配功能,不需要对Bean属性的依赖关系做显式的声明,只需要在配置好autowiring属性,IoC容器会自动使用反射查找属性的类型和名称,然后基于属性的类型或者名称来自动匹配容器中管理的Bean,从而自动地完成依赖注入。
autowiring自动装配的实现过程
  1. 对Bean的属性迭代调用getBean方法,完成依赖Bean的初始化和依赖注入。
  2. 将依赖Bean的属性引用设置到被依赖的Bean属性上。
  3. 将依赖Bean的名称和被依赖Bean的名称存储在IoC容器的集合中。
IOC的源码解析

参考https://www.cnblogs.com/ITtangtang/p/3978349.html

Spring AOP源码解析
  1. AOP主要包括切面、切入点、通知、目标对象和AOP代理。
  2. 入口在bean在IOC容器中被加载实例化前调用的BeanPostProcessor后置处理器接口中的postProcessAfterInitialization方法。
  3. 基本流程:
    • 提取当前bean的所有增强方法,然后获取到适合的当前bean的增强方法,然后对增强方法进行排序。
    • 获取到当前bean的增强方法后,便调用createProxy方法,创建代理。
  4. 代理的创建有两种:JDK动态代理和CGLIB动态代理。默认使用JDK动态代理,如果proxyTargetClass属性为true,则使用CGLIB。
spring容器初始化bean和销毁前所做的操作定义方式有三种:
  1. 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作。
  2. 通过 在xml中定义init-method和destory-method方法。
  3. 通过bean实现InitializingBean和DisposableBean接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值