Spring4实战
Spring致力于全方位的简化Java开发,采取了4种策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式代码。
01.Spring-Core
下载地址:https://repo.spring.io/ui/native/libs-release/org/springframework/spring
IoC(控制反转)
IOC
目的:降低耦合性。
控制反转是软件工程中的一项原则,它将对对象或程序部分的控制转移到容器或框架中。我们最常在面向对象编程的上下文中使用它。
与我们的自定义代码调用库的传统编程相比,IoC 使框架能够控制程序的流程并调用我们的自定义代码。为了实现这一点,框架使用内置附加行为的抽象。如果我们想添加自己的行为,我们需要扩展框架的类或插入我们自己的类。
我们可以通过各种机制来实现控制反转,例如:策略设计模式、服务定位器模式、工厂模式和依赖注入(DI)。
IOC操作Bean管理(FactoryBean)
Spring里的Bean分为普通Bean和工厂Bean(FactoryBean),普通Bean在配置文件中配置的类即是Bean实例类型;工厂Bean返回的类型可以和配置文件中定义的类型不同。
工厂Bean实现:
DI (依赖注入)
依赖注入是我们可以用来实现 IoC 的一种模式,其中被反转的控制是设置对象的依赖关系。
将对象与其他对象连接起来,或将对象“注入”到其他对象中,是由汇编程序完成的,而不是由对象本身完成的。
AOP (切面编程)
不改变源码的前提下,增强源码功能。实现手段有JDK动态代理和cglib动态代理。
优势
- 方便解耦、简化开发
- AOP的编程支持
- 声明式事务的支持
- 方便程序的测试
- 方便继承各种优秀的框架
- 降低Java EE API的使用难度
- Java源码是经典学习范例
实现手段
接口的JDK动态代理
UserDao.java:接口类
1 | |
UserDaoImpl.java:接口实现类
1 | |
JDKProxy.java:动态代理增强例子
1 | |
OUTPUT:
1 | |
无接口的cglib动态代理
术语
- 连接点:类里面哪些方法可以被增强,这些方法称为连接点
- 切入点:实际被真正增强的方法,称为切入点
- 通知(增强):
- 实际增强的逻辑部分称为通知(增强)
- 通知有多种类型:前置通知、后置通知、环绕通知、异常通知、最终通知
- 切面:是动作,把通知应用到切入点的过程称为切面。
AOP操作(准备)
Spring框架一般基于AspectJ实现AOP操作
1. 什么是AspectJ
不是Spring的组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作
2. 基于AspectJ实现AOP操作
基于XML配置文件实现
*基于注解方式实现(使用)
3. 导包
4. 切入点表达式
作用:知道对哪个类里面的那个方法进行增强
语法结构:
1 | |
举例1:对io.ainexur.dao.BookDao类里面的add进行增强
1 | |
举例2:对io.ainexur.dao.BookDao类里面的所有方法进行增强
1 | |
举例3:对io.ainexur.dao包里的所有类里面的所有方法进行增强
1 | |
5. AspectJ注解实现
创建被增强类User.class
1 | |
创建增强类UserProxy.class
1 | |
进行通知文件的配置:
- 在Spring配置文件中,开启注解扫描
- 使用注解创建User和UserProxy对象:
@Component - 在增强类上面添加注解:
@Aspect - 在Spring配置文件中开启生成代理对象
6.AspectJ XML配置文件实现
JdbcTemplate
Spring对jdbc的封装, 使用JdbcTemplate方便实现对数据库操作。
准备工作
1.导包
2. 在Spring配置文件中配置连接池
1 | |
3.配置JdbcTemplate对象
1 | |
4. 创建Service类,创建Dao类,在Dao注入jdbcTemplate对象
组件扫描
1 | |
Dao
1 | |
Service
1 | |
事务操作
事务添加到JavaEE三层结构里的Service层
在Spring进行事务管理操作:
- 有两种方式:编程式事务管理(不经常用)和声明式事务管理(使用)
- 声明式事务管理:
- 基于注解方式(简单,常用)
- 基于XML配置文件方式
在Spring进行声明式事务管理,底层使用AOP
Spring事务管理API:提供一个接口,代表事务管理,这个接口针对不同的框架提供不同的实现类。
基于注解&XML的声明式事务管理
xml配置事务管理器
1 | |
xml开启事务管理
引入
tx命名空间1
2<beans xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">开启事务注解
1
2<!-- 开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>在Service类上(或者Service类里面方法上)添加注解
1
2
3
4
5@Service
@Transactional
public class BookService {
//...
}@Transactional该注解添加到类上,则类里所有方法都添加事务@Transactional该注解添加到方法上,则只为该方法添加事务
声明式事务管理参数配置(注解配置相关参数)

propagation
事务传播行为
多事务方法直接进行调用,这个过程事务是如何进行管理的
- 事务方法:对数据库表数据进行变化的操作(增删改是,查不是)
1
2
3
4
5
6
7
8
9@Transactional
public void add() {
update();
}
public void upadte() {
}
//通过add()调用upadte(),事务是怎么处理的,这个过程就叫传播行为Spring框架事务传播有七种传播行为

