后端 | SSM框架 | Spring
笔记来源:黑马程序员SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术
一、核心概念
代码书写现状:耦合度高。
解决方案:使用对象时,在程序中不要主动new产生对象,转换为由外部提供对象。
1、IOC(Inversion Of Control)控制反转
对象的创建控制权由程序转移到外部,这种思想称为控制反转。
Spring技术对IOC思想的实现:
Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的“外部”。
IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为Bean。
2、DI(Dependency Injection)依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
二、IOC入门
导入Spring坐标:
定义Spring管理的类(接口):
创建Spring配置文件,配置对应类作为Spring管理的bean:
初始化IOC容器(Spring核心容器/Spring容器),通过容器获取bean:
三、DI入门
1、依赖注入方式
setter注入——引用类型、简单类型:
删除使用new的形式创建对象的代码,在bean中定义引用类型、简单类型属性并提供可访问的set方法。
配置中使用property标签ref属性注入引用类型对象、value属性注入简单类型数据。
构造器注入——引用类型、简单类型:
在bean中定义引用类型、简单类型属性,并提供可访问的构造方法。
配置中使用constructor-arg标签注入引用类型对象、简单类型数据。
2、依赖注入方式选择
强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现。
可选依赖使用setter注入进行,灵活性强。
Spring容器倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨。
如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入。
实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入。
自己开发的模块推荐使用setter注入。
四、bean
1、bean的基础配置
bean别名配置:使用name属性,可定义多个,多个之间使用逗号、分号和空格分隔。
bean作用范围配置:使用scope属性,可选值为singleton(默认值,单例)、prototype(非单例)。
2、bean的实例化
构造方法(常用):提供可访问的构造方法。
静态工厂:
实例工厂:
FactoryBean:
3、bean的生命周期
生命周期:
初始化容器:创建对象(内存分配)、执行构造方法、执行属性注入(set操作)、执行bean初始化方法。
使用bean:执行业务操作。
关闭/销毁容器:执行bean销毁方法。
生命周期控制:
提供生命周期控制方法:
配置生命周期控制方法:
接口控制:
销毁时机:
容器关闭前触发bean的销毁。
关闭容器方式:
手工关闭容器:ConfigurableApplicationContext接口close()操作。
注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机,ConfigurableApplicationContext接口registerShutdownHook()操作。
4、依赖自动装配
IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean的过程中称为自动装配。
自动装配方式:配置中使用bean标签autowire属性设置自动装配的类型
按类型(常用)
按名称
按构造方法
不启用自动装配
自动装配特征:
自动装配用于引用类型依赖注入,不能对简单类型进行操作。
使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用。
使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名和配置耦合,不推荐使用。
自动装配优先级低于setter注入和构造器注入,同时出现时自动装配配置失效。
五、集合注入
数组、List、Set、Map、Properties
六、加载properties文件
开启context命名空间
使用context命名空间,加载指定properties文件
使用${}读取加载的属性值
其他
不加载系统属性
加载多个properties文件
加载所有properties文件
加载properties文件标准格式
从类路径或jar包中搜索并加载properties文件
七、容器
1、创建容器
类路径加载配置文件
文件路径加载配置文件
加载多个配置文件
2、获取bean
使用bean名称获取
使用bean名称获取并指定类型
使用bean类型获取
八、注解开发
1、注解开发定义bean
使用@Component定义bean
核心配置文件中通过组件扫描加载bean
Spring提供@Component注解的三个衍生注解:
@Controller:用于表现层bean定义
@Service:用于业务层bean定义
@Respository:用于数据层bean定义
2、纯注解开发模式
Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道。
Java类代替Spring核心配置文件。
@Configuration注解用于设置当前类为配置类。
@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式。
读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象。
3、bean管理
作用范围:使用@Scope定义bean作用范围。
生命周期:使用@PostConstruct、@PreDestory定义bean生命周期。
4、依赖注入
使用@Autowired注解开启自动装配模式(按类型)。
注意:
自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法。
自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法。
使用@Qualifier注解开启指定名称装配bean。
注意:
@Qualifier注解无法单独使用,必须配合@Autowired注解使用。
使用@Value实现简单类型注入。
注意:
路径仅支持单一文件配置,多文件使用数组格式配置,不允许使用通配符*。
5、第三方bean管理
使用@Bean配置第三方bean。
使用独立的配置类管理第三方bean。
导入式:独立的配置类不加@Configuration,使用@Import注解导入独立的配置类,@Import注解只能写一次,如果要导入多个独立配置类,以数组形式导入。
扫描式:独立的配置类加@Configuration,使用@ComponentScan注解扫描配置类所在的包,加载对应的配置类信息。
6、第三方bean依赖注入
简单类型依赖注入:
引用类型依赖注入:
引用类型注入只需要为bean提供方法设置形参即可,容器会根据类型自动装配对象。
九、AOP
1、AOP简介
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。
作用:在不惊动原始设计的基础上为其进行功能增强。
AOP核心概念
连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等。在SpringAOP中,理解为方法的执行。
切入点(PointCut):匹配连接点的式子。在SpringAOP中,一个切入点可以只描述一个具体方法,也可以匹配多个方法。
通知(Advice):在切入点处执行的操作,也就是共性能力。在SpringAOP中,功能最终以方法的形式呈现。
通知类:定义通知的类。
切面(Aspect):描述通知与切入点的对应关系。

