Java注解笔记

当配置完Spring扫描指定包及其子包中的类时,会识别所有标记了@Component、@Controller、@Service、@Repository注解的类,由于@Configuration注解本身也用@Component标注了,Spring将能够识别出 @Configuration标注类

TODO:

 

注解

作用

@Controller

@Component扩展,被@Controller注解的类表示Web层实现。用来表示Spring某个类的是否可以接收HTTP请求,标识一个Spring类是Spring MVC controller处理器。

@Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面。在方法上加@ResponseBody注解,也可以返回实体对象。

@RestController

用来表示Spring某个类的是否可以接收HTTP请求,@RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用。

@RestController类中的所有方法只能返回String、Object、Json等实体对象,不能跳转到模版页面。

@RestController的返回值为何都是经过转换的json

@Service

@Component扩展,被@Service注解的POJO类表示Service层实现。在Service层的类上面添加@Service注解,会自动创建Bean,Bean的名字为类的名字(首字母小写)

@Service(value = "catalogService4Quality")

自己指定Bean的名字,用于@Autowired在接口创建对象时寻找该数据类型接口的实现类。当该接口有多个实现类时,需要通过Bean的名字进行注入,使用@Qualifier("XXX")对应@Service(value="XXX")来制定特定的类来进行属性注入

@Repository

@Component扩展,被@Repository注解的POJO类表示DAO层实现

@Component

@Component:定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理)

@AspectJ风格的切面可以通过@Compenent注解标识其为Spring管理Bean,而@Aspect注解不能被Spring自动识别并注册为Bean,必须通过@Component注解来完成

@Autowired

按类型装配Spring Bean

@Qualifier

默认情况下,@Autowired 按类型装配 Spring Bean。

如果容器中有多个相同类型的 bean(多个类实现了同一个接口并都被spring初始化),则框架将抛出NoUniqueBeanDefinitionException,以提示有多个满足条件的bean进行自动装配。程序无法正确做出判断使用哪一个。

(1)通过将 @Qualifier 注解与我们想要使用的特定Spring bean的名称一起进行装配,Spring 框架就能从多个相同类型并满足装配要求的bean中找到我们想要的,避免让Spring脑裂。我们需要做的是@Component或者@Bean注解中声明的value属性以确定名称。

(2)其实我们也可以在 Formatter实现类上使用@Qualifier注释,而不是在@Component或者@Bean中指定名称,也能达到相同的效果。

如果@Qualifier和@Primary注释都存在,那么@Qualifier注释将具有优先权。基本上,@Primary是定义了默认值,而@Qualifier则非常具体指定使用哪个类/方法。

@Configuration

本质上来说@Configuration也是一个@Component,只不过我们在具体使用的过程中基本用不到它的实例化对象。

命名建议以“**Config”结尾方便识别

Spring对其有一定的约定条件:

1.配置类不能是 final 类(没法动态代理)。

2.配置类必须是非本地的(即不能将配置类定义在其他类的方法内部,不能是private)。

3.配置类必须有一个无参构造函数。

 

符合上述条件的类,就可以使用@Configuration来进行注解,表示这个类可以使用Spring IoC容器作为bean定义的来源。@Bean注解在该类的方法上,AnnotationConfigApplicationContext将配置类中标注了@Bean的方法的返回值识别为Spring Bean,并注册到容器中,归入IoC容器管理。

 

@Bean

@Bean具有以下属性:

 

name :指定一个或者多个Bean的名字。等价于XML配置中的name属性,示例中的@Bean(name = “oracleDataSource”)。

initMethod:容器在初始化完Bean之后,会调用该属性指定的方法。等价于XML配置中的init-method属性。

destroyMethod:该属性与initMethod功能相似,在容器销毁Bean之前,会调用该属性指定的方法。等价于XML配置中的destroy-method属性。

