Spring 基础

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 createdAtInstant updatedAtString createdByString 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 事务管理才生效。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值