IoC设计实现及Spring源码分析

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在一些情况下不能很好的解决横切逻辑代码的问题

横切逻辑代码:

  1. 横切代码重复
  2. 逻辑代码和业务代码混杂,代码臃肿,维护困难

横切逻辑代码的使用场景很有限:一般是事务控制,权限校验,日志(Mybatis集成日志需要了解)

难点:如何在不改变原有业务逻辑的情况下,悄无声息的把横切逻辑代码应用到原有的业务逻辑中,达到原来的效果?

2.2  AOP在解决什么问题?

在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦,避免横切逻辑代码重复。

2.3 为什么叫面向切面编程?

【切】:指横切逻辑,原有业务逻辑代码不能动,只能操作横切逻辑代码,所以面向横切逻辑。

【面】:指逻辑代码往往需要影响的是很多个方法,每个方法如同一个点,多个点构成面,有一个面的概念在里面

 

Spring Ioc基础知识说明

Spring框架的IOC实现

  1. 纯xml(bean信息定义全部配置在xml中)
  2. Xml+注解(部分bean使用xml定义,部分bean使用注解定义
  3. 纯注解模式(所有的bean都是用注解来定义)

 

BeanFactory和ApplicationContext的区别

BeanFactory是Spring框架中IoC容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而ApplicationContext是它的一个子接口,所以ApplicationContext是具备BeanFactory提供的全部功能的。

通常,我们称BeanFactory为SpringIOC的基础容器,ApplicationContext是容器的高级接口,比BeanFactory要拥有更多的功能,比如说国际化支持和资源访问(xml,java配置类)等等。

 

Spring IOC的纯XML模式回顾

Bean的创建——Spring ioc 实例化Bean的三种方式

  1. 使用无参构造器
  2. 静态方法
  3. 实例化方法

Bean标签解析

<!--scope:定义bean的作用范围

     singleton:单例,IOC容器中只有一个该类对象,默认为singleton

     prototype:原型(多例),每次使用该类的对象(getBean),都返回给你一个新的对象,Spring只创建对象,不管理对象

    -->

Spring DI依赖注入配置回顾

DI依赖注入的XML配置

  1. 按照注入的方式分类
    1. 构造函数注入
    2. Set方法注入
  2. 按照注入的数据类型分类
    1. 基本类型和String
    2. 其他Bean类型
    3. 复杂类型

 

Xml与注解相结合的模式

@Autowired按照类型注入,如果按照类型无法唯一锁定对象,可以结合@Qualifier进行使用

 

纯注解模式回顾

 

高级特性之Lazy-init 延迟加载

ApplicationContext容器的默认行为是在启动服务器时将所有的singleton bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。

如果不想让一个singleton bean在ApplicationContext实现初始化时被提前实例化,那么可以将bean设置为延迟实例化。

设置lazy-ini为true的bean将不会在ApplicationContext启动时提前被实例化,而是第一次向容器通过getBean索取bean时实例化的。

应用场景:

  1. 开启延迟加载一定程度提高容器启动和运转性能
  2. 对于不常使用的Bean设置延迟加载,这样偶尔使用的时候再加载,不必要从一开始该Bean就占用资源

 

FactoryBean和BeanFactory

BeanFactory接口是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理Bean的一个工程,具体使用它下面的子接口类型,比如ApplicationContext;此处重点分析FactoryBean。

Spring中Bean有两种,一种是普通Bean,一种是工厂Bean(FactoryBean),FactoryBean可以生成某一个类型的Bean实例(返回给我们),也就是说我们可以借助于它自定义Bean的创建过程。

 

 

 

后置处理器

Spring提供了两种后处理Bean的扩展接口

  1. BeanPostProcessor
  2. BeanFactoryPostProcessor

注意后置处理器在生命周期中的执行位置

 

Spring源码剖析之注意事项及源码构建

 

源码深度剖析-IoC容器初始化主体流程之BeanFactory及容器继承体系

 

 

源码深度剖析-IoC容器初始化主体流程之Bean周期关键时机点代码调用分析

思路:创建一个类lagouBean,让其实现几个特殊的接口,并分别在接口实现的构造器、接口方法中断点,观察线程调用栈,分析出Bean对象创建和管理关键点的触发时机。

 

源码深度剖析-IoC容器初始化主体流程之refresh方法

Refresh方法完成了Spring中ioc容器初始化中的很多动作

 

     

 

源码深度剖析-BeanFactory获取子流程

 

源码深度剖析_BeanDefinition加载注册子流程

 

 

1.ApplicationContext的三个常用实现类

ClassPathXmlApplicationContext:可以加载类路径下的配置文件,不在的话加载不了

FileSystemXmlApplicationContext:可以加载磁盘任意路径下的配置文件(必须有访问权限)

AnnotationConfigApplicationContext  用于读取注解创建容器的

  1. Spring声明式事务管理之二:核心接口API

Spring事务管理API有100个左右,其中最核心的API有3个,分别是TransactionDefinition、 PlatformTransactionManager、TransactionStatus。TransactionDefinition定义事务管理五个属性,PlatformTransactionManager执行具体的事务,TransactionStatus提供控制事务执行和查询事务状态的方法。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值