没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
一、Spring简介 1. 概述 Spring是一个轻量级Java开发框架(最早由Rod Johnson创建),为Java应用程序提供全面的基础架构支持。 Spring最根本的使命是解决企业级应用开发的复杂性,简化Java开发。 2. Spring两个核心特性 ① IoC(Inverse of Control)–> 控制反转 IoC理念: 对象的创建工作交给IoC容器 对象间的依赖关系交给IoC容器查找,在运行期间确定 依赖注入是IoC的主要实现方式 IoC的实现机制: 工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,通过工厂加载产生需要的类对象。 ② AoP(Aspect Oriented Programing) --> 面向切面编程
资源推荐
资源详情
资源评论
一、Spring 简介
1. 概述
Spring 是一个轻量级 Java 开发框架(最早由 Rod Johnson 创建),为 Java 应用程序提供全
面的基础架构支持。
Spring 最根本的使命是解决企业级应用开发的复杂性,简化 Java 开发。
2. Spring 两个核心特性
① IoC(Inverse of Control)–> 控制反转
IoC 理念:
对象的创建工作交给 IoC 容器
对象间的依赖关系交给 IoC 容器查找,在运行期间确定
依赖注入是 IoC 的主要实现方式
IoC 的实现机制:
工厂模式 + 反射机制:工厂模式提供创建方法,通过反射获取需要加载的类的全限定名称,
通过工厂加载产生需要的类对象。
② AoP(Aspect Oriented Programing) --> 面向切面编程
AoP 理念:通过预编译/运行时动态代理的方式,将那些与业务无关但对多个对象产生影响
的公共行为(如日志、事务等),抽取并封装成可重用的模块 --> “切面”
Spring 中 AoP 提供声明式事务,允许用户自定义切面
二、IoC 详解
1. 核心容器
容器提供了 IoC 功能,BeanFactory 和 ApplicationContext 都是容器
容器类型 作用 加载方式
BeanFactory 低级容器:功能少 懒加载,用到实例才加载
ApplicationContext 高级容器:功能多 预加载,容器启动时一次性加载
总结:
① ApplicationContext 是 BeanFactory 的子接口,在基本功能之上提供了更多的功能:
继承了 MessageSource,支持国际化
提供统一的资源访问方式
同时加载多个配置文件,可载入上下文(具有层级关系)
② BeanFactory 为低级容器,类似于 Map(Key --> BeanName,Value --> Bean 实例),
BeanFactory 只提供最简单的注册(put)和获取(get)两个功能
③ ApplicationContext 为高级容器,继承多个接口,功能强大
2. ApplicationContext 常见实现
① FileSystemXmlApplicationContext:全路径名找 Xml
② ClassPathXmlApplicationContext:在 ClassPath 中找 Xml
③ WebXmlApplicationContext:一般从 RequestContextUtils 中获取 Xml
3. DI(Dependency Injection)依赖注入
DI 依赖注入是 IoC 控制反转的重要实现方式
注入方式(3 钟)
① Xml 配置:
接口注入:灵活性差,易用性差,Spring4 后弃用
构造器注入:全属性注入,任何改动会导致新实例的创建<constructor-arg name=""
value=""/)
Setter 方法注入:部分/全属性注入,改动不会导致新实例的创建 <property name=""
value=""/)
② 注解配置(将类对象托管给容器)
@Component(“BeanName”) --> 可显示地指定 BeanName,若不指定则按照类名驼峰命名
衍生出@Controller + @Service + @Repository/@Mapper
在属性上方@Value 可以直接对该属性赋值
③ Java 配置
@Configuration + @Bean
@Bean 在方法上使用,方法返回值作为 JavaBean 被托管到容器中
4. JavaBean 作用域(Scope)
① SingleTon:单例模式(默认),每次返回的实例为同一个,适用于无状态的 JavaBean
② ProtoType:原型模式,每次返回一个新的 JavaBean,适用于有状态的 JavaBean
③ Web 应用中:
request:为每一个请求创建一个实例
session:同一个 session 会话共享一个实例,不同会话使用不同实例
global-session:全局作用域,所有 session 会话共享一个实例
5. Bean 的装配机制
① Xml 中显示装配(ref)
② Java 代码中显示装配 @Configuration + @Bean
③ 自动装配
自动装配主要分为两种:byName 和 byType,可在 xml 中加入 autowire=byName/byType
来指定自动装配方法
@Autowired 自动装配:先按照 byType 装配,若对应 type 的对象有多个,则按照类名驼峰
命名的名字进行 byName 装配
@Qualifier(“BeanName”) : 指 定 具 体 JavaBean 名 , 进 行 byName 加 载 ; 主 要 是 作 为
@Autowired 的补充修饰,消除歧义
@Resource:先按照 byName 进行装配,然后按照 buType 装配
6. Bean 的生命周期
简单来说分为四个阶段:
实例化 Instantiation
属性赋值 Populate
初始化 Initialization
销毁 Destruction
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5s08on6a-
1626181763936)(http://182.92.190.128:8090/upload/2021/07/image-
a4e39ff9b3a54e44828f6be6b7e39ca7.png)]
(1)实例化 Bean:
对于 BeanFactory 容器,当客户向容器请求一个尚未初始化的 bean 时,或初始化 bean 的时
候需要注入另一个尚未初始化的依赖时,容器就会调用 createBean 进行实例化。
对于 ApplicationContext 容器,当容器启动结束后,通过获取 BeanDefinition 对象中的信息,
实例化所有的 bean。
(2)设置对象属性(依赖注入):
实例化后的对象被封装在 BeanWrapper 对象中,紧接着,Spring 根据 BeanDefinition 中的
信息 以及 通过 BeanWrapper 提供的设置属性的接口完成属性设置与依赖注入。
(3) InitializingBean:
如果 Bean 实现了 InitializingBean 接口,执行 afeterPropertiesSet()方法。
(4) destroy-method:
最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的
销毁方法。
详细的生命周期形成过程在后面的源码解析中!
三、AoP 详解
1. SpringAop 名词解释
① 切面(Aspect):由通知 + 切点组成
② 连接点(Join Point):能够插入切面的点
③ 通知(Advice):切面的逻辑(工作内容)
④ 切点(PointCut):切点的定义用于匹配通知所要织入的连接点
⑤ 引入(Introduction)
⑥ 目标对象(Target):被切面通知的对象
⑦ 织入(Wearing):切面插入,创建新代理对象
2. 通知类型
Before
After
Around
AfterReturning
AfterThrowing
3. SpringAoP 和 AspectJAoP
AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表;而动态代理
则以 Spring AOP 为代表
Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理
类型 原理 织入对象 局限
AspectJAoP 静态代理增强,切面逻辑织入字节码 编译/类加载期间生成 AoP 代理类,
织入颗粒度更细 性能更好,但需要特定编译器
JDK 动态代理 JDK 动态代理,不修改字节码 为方法生成代理对象,方法级别的连接点
只能代理接口
Cglib 动态代理 字节码生成,通过继承方式实现代理 运行时生成子类,覆盖特定方法
并添加增强代码 final 类无法代理
注意:
JDK 动态代理只提供接口的代理,不支持类的代理,核心为 InvocationHandler 接口和 Proxy
类
如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用 CGLIB 来动态
代理目标类;
CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定
类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现 AOP。CGLIB 是通过继
承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态
代理的
四、Spring 容器的启动流程
1. 总体流程
初始化 Spring 容器,注册内置的 BeanPostProcessor 的 BeanDefinition 到容器中
将配置类的 BeanDefinition 注册到容器中
调用 refresh()方法刷新容器
调用构造方法,初始化容器:
AnnotationConfigApplicationContext 是注解注入
ClassPathXmlApplicationContext 是 xml 注入
我们调用的是有参的构造方法,有参构造方法中会自动调用无参构造方法 this()进行操作
AnnotationConfigApplicationContext 和 ClassPathXmlApplicationContext 都 继 承 自
AbstractApplicationContext ,其中定义了 refresh()方法
// 初始化容器
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this(); // 1. 注册 Spring 内置后置处理器的 BeanDefinition 到容器
register(annotatedClasses); // 2. 注册配置类 BeanDefinition 到容器
refresh(); // 3. 加载或者刷新容器中的 Bean
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-samvvSU8-
1626181763939)(http://182.92.190.128:8090/upload/2021/07/image-
ff5602dda5ce4f70b56d6f22ed2ab112.png)]
2. 初始化流程
(1) 无参构造函数 this()
主要完成以下三项工作
实例化 BeanFactory【DefaultListableBeanFactory】工厂,用于生成 Bean 对象
实 例 化 BeanDefinitionReader 注 解 配 置 读 取 器 , 用 于 对 特 定 注 解 ( 如 @Service 、
@Repository)的类进行读取转化成 BeanDefinition 对象,(BeanDefinition 是 Spring 中极
其重要的一个概念,它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,
factoryBeanName 等)
实例化 ClassPathBeanDefinitionScanner 路径扫描器,用于对指定的包目录进行扫描查找
bean 对象
// 无参构造方法
public AnnotationConfigApplicationContext() { // 实例化 Spring 容器
StartupStep createAnnotatedBeanDefReader =
this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
this.reader = new AnnotatedBeanDefinitionReader(this); // 实例化配置读取器
createAnnotatedBeanDefReader.end();
this.scanner = new ClassPathBeanDefinitionScanner(this); // 实例化路径扫描器
}
剩余26页未读,继续阅读
资源评论
电气_空空
- 粉丝: 4911
- 资源: 1273
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 阿里云api网关请求签名示例(java实现).zip
- 通过示例学习 Android 的 RxJava.zip
- 通过多线程编程在 Java 中发现并发模式和特性 线程、锁、原子等等 .zip
- 通过在终端中进行探索来学习 JavaScript .zip
- 通过不仅针对初学者而且针对 JavaScript 爱好者(无论他们的专业水平如何)设计的编码挑战,自然而自信地拥抱 JavaScript .zip
- 适用于 Kotlin 和 Java 的现代 JSON 库 .zip
- yolo5实战-yolo资源
- english-chinese-dictionary-数据结构课程设计
- mp-mysql-injector-spring-boot-starter-sql注入
- lunisolar-删除重复字符
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功