autowire:指定Bean属性的自动装配策略,取值是Autowire类型的三个静态属性。Autowire.BY_NAME,Autowire.BY_TYPE,Autowire.NO。与XML配置中的autowire属性的取值相比,少了constructor,因为 constructor在这里已经没有意义了。

@Bean默认是单例模式,并且没有提供指定作用域的属性,可以通过@Scope来实现该功能。

@Target({ElementType.TYPE})

只有一个参数ElementType[] value()

注解的作用目标,该注解可以声明在哪些目标元素之前,也可以理解为注释类型的程序元素的种类。

@Target(ElementType.TYPE)——类、接口、枚举类 如@SpringBootApplication

@Target(ElementType.FIELD)——域、枚举的常量 如@Autowired

@Target(ElementType.METHOD)——方法 如@PostMapping

@Target(ElementType.PARAMETER)——方法参数(方法接收参数时的变量)如@RequestBody

@Target(ElementType.CONSTRUCTOR) ——构造器 @Autowired

@Target(ElementType.LOCAL_VARIABLE)——局部变量

@Target(ElementType.ANNOTATION_TYPE)——注解 @Documented

@Target(ElementType.PACKAGE)——包

@Target(ElementType.TYPE_PARAMETER)——类型参数

@Target(ElementType.TYPE_USE)——使用类型的任何地方

@Retention(RetentionPolicy.RUNTIME)

只有一个参数RetentionPolicy value()

如何保留,告诉编译程序如何处理,也可理解为注解类的生命周期。

RetentionPolicy.SOURCE 注解只保留在源文件/源代码级别,编译时被忽略,在class字节码文件中不包含;如@Override

RetentionPolicy.CLASS 注解编译时保留,在class文件中存在,在加载到JVM虚拟机时将会忽略,运行时无法获得;

RetentionPolicy.RUNTIME 注解将被JVM保留,能在运行时被JVM或其他使用反射机制的代码所读取和使用。如@DubboReference

@Documented

直接在需要注解的地方打上注解即可,在使用javadoc生成api文档时会将使用Documented注解类作用的类上加上注解类的信息。如果一个类型被Documented注解声明了,那么他的所有注解会变成公共api注解的一部分。就是会在api文档里面可见。

@Aspect

 

@Setter

 

@Getter

 

@RequestMapping

@RequestMapping 是 Spring Web应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。在 Spring MVC 应用程序中,RequestDispatcher (在 Front Controller 之下) 这个 servlet 负责将进入的 HTTP 请求路由到控制器的处理方法,要配置 Web 请求的映射,就需要你用上 @RequestMapping 注解。

@RequestMapping 注解可以在控制器类的级别和/或其中的方法的级别上使用:在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。

@RequestMapping 来处理多个 URI:可以将多个请求映射到一个方法上去,只需要添加一个带有请求路径值列表的 @RequestMapping 注解就行了。

对请求的映射不仅仅不局限在标示的方法的返回值对请求url上,还可以对请求的其属性做出约定,如请求的method,是get还是post。如果做出了method的条件限定,当请求的url即使映射上了,method不符合的话也不能生成物理视图并转发到目标页面。如@RequestMapping(method = RequestMethod.GET)

@RequestHeader

处理request header部分的注解。@RequestHeader 注解,可以把Request请求header部分的值绑定到方法的参数上。

@RequestMapping("/displayHeaderInfo.do")

public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,

                              @RequestHeader("Keep-Alive") long keepAlive)  {

  //...

}

上面的代码,把request header部分的 Accept-Encoding的值,绑定到参数encoding上了, Keep-Alive header的值绑定到参数keepAlive上。

@CookieValue

@CookieValue 可以把Request header中关于cookie的值绑定到方法的参数上。

JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84,把JSESSIONID的值绑定到参数cookie上:

@RequestMapping("/displayHeaderInfo.do")

public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie)  {

  //...

}

@PathVariable

处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解

当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上。

1 @Controller

2 @RequestMapping("/owners/{ownerId}")

