SpringBoot-Day03(注解大全)

                                                     注解详解

@Profile

package com.xueyou.demo;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
 
 
@Configuration
@Profile(value = "dev")
@Component
public class Chinese implements MoveFactor {
    @Override
    public void speak() {
        System.out.println("我是中国人");
    }
}

@JsonProperty

此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name@JsonProperty("name")

import com.fasterxml.jackson.annotation.JsonProperty; 
   
public class Student { 
   
    @JsonProperty("name") 
    private String trueName; 
   
    public String getTrueName() { 
        return trueName; 
    } 
   
    public void setTrueName(String trueName) { 
        this.trueName = trueName; 
    } 
} 

源码样例:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MthCache {
    String key();
}


@Target 


功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。

ElementType的取值包含以下几种: 

TYPE:类,接口或者枚举
FIELD:域,包含枚举常量
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造方法
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包


@Retention 


功能:指明修饰的注解的生存周期,即会保留到哪个阶段。

RetentionPolicy的取值包含以下三种:

SOURCE:源码级别保留,编译后即丢弃。
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。


@Documented 


功能:指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。

@Inherited


功能:允许子类继承父类中的注解。

注意!:

@interface意思是声明一个注解,方法名对应参数名,返回值类型对应参数类型。


@JSONFiled

mapper.xml文件里面的sql语句带有下划线的,在实体类定义的时候如果不想保持一致去掉下滑线,就需要这个注解里面填写带有下滑线的

@JSONField可以配置到字段方法上,那不同的配置有什么不同呢?下面我们就来看看具体配置到不同的方法上。

我们在创建实体类的时候,都要求属性必须创建get和set方法,否则fastjson将不会进行识别,下面我们看看把@JSONField配置到具体的get和set方法上.

1.序列化(JavaBean --> json)时配置到对应字段的get()方法上

2.反序列化(json --> JavaBean)时配置到对应字段的set()方法上


@NotNull

不能为null,但可以为empty

@NotEmpty

不能为null,而且长度必须大于0

@NotBlank

只能作用在String上,不能为null,而且调用trim()后,长度必须大于0


@Valid

用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping
    public User create (@Valid @RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        user.setId("1");
        return user;
    }
}    

@NotBlank 注解所指的 password 字段,表示验证密码不能为空,如果为空的话,上面 Controller 中的 create 方法会将message 中的"密码不能为空"返回。

public class User {
    private String id;  
    @NotBlank(message = "密码不能为空")
    private String password;
}


@SpringBootApplication

申明让springboot自动给程序进行必要的配置,这个配置等同于@Configuration,@EnableAuto

Configuration,@ComponentScan三个配置。


@Controller

用于定义控制器类,在Spring项目中由控制器负责将用户发来请求URL的地址转发到对应的服务接口(service层),一般这个注解在类中,通常需要配合@RequestMapping使用。

在SpringBoot中上面两个注解会合起来使用@RestController


@ResponseBody

表示该方法的返回结果直接写入HTTP response body中,一般在异步获取数据式使用,用于构建RESTful的API接口,在使用了@RequestMapping后,返回值通常解析跳转为路径,加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中,比如异步获取json数据,加上@ResponseBody后,会直接返回json数据。

该注解会和@RequestMapping一起使用


@RequestMapping

提供路由信息,负责URL到@Controller中的具体的URL地址

 


@EnableAutoConfiguration

开启SpringBoot自动装配(auto-configuration)根据你添加的jar依赖自动配置你的Spring应用,具体实现细节看SpringBoot-Day01博客的自动装配原理。


@ComponentScan

表示将该类标识为自动发现扫描组件的类,作用就是如果扫描到有@Component、@Respository、@Controller、@Service等这些注解的类,就会把他们注册为Bean装配到IOC容器中,该注解可以自动收集所有的Spring组件,包括@Configuration注解的类,我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入,如果没有配置也就是默认的情况下,springboot会扫描启动类所在包下以及子包下的使用了@Service、@Respository、@Controller、@Component等注解类把它扫描好注册为Bean装配到IOC容器中。


