美文网首页程序员
Spring Boot学习之了解注解

Spring Boot学习之了解注解

作者: 我心悠然 | 来源:发表于2020-06-27 13:23 被阅读0次

    准备开始入Spring Boot的坑,从最基础的开始学习,本章是用来记录Spring Boot的注解;

    1、@SpringBootApplication:

    这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

    2、@EnableAutoConfiguration

    允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置Spring Bean。如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

    @EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

     ● 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;

     ● 去重,并将exclude和excludeName属性携带的类排除;

     ● 过滤,将满足条件(@Conditional)的自动配置类返回;

    3、@Configuration

    用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

    4、@ComponentScan

    组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。

    @ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

    5、@Repository

    用于标注数据访问组件,即DAO组件。

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

    6、@Service

    一般用于修饰service层的组件。

    如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了。

    @Service("courseDAO")相当于applicationContext.xml文件里面的

    <bean id="courseDAO"

            class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype">

    </bean>

    7、@RestController

    用于标注控制层组件(如struts中的action),表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器;它是@Controller和@ResponseBody的合集。

    8、@ResponseBody

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

    9、@RequestMapping

    RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

    @RequestMapping(value = "/treeList", method = RequestMethod.GET)

    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)——外部传参

    例子:

    @RestController  

    @RequestMapping("/home")  

    public class IndexController {  

        @RequestMapping(value = "/name")  

        String getName(@RequestParam(value = "person", required = false) String personName) {  

            return "Required element of request param";  

        }  

    }  

    在这段代码中,因为 required 被指定为 false,所以 getName() 处理方法对于如下两个 URL 都会进行处理:

    /home/name?person=xyz

    /home/name

    @RequestParam 的 defaultValue 取值就是用来给取值为空的请求参数提供一个默认值的。@RequestParam(value = "person", defaultValue = "John") 当person外部传入为空时,默认值为John。

    @RequestMapping(method = RequestMethod.GET),method表示请求方法

    10、@Component

    泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>

    11、@Bean

    相当于XML中的<bean></bean>,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

    12、@AutoWired

    byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

    当加上(required=false)时,就算找不到bean也不报错。

    13、@Qualifier

    当有多个同一类型的Bean时,可以用@Qualifier("name")来指定,与@Autowired配合使用。Qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,添加@Qualifier注解,需要注意的是@Qualifier的参数名称为我们之前定义@Service注解的名称之一。

    14、@Resource(name="name",type="type")

    没有括号内内容的话,默认byName。与@Autowired干类似的事。(@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。)

    @Resource有两个重要属性,分别是name和type,spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,如果使用type属性则使用byType的自动注入策略。如果都没有指定,则通过反射机制使用byName自动注入策略。

    15、@RequestParam

    将请求参数绑定到你控制器的方法参数上,用在方法的参数前面。例:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””),required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错;defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

    16、@PathVariable

    路径变量。参数与大括号里的名字一样要相同。例:

    RequestMapping("user/get/mac/{macAddress}")

    public String getByMacAddress(@PathVariable String macAddress){

    public String getByMacAddress(@PathVariable(macAddress) String macAddresses){

      //do something;

    }

    //user/get/mac/mac,其中的mac就是外部传入的值

    17、@Profile

    Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。

    任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。

    @Configuration

    @Profile("prod")//可接受一个多个参数,如@Profile({"tut1","hello-world"})

    public class ProductionConfiguration {

        // ...

    }

    18、@ConfigurationProperties

    Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如config.properties文件。

    使用 @Component 注解目标类,这样项目启动时会自动将该类添加到容器中。

    使用 @EnableConfigurationProperties 间接的将 @ConfigurationProperties 注解的目标类添加到容器中。讲的详细点就是,使用 @ConfigurationProperties 注解 类A,使用 @EnableConfigurationProperties(value =  类A.class) 注解类B,那么容器在加载类B的时候,会先加载类A到容器中,实现了间接的加载。

    19、@ApiModelProperty

    20、@Import:用来导入其他配置类。

    21、@ImportResource:用来加载xml配置文件。

    22、@Value:注入Spring boot application.properties配置的属性的值。

    23、@Inject:等价于默认的@Autowired,只是没有required属性。

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

    25、@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配置文件中的一对一,一对多,多对一。

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

    @ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。

    @MappedSuperclass:

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

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

    3.@MappedSuperclass 标识的类不能再有@Entity或@Table注解

    @Column:

    1.当实体的属性与其映射的数据库表的列不同名时需要使用@Column标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。

    2.@Column 标注的常用属性是name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique、nullable、length、precision等。具体如下:

    1】name属性:name属性定义了被标注字段在数据库表中所对应字段的名称

    2】unique属性:unique属性表示该字段是否为唯一标识,默认为false,如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table注解中的@UniqueConstraint

    3】nullable属性:nullable属性表示该字段是否可以为null值,默认为true

    4】insertable属性:insertable属性表示在使用”INSERT”语句插入数据时,是否需要插入该字段的值

    5】updateable属性:updateable属性表示在使用”UPDATE”语句插入数据时,是否需要更新该字段的值

    6】insertable和updateable属性:一般多用于只读的属性,例如主键和外键等,这些字段通常是自动生成的

    7】columnDefinition属性:columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用,如果数据库中表已经建好,该属性没有必要使用

    8】table属性:table属性定义了包含当前字段的表名

    9】length属性:length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符

    10】precision属性和scale属性:precision属性和scale属性一起表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数

    数据库相关:

    1、查询:@PostLoad

    2、插入:@PrePersist

    3、更新:@PreUpdate

    4、删除:@PreRemove

    其他:

    1、@Override

    这是伪代码,用于表示被标注的方法是一个重写方法。

    主要有两个好处:

    1)帮助自己检查是否正确的重写父类方法

    2)明显的提示看代码的人,这是重写的方法

    2、@MapperScan

    作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类

    添加位置:是在Springboot启动类上面添加(例:@MapperScan({"com.kfit.demo","com.kfit.user"}))

    3、@Pointcut

    是指那些方法需要被执行"AOP",用来定义切点。

    常用方法execution,例:@Pointcut("execution(public * com.macro.mall.controller.*.*(..))")表示匹配所有com.macro.mall.controller.包及其子包下所有类的所有public方法。@Pointcut("execution(方法访问类型,返回类型(*表示所有的返回类型),方法的声明类,方法名(方法参数的类型),异常类型)"(..)-表示省略)

    4、@Api

    作用在Conntroller类上,用来标注该类具体实现内容。表示标识这个类是swagger的资源。

    参数:

    1. tags:可以使用tags()允许您为操作设置多个标签的属性,而不是使用该属性。

    2. description:可描述该类作用。

    5、@Retention:注解的保留位置

    @Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含

    @Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得。

    @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

    6、@Target:

    注解的作用目标

    1、@Target(ElementType.TYPE)  //接口、类、枚举、注解

    2、@Target(ElementType.FIELD) //字段、枚举的常量

    3、@Target(ElementType.METHOD) //方法

    4、@Target(ElementType.PARAMETER) //方法参数

    5、@Target(ElementType.CONSTRUCTOR)  //构造函数

    6、@Target(ElementType.LOCAL_VARIABLE)//局部变量

    7、@Target(ElementType.ANNOTATION_TYPE)//注解

    8、@Target(ElementType.PACKAGE) ///包 

    7、@Documented

    注解标记的元素,Javadoc工具会将此注解标记元素的注解信息包含在javadoc中。默认,注解信息不会包含在Javadoc中

    8、@Inherited

    说明子类可以继承父类中的该注解

    相关文章

      网友评论

        本文标题:Spring Boot学习之了解注解

        本文链接:https://www.haomeiwen.com/subject/fqgmfktx.html