1. 基础知识
1.1 主要特征
- 核心技术:DI,AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL
- 测试:模拟对象,TestContext 框架,Spring MVC 测试,WebTestClient
- 数据访问:事务,DAO,JDBC,ORM,编组 XML
- Web 支持:SpringMVC 和 Spring WebFlux Web 框架
- 集成:远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存
- 语言:Kotlin,Groovy,动态语言
1.2 主要模块
- Spring Core:基础,可以 Spring 所有的功能都依赖于改库
- Spring Aspects:为与 AspectJ 的集成提供支持
- Spring AOP:提供了面向切面的实现
- Spring JDBC:JDBC
- Spring JMS:Java 消息服务
- Spring ORM:支持 ORM
- Spring Web:为创建 Web 应用提供支持
- Spring Test:提供 JUnit 和 TestNG 支持
1.3 作用域
2. 主要注解
2.1 SpringBootApplication
@SpringBootApplication
可以看做是下面这几个注解的集合:
@EnableAutoConfiguration
:启用 SpringBoot 的自动装配机制@ComponentScan
:扫描被@Component
,@Service
,@Controller
注解的类,默认扫描改类下面的包@Configuration
:允许在 Spring 上下文中注册额外的 bean 或者导入其它配置类
2.2 Bean 相关
@Autowired
:自动导入对象到类中,根据 type 查找,可以和@Qualifier
配合使用,type 一样就根据 name 查找@Component
:组件@Repository
:持久层@Service
:业务层@Controller
:控制层@RestController
:相当于@Controller
加@ResponseBody
@Scope
:指定 bean 的作用域@Configuration
:一般用来生命配置类
2.3 处理 HTTP 请求
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
2.4 前后端传值
@PathVariable
:方法的参数的注解,去方法上的 Mapping 注解里找同名的路劲参数@RequestParam
:?
后面接的参数@RequestBody
:读取 request 请求,要求其为application/json
,自动将数据绑定到 Java 对象,系统会使用HttpMessageConverter
将 body 转化为 java 对象,converter 可以自定义
2.5 读取配置
@Value
:读取比较简单的配置信息@ConfigurationProperties
:读取配置信息与 bean 绑定@PropertySource
:读取指定的 properties
2.6 字段校验
@NotEmpty
@NotBlank
@Null
@NotNull
@AssertTrue
@AssertFalse
@Pattern(regex=,flag=)
被注释的元素必须符合指定的正则表达式@Email
被注释的元素必须是 Email 格式。@Min(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max=, min=)
被注释的元素的大小必须在指定的范围内@Digits (integer, fraction)
被注释的元素必须是一个数字,其值必须在可接受的范围内@Past
被注释的元素必须是一个过去的日期@Future
被注释的元素必须是一个将来的日期@Valid
:给@RequestBody
加这个校验,表示这个请求体需要校验,也可以给@PathVariable
或者@RequestParam
加,同时要加上校验的规则
2.7 处理异常
@ControllerAdvice
:注解定义全局异常处理类@ExceptionHandler
:注解声明异常处理方法
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
/**
* 请求参数异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletRequest request) {
......
}
}
2.8 JPA 相关
@Entity
:对应数据库数据的实体类@Table
:表名@Id
:主键@GeneratedValue
:主键生成策略,GenerationType
TABLE
:使用一个特定的数据库表格来保存主键SEQUENCE
:使用 sequence 生成主键IDENTITY
:自增AUTO
:交给持久化引擎,默认值
@GenericGenerator
:生命主键生成策略
@Id
@GeneratedValue(generator = "IdentityIdGenerator")
@GenericGenerator(name = "IdentityIdGenerator", strategy = "identity")
private Long id;
@Column
:指定字段@Transient
:声明不需要持久化的字段@Lob
:声明大字段@Enumerated
:声明枚举字段
public enum Gender {
MALE("男性"),
FEMALE("女性");
private String value;
Gender(String str){
value=str;
}
}
@Enumerated(EnumType.STRING)
private Gender gender;
增加审计功能
- 继承
AbstractAuditBase
,里面有四个字段:Instant createdAt
,Instant updatedAt
,String createdBy
,String updatedBy
- 审计功能配置:
@Configuration
@EnableJpaAuditing
public class AuditSecurityConfiguration {
@Bean
AuditorAware<String> auditorAware() {
return () -> Optional.ofNullable(SecurityContextHolder.getContext())
.map(SecurityContext::getAuthentication)
.filter(Authentication::isAuthenticated)
.map(Authentication::getName);
}
}
@Modifying
@Modifiying
,提示改操作是修改操作- 表关系:
@OneToOne
@OneToMany
@ManyToOne
@ManyToMany
2. 9 事务
@Transactional
- 作用于类:该类的所有 public 方法都配置相同的事务属性
- 作用与方法:方法的事务配置高于类的事务配置
3. Spring 事务
3.1 事务管理方式
- 编程式事务:通过
TransactionTemplate
或者TransactionManager
手动管理事务 - 声明式事务:实际是通过 AOP 实现的
3.2 事务管理主要接口
PlatformTransactionManager
:事务管理器,Spring 事务策略的核心,Spring 为各个平台都提供了对饮的事务管理器getTransaction()
commit()
rollback()
TransactionDefinition
:事务定义信息(隔离级别、传播行为、超时、只读、回滚)TransactionStaus
:事务运行状态
3.3 隔离级别 isolation
DEFAULT
:数据库默认的隔离级别READ_UNCOMMITTED
READ_COMMITTED
REPEATABLE_READ
SERIALIZABLE
3.4 传播行为 propagation
REQUIRED
:默认的,如果当前事务存在,加入该事务,不存在就创建SUPPORTS
:事务存在就加入,不存在以非事务的方式继续运行MANDATORY
:事务存在就加入,事务不存在抛异常REQUIREDS_NEW
:重新创建一个新的事务,当前如果存在事务,暂停当前事务NOT_SUPPORTED
:以非事务的方式运行,如果当前存在事务,暂停当前事务NEVER
:以非事务运行,如果当前有事务就抛异常NESTED
:如果当前存在事务,创建一个嵌套事务,如果没有事务就和REQUIRED
一样
3.5 事务超时属性
- 就是指定一个事务所允许的执行的最长的时间,超过就回滚,默认为
-1
3.6 事务只读属性
- 对于只有读取数据查询的事务,可以指定事务类型为 readonly,即只读事务。只读事务不涉及数据的修改,数据库会提供一些优化手段,适合用在有多条数据库查询操作的方法中。
3.7 事务回滚规则
@Transactional(rollbackFor= MyException.class)
3.8 自调问题
- 若同一类中的其他没有
@Transactional
注解的方法内部调用有@Transactional
注解的方法,有@Transactional
注解的方法的事务会失效。 - 这是由于 Spring AOP 代理的原因造成的,因为只有当
@Transactional
注解的方法在类以外被调用的时候,Spring 事务管理才生效。