主要使用前两种,其他了解有个印象就行
配置举例:
1 | |
ioslation
事务隔离级别
事务有特性称为隔离性,多事务操作之间不会产生影响。不考虑隔离性产生很多问题:
三个读问题
- 脏读:一个未提交事务读取到另一个未提交事务的数据(问题)
- 不可重复读:一个未提交事务读到一个已经提交事务的数据(现象)
- 幻读(虚读):一个未提交事务读到另一个提交事务添加数据()
通过设置事务隔离性,解决读问题
四个隔离级别:

配置举例:
1 | |
MySQL中默认的隔离级别
timeout
超时时间:
- 事务需要在一定的时间内进行提交,如果不提交进行回滚
- 默认为-1(即不超时),设置时间以秒为单位进行计算
配置举例
1 | |
readOnly
是否只读:
- 读:查询操作,写:添加修改删除操作
- readOnly默认值是False,表示可以增删改查
- 设置readOnly为True时,只能使用查询
配置举例
1 | |
rollbackFor
回滚:
- 设置出现哪些异常进行事务回滚
noRollbackFor
不回滚:
- 设置出现哪些异常不进行事务回滚
基于XML配置的方式声明式事务管理
- 配置事务管理器
- 配置通知(增强的类)
- 配置切入点和切面(要增强的类,即要使用事务的类)
XML配置例子:
1 | |
完全注解方式的声明式事务管理
创建配置类TxConfig.java
1 | |
测试
1 | |
结果
配置类代理XML配置,和XML配置运行结果一致。
Spring5新功能和特性
更
整个Spring5框架基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除
Spring5框架自带了日志的封装
- Spring5已经移除了Log4jConfigListener,官方建议使用Log4j2
- Spring5框架整合Log4j2
- 整合Log4j2
- 引入jar包
- 创建
Log4j2.xml配置文件,log4j2.xml文件名字是固定的。
Spring5框架核心容器支持
@Nullable注解@Nullable注解可以用在方法、属性、参数上- 用在方法上,表示返回值可以为空
- 用在属性上,表示属性值可以为空
- 用在参数上,表示参数可以为空
Spring5核心容器支持函数式风格
GenericApplicationContext1
2
3
4
5
6
7
8
9
10
11
12@Test
public void testGenericApplicationContext() {
//创建GenericApplicationContext对象
GenericApplicationContext context =
new GenericApplicationContext();
//调用context方法对象注册
context.refresh();
context.registerBean(User.class, () -> new User());
//获取在Spring中注册的对象
User user = context.getBean(User.class);
System.out.println(user);
}Spring5支持整合JUnit5
新
- SpringWebFlux
Spring单元测试
Spring整合JUnit4
引入Spring相关依赖
spring-test-5.3.16.jar、hamcrest-core-1.3.jar、junit-4.13.1.jar创建测试类
JTest4.java1
2
3
4
5
6
7
8
9
10
11
12
13
14@RunWith(SpringJUnit4ClassRunner.class) //单元测试框架
@ContextConfiguration("classpath:bean1.xml") //加载配置文件
public class JTest4 {
@Autowired
private UserService userService;
@Test
public void test1() {
userService.accountMoney();
}
}
//通过注解自动加载配置文件,省去每个测试方法都需要手动加载配置文件。
//自动加载配置文件后,可以通过注解注入属性
Spring5整合JUnit5
引入相关依赖
1
2
3
4
5
6
7
8apiguardian-api-1.1.2.jar
junit-jupiter-5.8.1.jar
junit-jupiter-api-5.8.1.jar
junit-jupiter-engine-5.8.1.jar
junit-jupiter-params-5.8.1.jar
junit-platform-commons-1.8.1.jar
junit-platform-engine-1.8.1.jar
opentest4j-1.2.0.jar创建测试类
JTest5.java:1
2
3
4
5
6
7
8
9
10
11
12
13
14//@ExtendWith(SpringExtension.class)
//@ContextConfiguration("classpath:bean1.xml")
@SpringJUnitConfig(locations = "classpath:bean1.xml") //复合注解,代替上面两个,简化配置
public class JTest5 {
@Autowired
private UserService userService;
@Test
public void test1() {
userService.accountMoney();
}
}
*SpringWebFlux
1.什么是SpringWebFlux
- Spring5添加的新模块,用于Web开发,功能和SpringMVC类似, WebFlux为当前一种比较流行的响应式编程出现的框架。
- 使用传统Web框架,比如SpringMVC,这些都基于Servlet容器;WebFlux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持。核心基于Reactor的相关API实现。
- 异步非阻塞:
2.响应式编程
3.WebFlux执行流程和API
4. SpringWebFlux(基于注解编程模型)
5.SpringWebFlux(基于注解编程模型)
开发步骤
- maven导入Spring包
- 创建Dao接口和实现
- 创建Spring核心配置文件
- 在Spring配置文件中配置UserDaoImpl
- 使用Spring的API获得Beans实例
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!