-------------------------------------
SpringFrameWork
一、技术体系结果
单一架构:

分布式架构:

单一架构框架:Spring、SpringMVC、MyBatis
分布式架构:SpringBoot、SpringCloud、中间件
框架=jar包+配置文件
二、SpringFrameWork介绍
主要功能:依赖注入(DI)、面向切面编程(AOP)、声明式事务管理(TX)
三、springIoC容器和核心概念
SpringIoC容器,负责实例化,配置和组装Bean。
配置元数据以XML、Java注解、Java代码形式表现。
spring容器接口的实现类:

spring IoC容器的核心功能:IoC、DI
IoC控制反转:创建对象不是由程序员创建,而是由IoC容器创建。
DI依赖注入:将依赖关系在容器内部进行处理,实现对象的解耦合。
四、SpringIoC实践和应用
Spring IoC/DI实现步骤:
1.编写配置文件:描述组件类信息、组件之间的引用关系
2.实例化IoC容器对象,要指定配置信息
3.如何在java代码中获取组件,使用组件
XML配置:
Bean的信息声明配置
无参构造如何配置:
用<bean>标签,两个属性:id组建的唯一标识、class组件类的权限定符


静态工厂如何配置:

非静态实例工厂如何配置:

总结:

Bean依赖注入配置
主要注入方式:基于构造函数的注入、基于setter的依赖注入
<constructor-arg 构造参数传值的DI配置
单构造参数注入:

多个构造参数注入:【赋值 直接属性用value,引用用ref】
按照参数顺序赋值

通过名字找参数,可以不用按照顺序。
第三种方式,通过参数的下角标指定填写。

setter方法注入:

IoC容器创建和使用

IoC容器获取Bean的三种方式

第三种方式,如果有多个同类型的bean,会报不唯一错误。

组件Bean的作用域和周期方法配置
周期方法:到了对应的时间节点就会主动被调用的方法。只有等待和编写对应的业务逻辑即可。
init方法,destroy方法。
下图,设置init和destroy方法。

destroy方法,要释放IoC容器才能调用。
作用域:Bean作用域由scope属性决定。


FactoryBean的特性和使用
提供一个getobject()方法,可以在里面写自己的实例化逻辑。

想用javaBean的factoryBean,就写一个JavaBeanFactoryBean的类。

配置文件:

基于XML整合三层架构组件
把数据库交给IoC管理

下面是一个实例:
dao层

service层

controller层

xml文件配置【注意看下面的注释,配的是什么】

测试模块:

xml方式配置的问题:【XML方式基本被淘汰了】
1.注入的属性必须添加setter方法,代码结构乱
2.配置文件和java代码分离,编写不方便。
3.XML配置文件解析效率低。
注解配置:
Bean注解标记和扫描(IoC)

上面这些注解功能没有任何区别,都是将java类变成springbean。只是用名字对所用地方做个区分。
进行IoC的配置分两步:第一步:标记注解@component;第二步:配置指定的包


下图为测试的代码: 【注意Bean的默认名id是首字母小写】

排除某些包下的注解:<exclude-filter>标签

指定某些包,只扫描指定的【注意后面的user-default设成false】

组件Bean作用域和周期方法注解
周期方法注解:
构造函数@PostConstruct
析构函数@PreDestroy

作用域:【用@scope标注】


Bean属性赋值:引用类型自动装配DI

@Autowired标注属性,直接做DI,不用setter方法了。

@resource=@autowired+@qualifier

Bean属性赋值:基本类型属性赋值DI
一般直接赋值即可,@value注解主要用于读取外部文件。

基于注解+XML方式的三层架构组件
IoC注解:@Component、@Controller、@Service、@Repository
DI注解:
其他的Bean:@autowired 自动装配、@Qualifier、@Resource
基本类型:直接赋值,@value主要引外部配置文件

配置类配置:
配置类和完全注解开发介绍
替代XML方式