@Autowired(type="type")(Spring提供的)

自动装配IOC容器中的bean

自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

@Qualifier

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者

@Resource(name="name",type="type")(Java提供的)

没有括号内内容的话,默认byName。与@Autowired干类似的事。


@Service

一般用于修饰service层的组件

@Repository

一般用于修饰dao层(model层)的组件

使用@Repository注解可以确保DAO或者respositories提供异常转译,这个注解修饰的DAO或者respositories类会被@ComponentScan发现并配置,同时也不需要为他们提供xml配置项。

@Component

泛指组件当组件不好进行归类的时候,我们可以使用这个注解进行标注,这个注解其实是Spring框架的注解。


@Configuration

相当于传统的xml配置文件,用的场景可以在springboot配置类上面加这个注解,如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类,可以使用@ImportResource注解加载xml配置文件。

@Import

用来导入其他配置类

@ImportResource

用来加载xml配置文件


@Bean

用@Bean标注方法等价于xml中配置的bean,用法:放在方法的上面,而不是类,意思就是产生一个bean,并交给spring管理。


@Value

在application.properties、application.yml文件中配置(起步依赖的原理)的属性的值,可以用来在程序中加载。


@Inject

等价于默认的@Autowired。只是没有required属性。


                                                          注解列表

@SpringBootApplication @ComponentScan @Configuration
@EnableAutoConfiguration @Component @CommandLineRunner
@RestController @Controller @ResponseBody
@Autowired @PathVariable(获取参数)  
@RepositoryRestResourcepublic 配合spring-boot-starter-data-rest使用  
@JsonBackReference 解决嵌套外链问题  

 

@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中

@ComponentScan:让spring Boot扫描到Configuration类并把它加入到程序上下文。

@Configuration :等同于spring的XML配置文件;使用Java代码可以检查类型安全。

@EnableAutoConfiguration :自动配置。

@ComponentScan :组件扫描,可自动发现和装配一些Bean。

@Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。

@RestController:注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。

@Autowired:自动导入。

@PathVariable:获取参数。

@JsonBackReference:解决嵌套外链问题。

@RepositoryRestResourcepublic:配合spring-boot-starter-data-rest使用。
 


                                                       JPA注解


@Entity

@Table(name="")

表示这是一个实体类,一般用于jpa开发,这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table注解可以省略。


@MappedSuperClass

用在确定父类的entity上,父类的属性可以继承。


@NoRepositoryBean

一般用在父类的repository,有这个注解,spring不会去实例化该repository


@Column

注释在字段上面,如果字段名和表明相同,则可以省略。


@Id

表示该属性为主键


@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”)

表示主键生成策略是SEQUENCE(可以为AUTO、IDENTITY、NATIVE等,AUTO表示可在多个数据库间切换),指定SEQUENCE的名字是repair_seq


@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1)

name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。


@Transient

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式


@JsonIgnore

作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。


@JoinColumn(name=”loginId”)

一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。


@OneToOne、@OneToMany、@ManyToOne

对应hibernate配置文件中的一对一,一对多,多对一。
 


                                                 SpringMvc的注解


@RequestMapping

@RequestMapping("/path")表示该控制器处理所有的"/path"的URL请求,@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上,用在类上,表示类中的所有响应请求的方法都以该Path作为父路径,用在方法上,表示只有这个方法用这个Path作为映射的路径。

该注解里面的六个属性:

            params:指定request中必须包含某些参数值是啥,才让该方法处理。

            headers:指定request中必须包含某些指定的header值,才能让该方法处理请求

            method:指定请求的method类型,GET、POST、PUT、DELETE等

            value:指定请求的实际地址,指定的地址可以是URI Template 模式

            consumes:指定处理请求的提交内容类型(Content-Type),如application/json、text/html

            produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回


@RequestParam

