开发中常用注解说明

Spring中的注解使用(包含SpringBoot)

@Controller

@Controller用于标记在一个类上,使用它标记的类就是一个SpringMvc Controller对象,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。

@Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是处理请求的处理器。

@Controller标记在一个类上还不能真正意义上说它就是SpringMvc的控制器,应为这个时候Spring还不认识它,这个时候需要把这个控制器交给Spring来管理。有两种方式可以管理:

<!--基于注解的装配-->
<!--方式一-->
<bean class="com.HelloWorld"/>
<!--方式二-->
<!--路径写到controller的上一层-->
<context:component-scan base-package="com"/>

component-scan默认扫描的注解类型是@Component,不过,在@Component的语义基础之上细化为@Reposity,@Service,@Controller.

@RestCotroller

Spring4之后新加入的注解,原来返回json需要@ResponseBody和@Controller配合。

即@RestController是@ResponseBody和@Controller的组合注解。

@Service

此注注解属于业务逻辑层,service或者manager层
默认按照名称进行装配,如果名称可以通过name属性指定,如果没有name属性,注解写在字段上时,默认去字段名进行查找,如果注解写在setter方法上,默认按照方法属性名称进行装配。当找不到匹配的bean时,才按照类型进行装配,如果name名称一旦指定就会按照名称进行装配

@Repository

此注解式持久层组件,用于标注数据访问组件,即DAO组件

@Autowired

@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。

@ResponseBody

作用其实是将java对象转为json格式的数据

@RequestMapping

在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置

<servlet>
    <servlet-name>servletName</servlet-name>
    <servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>servletName</servlet-name>
    <url-pattern>url</url-pattern>
</servlet-mapping>

的映射作用一致。让我们先看一下RequestMapping注解类的源码:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
	String name() default "";
	String[] value() default {};
	String[] path() default {};
	RequestMethod[] method() default {};
	String[] params() default {};
	String[] headers() default {};
	String[] consumes() default {};
	String[] produces() default {};
}

测试 @RequestMapping 的 method 属性

1)简介:@RequestMapping 中的 method 主要用来定义接收浏览器发来的何种请求。在Spring中,使用枚举类

org.springframework.web.bind.annotation.RequestMethod来定义浏览器请求的方式。

Http规范定义了多种请求资源的方式,最基本的有四种,分别为:GET(查)、POST(增)、PUT(改)、DELETE(删),而URL则用于定位网络上的资源相当于地址的作用,配合四种请求方式,可以实现对URL对应的资源的增删改查操作。

在实际应用中,很多人并没有按照这个规范做,因为使用GET/POST同样可以完成PUT和DELETE操作,甚至GET也可以完成POST操作,因为GET不需要用到表单,而POST却需要通过表单来发送。
  1. 通过 @RequestMapping(value="/login",method=RequestMethod.GET) 来指定 login()方法 仅处理通过 GET 方式发来的请求
@Controller
@RequestMapping(path = "/user")
public class UserController {
 
	@RequestMapping(path = "/login", method=RequestMethod.GET)
	public String login() {
		return "success";
	}
}

这时,如果浏览器发来的请求不是GET的话,将收到浏览器返回的错误提示,也就是得通过链接的方式而不是表单的方式

<a href="user/login>User Login</a>

@RequestMapping和@GetMapping区别

  • @RequestMapping可以指定GET、POST请求方式(@RequestMapping(method = RequestMethod.GET))
  • @GetMapping等价于@RequestMapping的GET请求方式

@GetMapping && @PostMapping && @PutMapping && @DeleteMapping

Spring MVC新特性
提供了对Restful风格的支持

@GetMapping,处理get请求
@PostMapping,处理post请求
@PutMapping,处理put请求
@DeleteMapping,处理delete请求

@Component

把普通pojo实例化到spring容器中,相当于配置文件中的
<bean id="" class=""/>

  • 泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

@PathVariable

接收请求路径中占位符的值