创建一个配置类

这次 IoC容器需要根据配置类来声明。两种创建IoC容器方式
下图为测试类:

@Bean注解的使用
第三方使用方式,有一个第三方就声明一个方法:



下图:引用其他ioc组件,直接调用对方的bean方法。

@Import注解的使用

相当于一种汇总机制。多个配置类,用@import,可以把其他配置类整合到第一个配置类中,这样只需要加载一个配置类即可。
配置类案例
配置类的作用是替代XML;替代扫描标签,替代外部配置标签,替代第三方bean标签
注解:
如何合适呢个名一个配置类?创建一个类,加个@configuration
如何扫描包注解?@componentscan
如何引用外部配置?@propertysorce
如何声明bean?@Bean
使用配置类,对应的IoC容器也变了,classpathxml..变成Annotationconfig...


三种配置方法总结:
纯XML方式:

XML+注解方式:

完全注解方式:

整合spring5-test5搭建测试环境


五、Spring AOP面向切面编程
场景设定和问题复现
比如计算器的加减乘除,每个都要求打印输入和结果输出,每个都要,要重复四次,冗余且不方便维护。

动态插入如何实现?
解决技术代理模式
如何实现动态插入?代理模式,把非核心业务剥离出来,交给代理。
代理技术:静态代理【自己每个目标都要创建一个代理类】,动态代理【不用自己创建,运行过程中自己查找】
静态代理:知道有,基本不用
代理类:非核心业务,调用目标类的方法

目标类:只有核心业务

使用:

动态代理:

有接口用JDK,没有接口用cglib

面向切面编程思维AOP
AOP是一种横向编程思维,将代码中的重复的非核心业务提取到一个公共的模块。最终在利用动态代理技术横向插入到各个方法中。【解决非核心代码冗余问题】

AOP框架介绍和关系梳理
核心关注点:核心代码
横切关注点:非核心代码,日志异常等
增强(通知):提取的代码

连接点:哪些方法能被切,被插入代码



织入:切入的动作



SpringAOP基于注解方式实现和细节


在spring中开启支持aspectj:在配置文件中加一行编辑、@enableaspectjautoproxy注解


【配置类一定要扫描增强类@componentscan,不然不起效果】
如何配置增强类:@Aspect



获取通知细节信息



切面表达式语法:



统一切点管理:
切点表达式

最好单独开一个类,在那个类中定义所有的切点表达式


环绕通知:
一个环绕通知可以代替三个,但函数内部需要自己去定义执行。异常也要求抛出去

切面增强优先级的问题:

CGLib的生效场景:【不管有没有实现接口,spring都会生成对象,只不过选择的技术不同】
实现接口用的是jdk
把接口删了,就单独一个类,就用cglib了
注解方式总结:

SpringAOP基于XML方式实现准备工作

加载配置文件:

SpringAOP对获取Bean的影响理解
IoC容器有多个Bean,报不唯一的错误,根据id值指定获取Bean即可。
六、Spring声明式服务
声明式事务概念



基于注解的声明式事务
事务注解添加:@Transactional,
导入AOP注解支持:@EnableAspectJAutoProxy
开启事务注解支持:javaconfig里@EnableTransactionManagement


只读:查询数据库,不修改的时候用,设置readonly。@transactional直接加在类上,作用于所有方法,这时候单独设置读取的方法的readonly

超时时间:



事务异常:

@rollbackfor,包含的异常,报错后回滚,【指定异常回滚】
@norollbackfor,排除掉某个异常,报出这个异常不回滚,一般不用【指定异常不会滚】
默认值runtime,建议指定成Exception

事务的隔离级别:修改isolation属性


事务的传播行为:



事务小总结:
1.先定义一个事务管理器的实现,插拔式
2.开启事务注解的支持
3.加入事务注解
区分
编程式事务:
声明式事务:有框架支持
七、Spring总结


被折叠的 条评论
为什么被折叠?



