Ioc设计实现及Spring源码分析
- 自定义Ioc&AOP框架
Spring课程内容介绍
Ssm = spring + springmvc + mybatis
Spring全家桶:脚手架框架SpringBoot、微服务框架SpringCloud
Spring框架整体回顾
Spring是分层的full-Stack(全栈)轻量级开源框架,以IoC和AOP为内核,提供了展现层SpringMVC和业务层事务管理等众多的企业级应用技术,还能整合众多著名的第三方框架和类库。
IoC思想巩固
注意:IOC和AOP在Spring之前就存在,只不过更偏向于理论化,Spring在技术层次把这两个思想做了非常好的体现(java)
第1节 IoC
1.1什么是IOC?
IoC Inversion of Control(控制反转/反转控制)
描述的事情:Java开发领域对象的创建,管理的问题
传统的开发方式:比如类A依赖于类B,往往会在类A中new一个B的对象
IoC思想下开发方式:我们不用自己去new对象,而是由IoC容器去帮我们实例化对象并管理,我们需要使用对象的时候,去问IoC容器要即可。
我们丧失了一个权力(创建、管理对象的权力),得到了一个福利(不用考虑对象的创建、管理等一系列事情)
为什么叫控制反转?
控制:指的是对象创建(实例化、管理)的权力
反转:控制权交给外部环境了(Spring框架、IoC容器)
1.2 IOC解决了什么问题?
IoC解决对象之间的耦合问题
1.3 IOC和DI的区别
DI:Dependancy InJection(依赖注入)
- AOP
2.1 什么是AOP?
AOP:Aspect oriented Programming 面向切面/方面编程
AOP是OOP的延续,从OOP 说起
OOP三大特征:封装、继承、多态
OOP是一种垂直继承体系
OOP在一些情况下不能很好的解决横切逻辑代码的问题
横切逻辑代码:
- 横切代码重复
- 逻辑代码和业务代码混杂,代码臃肿,维护困难
横切逻辑代码的使用场景很有限:一般是事务控制,权限校验,日志(Mybatis集成日志需要了解)
难点:如何在不改变原有业务逻辑的情况下,悄无声息的把横切逻辑代码应用到原有的业务逻辑中,达到原来的效果?
2.2 AOP在解决什么问题?
在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦,避免横切逻辑代码重复。
2.3 为什么叫面向切面编程?
【切】:指横切逻辑,原有业务逻辑代码不能动,只能操作横切逻辑代码,所以面向横切逻辑。
【面】:指逻辑代码往往需要影响的是很多个方法,每个方法如同一个点,多个点构成面,有一个面的概念在里面
Spring Ioc基础知识说明
Spring框架的IOC实现
- 纯xml(bean信息定义全部配置在xml中)
- Xml+注解(部分bean使用xml定义,部分bean使用注解定义
- 纯注解模式(所有的bean都是用注解来定义)
BeanFactory和ApplicationContext的区别
BeanFactory是Spring框架中IoC容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而ApplicationContext是它的一个子接口,所以ApplicationContext是具备BeanFactory提供的全部功能的。
通常,我们称BeanFactory为SpringIOC的基础容器,ApplicationContext是容器的高级接口,比BeanFactory要拥有更多的功能,比如说国际化支持和资源访问(xml,java配置类)等等。
Spring IOC的纯XML模式回顾
Bean的创建——Spring ioc 实例化Bean的三种方式
- 使用无参构造器
- 静态方法
- 实例化方法
Bean标签解析
<!--scope:定义bean的作用范围
singleton:单例,IOC容器中只有一个该类对象,默认为singleton
prototype:原型(多例),每次使用该类的对象(getBean),都返回给你一个新的对象,Spring只创建对象,不管理对象
-->
Spring DI依赖注入配置回顾
DI依赖注入的XML配置
- 按照注入的方式分类
- 构造函数注入
- Set方法注入
- 按照注入的数据类型分类
- 基本类型和String
- 其他Bean类型
- 复杂类型
Xml与注解相结合的模式
@Autowired按照类型注入,如果按照类型无法唯一锁定对象,可以结合@Qualifier进行使用
纯注解模式回顾
高级特性之Lazy-init 延迟加载
ApplicationContext容器的默认行为是在启动服务器时将所有的singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。
如果不想让一个singleton bean在ApplicationContext实现初始化时被提前实例化,那么可以将bean设置为延迟实例化。
设置lazy-ini为true的bean将不会在ApplicationContext启动时提前被实例化,而是第一次向容器通过getBean索取bean时实例化的。
应用场景:
- 开启延迟加载一定程度提高容器启动和运转性能
- 对于不常使用的Bean设置延迟加载,这样偶尔使用的时候再加载,不必要从一开始该Bean就占用资源
FactoryBean和BeanFactory
BeanFactory接口是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理Bean的一个工程,具体使用它下面的子接口类型,比如ApplicationContext;此处重点分析FactoryBean。
Spring中Bean有两种,一种是普通Bean,一种是工厂Bean(FactoryBean),FactoryBean可以生成某一个类型的Bean实例(返回给我们),也就是说我们可以借助于它自定义Bean的创建过程。
后置处理器
Spring提供了两种后处理Bean的扩展接口
- BeanPostProcessor
- BeanFactoryPostProcessor
注意后置处理器在生命周期中的执行位置
Spring源码剖析之注意事项及源码构建
源码深度剖析-IoC容器初始化主体流程之BeanFactory及容器继承体系
源码深度剖析-IoC容器初始化主体流程之Bean周期关键时机点代码调用分析
思路:创建一个类lagouBean,让其实现几个特殊的接口,并分别在接口实现的构造器、接口方法中断点,观察线程调用栈,分析出Bean对象创建和管理关键点的触发时机。
源码深度剖析-IoC容器初始化主体流程之refresh方法
Refresh方法完成了Spring中ioc容器初始化中的很多动作
源码深度剖析-BeanFactory获取子流程
源码深度剖析_BeanDefinition加载注册子流程
1.ApplicationContext的三个常用实现类
ClassPathXmlApplicationContext:可以加载类路径下的配置文件,不在的话加载不了
FileSystemXmlApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限)
AnnotationConfigApplicationContext 用于读取注解创建容器的
- Spring声明式事务管理之二:核心接口API
Spring事务管理API有100个左右,其中最核心的API有3个,分别是TransactionDefinition、 PlatformTransactionManager、TransactionStatus。TransactionDefinition定义事务管理五个属性,PlatformTransactionManager执行具体的事务,TransactionStatus提供控制事务执行和查询事务状态的方法。