目录
IOC控制反转
引言
IOC案例
Bean的作用范围
Bean的实例化
bean生命周期
DI 依赖注入
setter注入
构造器注入
自动装配
自动装配的方式
注意事项;
集合注入
核心容器
容器的创建方式
Bean的三种获取方式
Bean和依赖注入相关总结
IOC/DI注解开发
注解开发定义Bean
纯注解开发模式
总结从配置文件到注解开发
注解开发依赖注入
AOP
AOP的实现步骤
1.定义通知类和通知
2.定义切入点
3.制作切面
4.将通知类配给容器并标识其为切面类
Aop通知类型
Aop事务管理
怎么实现Spring的事务呢
知识点1:@EnableTransactionManagement
知识点2:@Transactional
Spring的学习主线是IOC、AOP、声明式事务
IOC控制反转
引言
目前项目中存在的问题,耦合度太高,如下例:
针对这个问题,Spring就提出了一个解决方案:
使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象
这种实现思就是Spring的一个核心概念。
- 使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
- Spring技术对IOC思想进行了实现,Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部"
- IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象。
- 创建或被管理的对象在IOC容器中统称为Bean,IOC容器中放的就是一个个的Bean对象
当IOC容器中创建好service和dao对象后,程序能正确执行么?
不行,因为service运行需要依赖dao对象
IOC容器中虽然有service和dao对象
但是service对象和dao对象没有任何关系
需要把dao对象交给service,也就是说要绑定service和dao对象之间的关系
这个时候就需要用到DI(依赖注入)
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
小结:
IOC:控制反转,控制反转的是对象的创建权
DI:依赖注入,绑定对象与对象之间的依赖关系Spring创建了一个容器用来存放所创建的对象,这个容器就叫IOC容器
容器中所存放的一个个对象就叫Bean或Bean对象
IOC案例
1.在配置文件中完成Bean的配置
2.怎么获取ioc容器
现在虽然解耦了,但是在 BookServiceImpl的类中依然存在 BookDaoImpl对象的
new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到DI:依赖注入
现在的需求是在BookServiceImpl类中删除new对象的方式,使用Spring的DI完成Dao层的注入
1.为BookDao提供setter方法
配置文件中添加依赖注入的配置
name="bookDao"中 bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前
面加set找对应的 setBookDao()方法进行对象注入。
ref="bookDao"中 bookDao的作用是让Spring能在IOC容器中找到id为 bookDao的Bean对象给
bookService进行注入
Bean的作用范围
怎么看一个Bean是不是单例
同一个bean获取两次,将对象打印到控制台,看打印出的地址值是否一致。一致就是单例。
将scope设置为 prototype,就是非单例了。
小结:
Bean的实例化
bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。每一个类默认都会提供一个无参构造函数,所以其实真正在使用这种方式的时候,我们什么也不需要做。
Spring底层用的是反射
Spring的IOC实例化对象的三种方式分别是
bean生命周期
DI 依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
Spring为我们提供了两种注入方式,分别是:
setter注入
可以看下面的例子,注入的是引用类型。
那注入简单类型如何操作呢
构造器注入
构造器注入也就是构造方法注入
注入简单类型
总结;
根据前面的学习大家可以看到,编写配置文件也是非常麻烦的一件事情,那我们也可以对此进行简化,我们将使用自动装配
自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配的方式
如何操作呢?
注意事项;
集合注入
前面我们已经能完成引入数据类型和简单数据类型的注入,但是还有一种数据类型集合,集合中既可以装简单数据类型也可以装引用数据类型,对于集合,在Spring中该如何注入呢?
常见的集合类型有哪些?
- 数组
- List
- Set
- Map
- Properties
1.与之前没有区别的是先生成setter方法
2.
核心容器
容器的创建方式
Bean的三种获取方式
Bean和依赖注入相关总结
bean相关
依赖注入相关
IOC/DI注解开发
配置文件写的真的让人很痛苦,终于来学注解开发了
注解开发定义Bean
对应关系
最后在配置文件中写一下就行了
这样一下子可以少写很多的配置文件了
对于@Component注解,还衍生出了其他三个注解 @Controller、 @Service、 @Repository
方便我们后期在编写类的时候能很好的区分出这个类是属于 表现层、 业务层还是 数据层的类。
纯注解开发模式
就是一点点的配置文件都不写了
将配置文件applicationContext.xml删除掉,使用类来替换
修改点1:
修改点2:
总结从配置文件到注解开发
注解开发依赖注入
简单数据类型的注入
AOP
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程
序结构。AOP是在不改原有代码的前提下对其进行增强.
在不惊动(改动)原有设计(代码)的前提下,想给谁添加功能就给谁添加。这个也就是Spring的理念
AOP 中的概念: 连接点、切入点、通知、通知类。
- 连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
- 切入点(Pointcut):匹配连接点的式子
- 通知(Advice):在切入点处执行的操作,也就是共性功能在SpringAOP中,功能最终以方法的形式呈现
- 通知类:定义通知的类
- 切面(Aspect):描述通知与切入点的对应关系
AOP的实现步骤
1.定义通知类和通知
2.定义切入点
3.制作切面
4.将通知类配给容器并标识其为切面类
Aop通知类型
AOP可以简化项目中的事务管理,也是一大亮点。所以我们现在来学习一下AOP事务管理
Aop事务管理
- 事务作用:在数据层保障一系列的数据库操作同成功同失败
- Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
Spring为了管理事务,提供了一个平台事务管理器 PlatformTransactionManager。
PlatformTransactionManager只是一个接口,Spring还为其提供了一个具体的实现。
怎么实现Spring的事务呢
1.首先在需要添加事务的接口、类或者方法上添加@Transactional注解
注意:
@Transactional可以写在接口类上、接口方法上、实现类上和实现类方法上
-
写在接口类上,该接口的所有实现类的所有方法都会有事务
-
写在接口方法上,该接口的所有实现类的该方法都会有事务
-
写在实现类上,该类中的所有方法都会有事务
-
写在实现类方法上,该方法上有事务
-
建议写在实现类或实现类的方法上
2.在JdbcConfig类中配置事务管理器
3.开启事务注解
在SpringConfig的配置类中开启
@EnableTransactionManagement
知识点1:@EnableTransactionManagement
名称 | @EnableTransactionManagement |
---|---|
类型 | 配置类注解 |
位置 | 配置类定义上方 |
作用 | 设置当前Spring环境中开启注解式事务支持 |
知识点2:@Transactional
名称 | @Transactional |
---|---|
类型 | 接口注解 类注解 方法注解 |
位置 | 业务层接口上方 业务层实现类上方 业务方法上方 |
作用 | 为当前业务层方法添加事务(如果设置在类或接口上方则类或接口中所有方法均添加事务) |