在路由中定义变量规则后,通常我们需要在处理方法(也就是@RequestMapping注解的方法)中获取这个URL的具体值,并根据这个值(例如用户名)做相应的操作,SpringMVC提供的@PathVariable可以帮助我们:

@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable String username){
    
    
//        return String.format("user %s", username);
        return "user" + username; 
    }	

在上述例子中,当@Controller处理HTTP请求时,userProfile的参数username会自动设置为URL中对应变量username(同名赋值)的值,例如当HTTP请求为/users/fpc

,URL变量username的值fpc会被赋给函数参数username,函数的返回值自然是userfpc。

在默认的情况下,Spring会对@PathVariable注解的变量进行自动赋值,当然你也可以指定@PathVariable使用哪一个URL中的变量:

@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable("username") String username){
    
    
//        return String.format("user %s", username);
        return "user" + username; 
    }

定义多个URL变量

可以定义URL路由,其中包含多个URL变量:

@RequestMapping("/user/{username}/blog/{blogId}")    @ResponseBody    public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
    
            return "user: " + username + "blog->" + blogId;    }

常规注解

@Override

重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

@Transactional

是声明式事务管理 编程中使用的注解

添加位置

1)接口实现类或接口实现方法上,而不是接口类中。
2)访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。
系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。

lombok插件使用注解

@Data

整合包,只要加了 @Data 这个注解,等于同时加了以下注解

  • @Getter/@Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

@AllArgsConstructor

生成一个包含所有参数的构造器

@NoArgsConstructor

生成一个没有参数的构造器

@RequiredArgsConstructor

生成一个包含 “特定参数” 的构造器,特定参数指的是那些有加上 final 修饰词的变量们

@Value

也是整合包,但是他会把所有的变量都设成 final 的,其他的就跟 @Data 一样,等于同时加了以下注解

  • @Getter (注意没有setter)
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

上面那个 @Data 适合用在 POJO 或 DTO 上,而这个 @Value 注解,则是适合加在值不希望被改变的类上,像是某个类的值当创建后就不希望被更改,只希望我们读它而已,就适合加上 @Value 注解,也就是 @Value for immutable class

另外注意一下,此 lombok 的注解 @Value 和另一个 Spring 的注解 @Value 撞名,在 import 时不要 import 错了

@ToString

自动重写 toString() 方法,会印出所有变量

@EqualsAndHashCode

自动生成 equals(Object other)hashcode() 方法,包括所有非静态变量和非 transient 的变量

如果某些变量不想要加进判断,可以透过 exclude 排除,也可以使用 of 指定某些字段

Q : 为什么只有一个整体的 @EqualsAndHashCode 注解,而不是分开的两个 @Equals@HashCode

A : 在 Java 中有规定,当两个对象 equals 时,他们的 hashcode 一定要相同,反之,当 hashcode 相同时,对象不一定 equals。所以 equals 和 hashcode 要一起实现,免得发生违反 Java 规定的情形发生

MyBatis注解使用(包括MyBatis-plus)

@TableName

用来将指定的数据库表和 JavaBean 进行映射

@TableId

主键专属

比如数据中的表中的字段是id

但是实体类是userId

那么就需要在userId上打上这个注解

用法

设置主键映射 value映射主键字段的名字

type 设置主键类型 主键的生成策略

@TableFiled

非主键字段使用

比如数据中的表中的字段是name

但是实体类是userName

那么就需要在userName上打上这个注解

Swagger中的注解

@Api

- @Api()用于类;
表示标识这个类是swagger的资源

tags–表示说明
value–也是说明,可以使用tags替代

@ApiOperation

- @ApiOperation()用于方法;
表示一个http请求的操作
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明” )

@ApiModelProperty

- @ApiModelProperty()用于方法,字段
表示对model属性的说明或者数据操作更改

@ApiParam

- @ApiParam()用于方法,参数,字段说明;
表示对参数的添加元数据(说明或是否必填等)

@ApiParam(required = “是否必须参数”, name = “参数名称”, value = “参数具体描述”)

Guess you like

Origin blog.csdn.net/weixin_45561352/article/details/116780255