Spring源码学习5.2.9

自动装配

自动装配关心的是解析bean之间的依赖关系

依赖注入

引用的对象不需要自己负责创建或查找所依赖的对象,而是通过外部系统(如Spring容器)来提供依赖的实例。它将对象与其依赖解耦,使得对象更加可重用

依赖注入是通过IoC(Inversion of Control,控制反转)容器实现的

依赖注入的方式

构造函数注入

字段注入

区别:

  • 字段注入将依赖直接注入到目标类的字段上,而构造函数注入将依赖注入到目标类的构造函数的参数中。
  • 字段注入可以在任何时候发生,包括在目标类实例化之前。而构造函数注入要求在实例化目标类时立即注入依赖,确保对象在创建后即可使用。

AOP名词

切点 :需要被拦截的方法
切面 :用于增强的切面类

配置拦截表达式

创建代理对象:当应用程序启动时,Spring AOP 会为切点所在的类创建代理对象。代理对象包含了切面的逻辑,并在切点执行时拦截并执行相关通知。

当程序执行到切点时,代理对象会拦截方法调用,并按照切面定义的通知顺序执行相应的逻辑(前置通知、后置通知、异常通知等)

一Spring功能特性

spring 5开始要求jdk8

1核心特性

  • IoC容器 (IoC Container)
  • spring 事件 (Events)
  • 资源管理 (Resources)
  • 国际化 (il8n)
  • 校验 (Validation)
  • 数据绑定 (Data Binding)
  • 类型转换 (Type Conversion)
  • spring 表达式 
  • 面向切面编程

Spring Framework 有哪些核心模块?

  •  spring-core: Spring 基础 API模块,如资源管理,泛型处理
  •  spring-beans: Spring Bean 相关,如依赖查找,依赖注入
  •  spring-aop : Spring AOP 处理,如动态代理,AOP 字节码提升
  •  spring-context :事件驱动、注解驱动,模块驱动等
  •  spring-expression: Spring 表达式语言模块

  • spring-aspects 是对aspect的支持
  • spring-jcl 统一日志。
  • spring-jms  消息中间件
  • spring-web 
  • spring-webflux
  • spring-webmvc
  • spring-websocket
  • 上面四个是web模块

只需要依赖需要的模块即可

2数据存储

3web技术

4框架整合与测试

spring编程模型

面向对象编程

契约接口:Aware、BeanPostProcessor

设计模式:观察者模式、组合模式、模板模式

对象继承:Abstract* 类

面向切面编程

动态代理: JdkDynamicAopProxy

字节码提升:ASM、CGLib、Aspectu...

面向模块编程

Maven Artifacts

OSGI Bundles

Java 9 Automatic Modult

Spring @Enable* 注解

面向函数编程

Lambda

面向元编程

注解:模式注解 (@Component、@Service、 @Respository ..)

配置:Environment 抽象、Property Sources、 BeanDefinition

泛型:Generic TypeResolver、ResolvableType ..

函数驱动

函数接口:ApplicationEventPublisher

Reactive: Spring WebFlux

模块驱动

Maven Artifacts

OSGI Bundles

Java 9 Automatic Modules

Spring @Enable*

spring设计模式

观察者

spring event事件 

通过事件的方式让,监听器回调

组合

模版方法

jdbcTempla te

Ioc 主要实现策略

依赖注入构造器。setter,参数、接口、

Ioc 容器的职责

通用职责

  • 依赖处理:   依赖查找 、 依赖注入
  • 生命周期管理:  容器、托管的资源 (Java Beans 或其他资源)
  • 配置: 容器、外部化配置、托管的资源 (Java Beans 或其他资源)

先了解Spring大致需要做哪些事?

一、把xml或者注解也可以是Json能描述Bean信息的文件读取

对此类统一的读取可以抽象一层Bean读取接口

二、 就是应该用什么来存对象,那就用Map容器。

用对象的名字当key,对象当value

三、根据bean的描述来创建Bean对象用什么方式,可以用反射

四、bean有些对象的属性该怎么填充,特殊的可以用Bean初始化(innit)初始化方法,像是普通属的可以set方式填充。

五、在引入扩展的时候(bean描述到Bean工厂之前)应该有一些后置处理器做扩展BeanFactoryPostProcessor可以有一堆可以没有。在这里可以做 比如${}里的内容做替换的事情