3 public class RelativePathUriTemplateController {

4

5   @RequestMapping("/pets/{petId}")

6   public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {   

7     // implementation omitted

8   }

9 }

上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable("name")指定uri template中的名称。

@RequestParam

http://localhost:8080/api/foos?id=abc

@RequestParam String id

@RequestParam 注解配合 @RequestMapping 一起使用,将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)。

语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)

value:参数名

required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。

defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。

 

@RequestBody

1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。@RequestBody接受的是一个json格式的字符串,一定是一个字符串。

2、通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上

data:'{"userName":"admin","pwd":"admin123"}',

@requestMapping("/login")

    public void login(@requestBody String userName,@requestBody String pwd){

      System.out.println(userName+" :"+pwd);

    }

 

@SessionAttributes

该注解用来绑定HttpSession中的attribute对象的值,便于在方法中的参数里使用。

该注解有value、types两个属性,可以通过名字和类型指定要使用的attribute 对象;

1 @Controller

2 @RequestMapping("/editPet.do")

3 @SessionAttributes("pet")

4 public class EditPetForm {

5     // ...

6 }

@ModelAttribute

该注解有两个用法,一个是用于方法上,一个是用于参数上;

用于方法上时:  通常用来在处理@RequestMapping之前,为请求绑定需要从后台查询的model;

1 // Add one attribute

2 // The return value of the method is added to the model under the name "account"

3 // You can customize the name via @ModelAttribute("myAccount")

4

5 @ModelAttribute

6 public Account addAccount(@RequestParam String number) {

7     return accountManager.findAccount(number);

8 }

这种方式实际的效果就是在调用@RequestMapping的方法之前,为request对象的model里put(“account”, Account)

 

用于参数上时: 用来通过名称对应,把相应名称的值绑定到注解的参数bean上;要绑定的值来源于:

A) @SessionAttributes 启用的attribute 对象上;

B) @ModelAttribute 用于方法上时指定的model对象;

C) 上述两种情况都没有时,new一个需要绑定的bean对象,然后把request中按名称对应的方式把值绑定到bean中。

1 @RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)

2 public String processSubmit(@ModelAttribute Pet pet) {

3   

4 }

首先查询 @SessionAttributes有无绑定的Pet对象,若没有则查询@ModelAttribute方法层面上是否绑定了Pet对象,若没有则将URI template中的值按对应的名称绑定到Pet对象的各属性上

@GetMapping("/jobs/status")

 

@PutMapping("/job/{job_id}/start")

 

@AfterMapping

 

@Setter

Lombok插件注解。用于生成setter方法,可以用在类或者属性上:

如果用在属性上:则只为该属性提供 setter方法

如果是用在类上:则为这个类所有属性供 setter方法

@Getter

Lombok插件注解。用于生成getter方法,可以用在类或者属性上:

如果用在属性上:则只为该属性提供getter方法

如果是用在类上:则为这个类所有属性供getter方法

@Getter(lazy=true)

Lombok插件注解。该标注用于生成一个 lazy 版的 getter,它会在第一次调用这个 getter 时计算一次值,然后从那里开始缓存它。如果计算该值需要大量 CPU,或者该值占用大量内存,这可能很有用。

注意:Lombok 会自动去管理线程安全的问题,所以不会存在重复赋值的问题。

要使用此功能,需要创建一个 private final 变量,并且使用运行成本高的表达式对其进行初始化,同时使用 @Getter(lazy=true) 注解进行标注。

@Data

Lombok插件注解。默认为类生成get、set、equals、hashCode、toString 等方法。

@ToString

@ToString 注解在类上, 为类提供 toString() 方法。

默认情况下,它会按顺序(以逗号分隔)打印这个类名称以及每个字段。

可以这样设置不包含哪些字段:@ToString(exclude = "id") 或者 @ToString(exclude = {"id","name"})

posted @ 2023-10-13 17:44  Newatimu  阅读(26)  评论(0)    收藏  举报