文章目录
- 前言
- Spring 体系结构
- IOC&DI
- 1.Ioc控制反转
- 2.DI依赖注入
- 3.目标
- IOC相关之bean
- 1.bean的基础配置
- 2.bean的实例化
- 3.bean的生命周期
- 4.IOC管理第三方bean
- DI相关之注入
- 注解开发
- 1.介绍
- 2.注解之bean&DI
- 3.注解管理第三方bean
- 4.常见注解的含义
- AOP
- 1.介绍
- 2.核心概念
- 3.常见注解
- AOP事务管理
- 1.Spring事务
- 2.事务角色
- 3.事务属性
前言
这篇文章主要是介绍Spring主要的一些理论&基本概念(尽量不贴代码)
具体实战操作可以见 Spring(二)实战
常见面试题可以见Spring(三)面试(其实搞懂这篇文章,三的面试题就不难了,当然也可以用来查漏补缺)
Spring 体系结构
开局一张图
IOC&DI
Spring最重要的两大概念之一 —— IOC / DI
1.Ioc控制反转
(1)为什么引入Ioc?
之前Web开发中代码耦合度过高。
业务层需要调用数据层的方法,就需要在业务层new数据层的对象。如果数据层的实现类发生变化,那么业务层的代码也需要跟着改变,发生变更后,都需要进行编译打包和重部署。如下图:
(2)所以提出解决方案——控制反转:
IOC:使用对象时,由主动new产生对象转换为由外部提供对象;此过程中对象创建控制权由程序转移到外部——此思想称为控制反转。
(3)怎么实现IoC?
- Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部"
- IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象
- 被创建或被管理的对象在IOC容器中统称为Bean或Bean对象
2.DI依赖注入
(1)为什么要依赖注入?
当IOC容器中创建好service和dao对象后,程序能正确执行么?——不行,因为service运行需要依赖dao对象(所以需要绑定两者)
(2)解决方案——依赖注入
DI:在容器中建立bean与bean之间的依赖关系的整个过程
3.目标
- 使用IOC容器管理bean(IOC)
- 在IOC容器内将有依赖关系的bean进行关系绑定(DI)
- 最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系.
IOC相关之bean
(后面都会用注解开发代替,这里还是采用标签)
1.bean的基础配置
通过bean标签的属性来进行基础配置
为什么bean默认为单例(singleton)?
- bean为单例的意思是在Spring的IOC容器中只会有该类的一个对象
- bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高
2.bean的实例化
对象已经能交给Spring的IOC容器来创建了,但容器如何来创建对象的呢?——bean的实例化过程
常见三种方法,主要是构造方法和factorybean
方法 | 描述 |
---|---|
构造方法实例化 | |
静态工厂实例化 | |
实例工厂实例化 |
3.bean的生命周期
bean对象从创建到销毁的整体过程。
最后以一张图总结bean相关:
4.IOC管理第三方bean
之前的类都是我们自己创建的,所以可以方便的交给IOC去管理,但是如果要用到第三方类/jar包,该怎么配置管理?
(标签配置类的方法略过,直接用下面的注解管理!)
DI相关之注入
(简单介绍下,后面有注解开发)
(1)setter注入
对于引用数据类型使用的是<property name="" ref=""/>
对于简单数据类型使用的是<property name="" value=""/>
(2)构造器注入
(3)自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配——添加autowire属性
依赖注入相关:
注解开发
1.介绍
为什么要用注解开发?——简化配置开发(之前IOC和DI的实现都需要写在applicationContext.xml配置文件的bean标签中)
怎么实现注解开发?——删除原来的bean标签,直接在类上方添加@Component
注解(注解在哪个类上方这个类就是bean)。如:
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
与配置文件的对应关系是:
纯注解开发模式:使用Java类替代配置文件,即在配置类上添加@Configuration
注解,将其标识为一个配置类,替换applicationContext.xml
。然后在配置类上添加包扫描注解
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
2.注解之bean&DI
将前面bean和DI通过配置实现的内容都换成对应的注解实现!
(1)bean
@Scope("prototype")
——@Scope设置bean的作用范围(将某个类变成非单例)
@PostConstruct
——在构造方法之后执行,替换 init-method
@PreDestroy
——在销毁方法之前执行,替换 destroy-method
(2)DI依赖注入
@Autowired
注解:写在属性上并将setter方法删除掉,自动装配
@Qualifier
注解:指定注入哪个名称的bean对象,不能独立使用,和@Autowired
一起使用
@Value
——从properties配置文件中读取内容进行使用
3.注解管理第三方bean
@bean
——将方法的返回值制作为Spring管理的一个bean对象
@Import
——手动引入需要加载的配置类
4.常见注解的含义
名称 | 类型 | 位置 | 作用 |
---|---|---|---|
@Component | 类注解 | 类定义上方 | 设置该类为Spring管理的Bean |
@Configuration | 类注解 | 类定义上方 | 设置该类为Spring配置类 |
@ComponentScan | 类注解 | 类定义上方 | 设置spring配置类扫描路径,用于加载使用注解格式定义的bean |
@Scope | 类注解 | 类定义上方 | 设置该类创建对象的作用范围 可用于设置创建出的bean是否为单例对象 |
@Autowired | 属性注解 或 方法注解 | 属性定义上方 或 标准set方法上方 或 类set方法上方 | 为引用类型属性设置值 |
@Qualifier | 属性注解 或 方法注解 | 属性定义上方 或 标准set方法上方 | 为引用类型属性指定注入的beanId |
@Value | 属性注解 或 方法注解 | 属性定义上方 或 标准set方法上方 | 为 基本数据类型 或 字符串类型 属性设置值 |
@Bean | 方法注解 | 方法定义上方 | 设置该方法的返回值作为spring管理的bean |
@Import | 类注解 | 类定义上方 | 导入配置类 |
XML配置与注解对照图:
AOP
Spring最重要的两大概念之二 —— AOP
1.介绍
AOP(Aspect Oriented Programming):面向切面编程,一种编程范式,指导开发者如何组织程序结构。
作用:在不改动原始设计的基础上为其进行功能增强
2.核心概念
(1)连接点((JoinPoint)
程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等,在SpringAOP中,理解为方法的执行
(2)切入点(Pointcut)
匹配连接点的式子(需要增强的方法)
在SpringAOP中,一个切入点可以描述一个具体方法,也可匹配多个方法
(3) 通知(Advice)
在切入点处执行的操作,也就是共性功能(最终以存放共性功能的方法呈现)
(4)通知类
定义通知的类,通知一般是方法,所以需要写在类中,这个类就是通知类
(5)切面(Aspect)
描述通知与切入点的对应关系
具体可以看下图:
3.常见注解
名称 | 类型 | 位置 | 作用 |
---|---|---|---|
@EnableAspectJAutoProxy | 配置类注解 | 配置类定义上方 | 开启注解格式AOP功能 |
@Aspect | 类注解 | 切面类定义上方 | 设置当前类为AOP切面类 |
@Pointcut | 方法注解 | 切入点方法定义上方 | 设置切入点方法 |
@Before | 方法注解 | 通知方法定义上方 | 设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行 |
AOP事务管理
1.Spring事务
事务其实是在Mysql数据库中最先接触,事务的作用是:在数据层保障一系列的数据库操作同成功同失败
Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败
为什么业务层也需要事务?
- 转账业务会有两次数据层的调用,一次是加钱一次是减钱
- 把事务放在数据层,加钱和减钱就有两个事务
- 没办法保证加钱和减钱同时成功或者同时失败
- 这个时候就需要将事务放在业务层进行处理
相关注解
名称 | 类型 | 位置 | 作用 |
---|---|---|---|
@EnableTransactionManagement | 配置类注解 | 配置类定义上方 | 设置当前Spring环境中开启注解式事务支持 |
@Transactional | 接口注解,类注解,方法注解 | 业务层接口上方,业务层实现类上方,业务方法上方 | 为当前业务层方法添加事务(如果设置在类或接口上方则类或接口中所有方法均添加事务) |
2.事务角色
事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法