spring boot注解(二)

  • JPA,在服务器启动的时候,jpa的启动管理类会自动扫荡继承了JpaRepository的接口,然后添加到动态代理管理中,然后注入到spring的容器中。

    • @Entity当实体类名和表名相同,实体属性和表字段相同时,会默认完成实体属性和表字段的映射,当表名和实体类名不同,表字段和实体属性不同时,需要使用@Table和@Column注解完成实体和表直接的映射

      查看@Entity注解,发现其只有一个属性name,表示其所对应的数据库中的表名

    • @Table当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明,该标注与 @Entity 注解并列使用,置于实体类声明语句之前,

      @Table注解的常用选项是 name,用于指明数据库的表名 @Table注解还有两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名

    • @Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息

    • @Id注释指定表的主键

  • 使用@SpringBootTest后,Spring将加载所有被管理的bean,基本等同于启动了整个服务,此时便可以开始功能测试。

    由于web服务是最常见的服务,且我们对于web服务的测试有一些特殊的期望,所以@SpringBootTest注解中,给出了webEnvironment参数指定了web的environment,该参数的值一共有四个可选值:

    • MOCK:此值为默认值,该类型提供一个mock环境,可以和@AutoConfigureMockMvc或@AutoConfigureWebTestClient搭配使用,开启Mock相关的功能。注意此时内嵌的服务(servlet容器)并没有真正启动,也不会监听web服务端口。

    • RANDOM_PORT:启动一个真实的web服务,监听一个随机端口。

    • DEFINED_PORT:启动一个真实的web服务,监听一个定义好的端口(从application.properties读取)。

    • NONE:启动一个非web的ApplicationContext,既不提供mock环境,也不提供真实的web服务。

注:如果当前服务的classpath中没有包含web相关的依赖,spring将启动一个非web的ApplicationContext,此时的webEnvironment就没有什么意义了。使用@Transactional 自动回滚测试数据

  • EnableCaching,启用缓存注解

    • @Cacheable,缓存中有就使用缓存数据,参数如下:

      • value、cacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),用于指定缓存存储的集合名。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必须有的value属性,也成为非必需项了

      • key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值,若自己配置需使用SpEL表达式,比如:

        • @Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值

        • @Cacheable(value="user",key = "#user.id"):缓存使用参数user作为value,user.id作为key

      • condition:缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有当第一个参数的长度小于3的时候才会被缓存。

      • unless:另外一个缓存条件参数,非必需,需使用SpEL表达式。它不同于condition参数的地方在于它的判断时机,该条件是在函数被调用之后才做判断的,所以它可以通过对result进行判断。

      • keyGenerator:用于指定key生成器,非必需。若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。需要注意的是:该参数与key是互斥的

      • cacheManager:用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用

      • cacheResolver:用于指定使用那个缓存解析器,非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。

    • @CacheEvict,清除缓存

    • @CachePut,更新或添加缓存

    • @CacheConfig,配置该类中会用到的一些共用的缓存配置

  • 校验controller参数有效性的注解

    • @NotBlank、@NotNull、@Max...等一系列注解,用在entity类的属性上,校验属性有效性

    • @Valid,用在controller方法的参数上,校验实体类属性的有效性,使用BindingResult获取验证结果

    //entity
    public class User {

       /** 姓名 */
       @NotBlank(message = "请输入名称")
       @Length(message = "名称不能超过个 {max} 字符", max = 10)
       public String name;
    }    

    //controller
    @RestController
    public class UserController{
       @PostMapping("/add")
       public String add(@Valid User user,BindingResult bindingResult){
           if(bindingResult.hasErrors){
               return bindingResult.getAllErrors().get(0).getDefaultMessage();
          }
           return "add success"
      }
    }
  • @NoRepositoryBean:确保添加了该注解的 repository 接口不会在运行时被创建实例。 也就是说,使用了该注解的接口不会被单独创建实例,只会作为其他接口的父接口而被使用。

    在服务器启动的时候,jpa的启动管理类会自动扫荡继承了JpaRepository的接口,然后添加到动态代理管理中,然后注入到spring的容器中。

    即使用了该注解的接口不会被加入到spring的容器中,继承该接口的子接口会被加入到spring的容器中。

  • @Autowired:默认根据类型注入,当同一个接口有多个实现类时,只使用@Autowired会报错,因为spring不知道应该注入哪个实现类的bean,有下面两种解决方法

  • @Qualifier:在@Autowired后面使用,根据bean的名称注入

  • @Primary:在实现类加入容器时使用,告诉spring优先使用这个实现类的bean

posted @ 2022-02-16 22:19  hjy1995  阅读(68)  评论(0编辑  收藏  举报