2、AOP入门案例
导入AOP相关坐标
定义dao接口与实现类
定义通知类,制作通知
定义切入点(切入点依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑)
绑定切入点与通知关系,并指定通知添加到原始连接点的具体执行位置
定义通知类受Spring容器管理,并定义当前类为切面类
开启Spring对AOP注解驱动支持
3、AOP工作流程
Spring容器启动
读取所有切面配置中(使用的)的切入点
初始化bean,判定bean对应的类中的方法是否匹配到任意切入点
匹配失败,创建对象。
匹配成功,创建原始对象(目标对象)的代理对象。
获取bean执行方法
获取bean,调用方法并执行,完成操作。
获取的bean是代理对象时,根据代理对象的运行模式运行原始方法与增强的内容,完成操作。
AOP核心概念:
目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的。
代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现。
4、AOP切入点表达式
切入点:要进行增强的方法。
切入点表达式:要进行增强的方法的描述方式。
切入点表达式标准格式:动作关键词(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名)
可以使用通配符描述切入点,快速描述
*:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现。
..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写。
+:专用于匹配子类类型。
5、AOP通知类型
AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置。
AOP通知分类:
前置通知:@Before
后置通知:@After
环绕通知:@Around
环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后添加通知。
通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行。
对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,必须设定为Object类型。
原始方法的返回值如果是void类型,通知方法的返回值类型可以设置为void,也可以设置为Object。
由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须抛出Throwable对象。
返回后通知:@AfterReturning
抛出异常后通知:@AfterThrowing
6、AOP通知获取数据
获取切入点方法的参数
JoinPoint:适用于前置、后置、返回后、抛出异常后通知
ProceedJoinPoint:适用于环绕通知
获取切入点方法的返回值
返回后通知
环绕通知
获取切入点方法的异常
抛出异常后通知
环绕通知
十、Spring事务
1、Spring事务简介
事务作用:在数据层保障一系列的数据库操作同成功同失败。
Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败。
2、Spring事务角色
事务管理员:发起事务方,在Spring中通常指代业务层开始事务的方法。
事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法。
3、Spring事务配置属性
readOnly:设置是否为只读事务。
timeout:设置事务超时时间,timeout=-1表示永不超时。
rollbackFor:设置事务回滚异常(class)。
rollbackForClassName:设置事务回滚异常(String)。
noRollbackFor:设置事务不回滚异常(class)。
noRollbackForClassName:设置事务不回滚异常(String)。
propagation:设置事务传播行为。
REQUIRED(默认):事务管理员有事务,事务协调员就加入;事务管理员无事务,事务协调员就新建事务。
REQUIRED_NEW:事务管理员有无事务,事务协调员都新建事务。
SUPPORTS:事务管理员有事务,事务协调员就加入;事务管理员无事务,事务协调员也无事务。
NOT_SUPPORTED:事务管理员有无事务,事务协调员都无事务。
MANDATORY:事务管理员有事务,事务协调员就加入;事务管理员无事务,事务协调员就报错。
NEVER:事务管理员有事务,事务协调员就报错;事务管理员无事务,事务协调员也无事务。
NESTED:设置savePoint,一旦事务回滚,事务将回滚到savePoint处,交由客户响应提交/回滚。