注:bean描述到bean工厂之后,实例化对象开始就属于Bean的生命周期了

补充下Bean的生命周期:实例化对象、普通的属性填充、执行aware回调方法、对BeanAop代理增强before 、特殊的属性填充用户自定义的init、增强after、销毁。

补充下BeanPostProcessor是AOP增强用的有before和after两个方法(源码里默认有JDK和CGlilb两种代理)、BeanFactoryPostProcessor是bean描述提交给bean工厂之间的扩展。

补充下:Environment接口,能在程序运行期间获得系统环境变量/属性。

补充下:观察者模式:能在spring生命周期不同阶段做不同的处理工作。观察者模式(监听器、监听事件、广播器)

补充下:Spring的重要方法:reflash,reflash包含了13个方法

refresh方法里的13个方法是Spring核心逻辑

一、prepareRefresh:刷新前的准备工作:设置容器启动时间、设置容器关闭、激活标志位、记录日志、创建监听器集合、创建刷新前的监听事件集合

二、创建Bean工厂、加载配置文件、执行beanFactoryPostProcessor方法、注册beanFactoryPostProcessor方法、初始化事件监听多路广播器、

工厂:实例化所有非懒加载的单例Bean、create创建Bean(里面通过clazz对象反射获取构造器,构造器对象来创建对象 )

对bean的属性填充,会递归初始化依赖的Bean、然后是特殊的属性填充:执行init方法

执行aware方法、beanPostprocessor的before方法、用户自定义init、beanPostprocessor的after方法

三级缓存?

DefaultSingletonRegistry类里面

二级缓存Map:earlySingletonObjects

三级缓存Map< ,ObjectFactory<?>>:singletonFactories。ObjectFactory<T>是函数式接口可以传入lambda表达式/匿名类接口。通过调用getObject方法执行具体逻辑

一级缓存ConcurrentHashMap:singletonObjects

解决循环依赖的关键在于,实例化和初始化分开

只用一级缓存不能解决循环依赖,如果只用一级缓存,成品与半成品都放在了一级缓存,取到半成品的话是不能使用的,所以要把半成品与成品分开存放。

为什么要三级缓存,二级行不行

如果保证所有的Bean都不调用getEarlyBeanReference表达式,只使用二级没问题

getEarlyBeanReference方法干什么的,为了循环依赖的同时还要AOP的

这个方法会遍历所有的BeanPostProcessor增强接口,如果需要代理,返回是代理对象。

通过函数式接口调用的时候包裹原来的对象就会返回代理对象

三级缓存放lambda表达式调用的时候覆盖原对象的引用返回代理对象。

初始化设置属性的三种方式?

一、set重点:可以解决循环依赖的问题 (先有的对象,在给对象属性赋值)

二、构造方法:不能解决循环依赖(找不到对象,对象没有事先存在、不能返回对象的引用赋值)懒加载应该可以解决

三、工厂方法(不重要)

创建Bean的相关方法

getBean-> doGetBean->createBean->doGreateBean

getBean先去一级缓存查找

三级缓存value是函数式接口里面的getObject方法写的时候就是调用createBean方法。

这个lambda表达式在调用getObject时才会执行

找对象有没有的时候是先看一级缓存有没有,在看二级,在看三级缓存

一级缓存放初始化好的对象

二级缓存放半成品对象

三级缓存放lambda表达式

在二级放入后应该给三级缓存K/V删除

同样,一级缓存放入对象后也给二级缓存删掉

对Spring的理解?

大范围->小细节

Spring用来存储管理Bean对象。从创建Bean对象到Bean的销毁都由Bean来管理。

Bean的描述可以从配置文件,或者注解方式。

把Bean的描述,封装成Bean Definition。

解析Bean Definition。

反射创建对象。

初始化对象。

对beanAOP增强。

Spring框架里面有很多map

Bean也是用HashMap存的

配置文件解析?

Bean的注解和XML解析不一样

但是在形成Definition前,会用BeanDefinitionReader统一约束。

BeanDefinition 形成对象,会用反射的方式。反射更灵活。

配置文件的属性替换?

BeanDefinition也是map

BeanDefinition里面的属性值是占位符。

Definition形成对象的时候,具体属性值是什么时候替换的

替换前是用占位符

BeanFactory?

BeanFactorybean容器的根接口

里面的子类实现用反射创建对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值