用在方法里面的参数前面。

eg:public Object  getStudent     ( @RequestParam("id")     Integer    id)


@PathVariable

路径变量

eg:参数与@RequestMapping("/usr/local/{大括号里的名字}")一样要相同


                                                       全局异常处理

@ControllerAdvice

包含@Component可以被扫描到。统一处理异常


@ExceptionHandler

用在方法上面,表示遇到这个异常就执行以下的方法


                                 项目中具体配置解析和使用环境


@MappedSuperclass

1:@MappedSuperclass注解使用在父类上,是用来标识父类的

2:@MappedSuperclass标识的类表示其不能映射到数据库表,是因为其不是一个完整的实体类,但是它所拥有的属性能够映射在其子类对应的数据库表中

3:@MappedSuperclass标识的类不能在有@Entity或@Table注解

@Column

1:当实体的属性与其映射的数据库表的列明不同命时,需要使用@Column标注说明,该注解属性通常配置在实体的属性声明成员变量之前,还可以与@Id注解一起使用

2:@Column标注的常用属性是name,用于设置映射数据库表的列名,此外该标注还包含其他多个属性(这里先不审究


@Data

注解在springboo的实体类上,提供类所属性的getting、setting方法,此外还提供了equals、canEqual、hashCode、toString方法


@Setter、@Getter

注解在成员变量上面,分别为他们提供Setting、Getting方法


@Log4j2

注解在类上为类提供一个属性名为log的log4j日志对象,和@Log4j注解类似


@NoArgsConstructor

注解在类上,为类提供一个空参构造的方法

@AllArgsConstructor

注解在类上,为类提供一个有参构造的方法


@EqualsAndHashCode

默认情况下,会使用所有非瞬间和非静态字段来生成equals和hashcode方法,也可以指定具体使用那些属性。


@toString

生产toString方法,默认情况下,会输出类名。所有属性。属性会按照顺序输出,以逗号分隔


@NoArgsConstructor、 @RequiredArgsConstructor 、 @AllArgsConstructor

 

 无参构造器、部分参数构造器、全参构造器,当我们需要重载多个构造器的时候,只能自己手写了。


@NonNull

注解在属性上面,如果注解了就必须不能为Null


@Val

注解在属性上面,如果注解了,就是设置为final类型,可查看源码的注释知道


当你在执行各种持久化方法的时候,实体的状态会随之改变,状态的改变会引发不同的生命周期事件。这些事件可以使用不同的注释符来指示发生时的回调函数。

@javax.persistence.PostLoad:加载后

@javax.persistence.PrePersist:持久化前

@javax.persistence.PostPersist:持久化后

@javax.persistence.PreUpdate:更新前

@javax.persistence.PostUpdate:更新后

@javax.persistence.PreRemove:删除前

@javax.persistence.PostRemove:删除后

1)数据库查询

@PostLoad事件在下列情况下触发:

执行EntityManager.find()或getreference()方法载入一个实体后。

执行JPQL查询后。

EntityManager.refresh()方法被调用后。

2)数据库插入

@PrePersist和@PostPersist事件在实体对象插入到数据库的过程中发生:

@PrePersist事件在调用persist()方法后立刻发生,此时的数据还没有真正插入进数据库。

@PostPersist事件在数据已经插入进数据库后发生。

3)数据库更新

@PreUpdate和@PostUpdate事件的触发由更新实体引起:

@PreUpdate事件在实体的状态同步到数据库之前触发,此时的数据还没有真正更新到数据库。

@PostUpdate事件在实体的状态同步到数据库之后触发,同步在事务提交时发生。

4)数据库删除

@PreRemove和@PostRemove事件的触发由删除实体引起:

@PreRemove事件在实体从数据库删除之前触发,即在调用remove()方法删除时发生,此时的数据还没有真正从数据库中删除。

@PostRemove事件在实体从数据库中删除后触发。

你可能感兴趣的:(SpringBoot-Day03(注解大全))