目录

1、最基础注解(spring-context包下的org.springframework.stereotype)

1.1、@Controller @Service @Repository @Configuration @Component

(1)解释

用于标注各个层级的注解,注入到spring容器管理
@Controller @Service @Repository @Configuration 都是@Component组合注解只是区分层级关系

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
注解 层级
@Controller 标注于控制层
@Service 标注于业务层
@Repository 标注于dao持久层
@Configuration 标注于配置层
@Component 泛指组件,当组件不好归类时可用
(2)示例
@Controller
public class UserController {

}

1.2、 @Bean

(1)解释

@Bean等价于< Bean >< /Bean >,添加的bean的id为方法名。

(2)例子

@Configuration
public class AppConfig {
    //@bean 也可以依赖其他任意数量的bean,如果TransferService 依赖 AccountRepository,我们可以通过方法参数实现这个依赖
    @Bean
    public TransferService transferService(AccountRepository accountRepository) {
        return new TransferServiceImpl(accountRepository);
    }
}

这个配置就等同于之前在xml里的配置:
@Configuration可理解为用spring的时候xml里面的 标签
@Bean可理解为用spring的时候xml里面的 标签

<beans>
    <bean id="transferService" class="com.acme.TransferServiceImpl"  depends-on="accountRepository"/>
</beans>

2、最基础注解(spring-web包下的org.springframework.web.bind.annotation)

2.1、@ResponseBody

(1)解释

该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中。
一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。

(2)例子

/***********************例子一*******************************/
@RequestMapping(value="user/login")
@ResponseBody
//将ajax(datas)发出的请求写入User对象中,返回json对象响应回去
public User login(User user) {
    User user = new User();
    user.setUserid(1);
    user.setUsername("MrF");
    user.setStatus("1");    
    return user ;
}
/***********************例子二*******************************/
@Controller 
public class UserController {
    @GetMapping("/hello") 
    @ResponseBody public String hello() {
        return "hello spring"; 
    } 
}

2.2、@RequestBody

(1)解释

将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。换句话就是:用于接收前端请求的Json参数,并且封装到对应的JavaBean

(2)例子

@RequestMapping(value = "user/login")
@ResponseBody
// 将ajax(datas)发出的请求写入User对象中
public User login(@RequestBody User user) {   
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
    return user;    
}

(3)使用时机

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded,可选(即非必须,因为这种情况的数据@RequestParam,@ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data,不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式,必须(其他格式包括application/json,application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

application/x-www-form-urlencoded,必须;multipart/form-data,不能处理;其他格式,必须;

2.3、@RequestMapping

(1)解释

用来处理请求地址映射的注解

(2)例子

/**
* 用于类上,可以没有
*/
@RequestMapping(value = "/controllerDemo")
public class ControllerDemo {
    // 用于方法上,必须有
    @RequestMapping(value = "/methodDemo")    
    public String methodDemo() {
        return "helloWorld";
    }
}

(3)注解参数

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。
1、value, method
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明)
method:指定请求的method类型,GET、POST、PUT、DELETE等
2、consumes,produces
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params:指定request中必须包含某些参数值是,才让该方法处理。
headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

2.4、@PostMapping

(1)解释

一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

(2)例子

    @PostMapping("/pay")
    public JsonResponse pay(HttpServletRequest request){}

2.5、@GetMapping

(1)解释

一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。

(2)例子

@GetMapping("/getAll/{companyName}")
public ReturnModel getAllBusByCompany(@PathVariable(value="companyName",required=false)String companyName){}

(2)例子

2.6、@PathVariable

(1)解释

用于接受前端url路径参数,通过路径参数作为接口接受的参数,Result风格
区分:
使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值
使用@PathVariable时,URL是这样的:http://host:port/path/参数值

(2)例子

访问路径:localhost:8080/hello/1

    @GetMapping("/hello/{id}")
    public String func(@PathVariable String id) {
        return id;
    }

(3)参数

返回值 参数 作用
String value name别名
String name url参数的绑定值

2.7、@RequestParam

(1)解释

用于接受前端提交的参数

(2)参数

返回值 参数 作用
String value name别名
String name 请求参数对应的属性
boolean required 是否必传
Stirng defaultValue 默认值

(2)例子

访问方式:localhost:8080/hello?name=张三

    @GetMapping("/hello")
    public String func(@RequestParam(name = "name", required = false, defaultValue = "张三") String name) {
        return "OK";
    }

2.8、@RestController

(1)解释

相当于@ResponseBody + @Controller,Controller中的方法无法返回jsp页面,
返回的内容就是Return 里的内容。

3、persistence注解(javax.persistence包下的javax.persistence)

3.1、@Entity,@Table,@Id,@GeneratedValue, @Column,@Temporal,@Generated

写到后面有点懒了,直接上代码吧

(1)例子

import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "batch")
public class Batch{

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Integer id;
    
    //在插入的时候自动赋值当前时间
    @Column(insertable = false)
    @Temporal(TemporalType.TIMESTAMP)   
    @Generated(GenerationTime.INSERT)   
    private Date createdTime;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(insertable = false, updatable = false)
    @Generated(GenerationTime.ALWAYS)
    private Date updatedTime;
    
    //在插入的时候自动赋值1
    @Column(insertable = false ,columnDefinition="Short default 1")
    @Generated(GenerationTime.INSERT)
    private Short status;

4、resteasy注解(jaxrs-api包下的javax.ws.rs)

resteasy 是java体系中比较成熟的rest框架,也是jax-rs规范的实现之一,dubbox的REST服务框架,就是采用的resteasy实现。
默认情况下,resteasy使用jackson和jaxb来实现json及xml格式的序列化。应用启动时,会自动扫描带@Provider的包,找到最合适的provider。
这个可以用来做分布式,可以通过okhttp3协议来进行交互

4.1、@Path、@POST、@Produces、@Consumes、@Context

(1)例子

import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
import com.tdpay.dubbo.common.response.JsonResponse;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;

@Path("/td")
public interface PayIntegrationService {

    @Path("/pay")
    @POST
    @Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
    @Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
    public JsonResponse pay(@Context HttpServletRequest request);
}

5、validation注解(validation-api包下的javax.validation)

5.1、@Valid 和 @属性校验注解

(1)解释

用于前端请求参数校验,@Valid需要配合BindingResult使用,以及配合下面各种校验注解进行使用

(2)注解参数

注解 作用
@Valid 进行校验前端入参
注解 作用
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

(3)示例

    /**
     * 接受前端的请求并且根据User实体类注解进行校验
     */
    @PostMapping("/hello/user")
    public String hello(@Valid @RequestBody User user, BindingResult result) {
        if (result.hasErrors()) {
            result.getAllErrors().forEach(System.out::println);
        }
        System.out.println(user);
        return "hello spring";
    }
@Data
public class User {

    @NotBlank(message = "用户名不能为空")
    private String username;

    @NotBlank(message = "密码名不能为空")
    private String password;
}

6、lombok常用注解

idea要下载lombok插件
打开IDEA的Setting –> 选择Plugins选项 –> 选择Browse repositories –> 搜索lombok –> 点击安装 –> 安装完成重启IDEA –> 安装成功
然后pom导入lombok包

<dependency>  
    <groupId>org.projectlombok</groupId>  
    <artifactId>lombok</artifactId>  
    <version>1.18.0</version>  
    <scope>provided</scope>  
</dependency> 

6.1、@Slf4j和@Log

(1)解释

@Slf4j: 注解在类上,为类提供一个属性名为 log 的 log4j 的日志对象,避免重复代码。(基于lombok包)
@Log:使用的是 java.util.logging.Logger ,直接使用变量 log,用法同上。

(2)示例

@Service
@Slf4j
public class UserService {

    public void func() {
        log.info("【使用{}】","@Slf4j");
    }
}

6.2、@Data

(1)解释

简化java代码编写,为该类提供读写属性,还提供了equals(),hashCode(),toString()方法。
等价于 @ToString、@Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor

注意:同时使用@Data 和 @AllArgsConstructor 后 ,默认的无参构造函数失效,如果需要它,要重新设置 @NoArgsConstructor

(2)例子

@Data
public class ActivityListParam{
    private Integer id;
    private Integer page;
    private Integer count;
    ...

}

6.3、@Getter,@Setter,@ToString,@EqualsAndHashCode

(1)解释

啥也不用解释,一目了然

6.4、@AllArgsConstructor、@NoArgsConstructor

(1)解释

@AllArgsConstructor
会生成一个包含所有变量,同时如果变量使用了NotNull annotation , 会进行是否为空的校验,
全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,参数的顺序与属性定义的顺序一致

@NoArgsConstructor
无参构造函数

6.5、@NonNull

(1)解释

该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。

(2)例子

public class Person {
     private String name;
  
    public NonNullExample(@NonNull Person person) {
      super("Hello");
      this.name = person.getName();
    }
  
    @NonNull
    public List<Person> getMembers() {
      return members;
    }
}

6.6、@Cleanup

(1)解释

该注解能帮助我们自动调用close()方法,很大的简化了代码。

(2)例子

    import lombok.Cleanup;
    import java.io.*;
    
    public class CleanupExample {
      public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      }
    }

如不使用Lombok,则需如下:

import java.io.*;

public class CleanupExample {
  public static void main(String[] args) throws IOException {
    InputStream in = new FileInputStream(args[0]);
    try {
      OutputStream out = new FileOutputStream(args[1]);
      try {
        byte[] b = new byte[10000];
        while (true) {
          int r = in.read(b);
          if (r == -1) break;
          out.write(b, 0, r);
        }
      } finally {
        if (out != null) {
          out.close();
        }
      }
    } finally {
      if (in != null) {
        in.close();
      }
    }
  }
}

6.7、@Builder

(1)解释

声明实体,表示可以进行Builder方式初始化

(2)例子

/**
 * toBuilder 允许修改属性
 */
@Builder(toBuilder = true)
@Getter
public class User {
    private String name;
    private String password;
}
    @Test
    public void contextLoads() {
        // 创建对象并且赋值
        User user = User.builder().name("123").password("456").build();
        
        // 修改对象属性值
        User updateUser = user.toBuilder().name("张三").password("123").build();
    }

7、tkMapper注解

不知道怎么用tkMapper查看我的另一个文章:https://blog.csdn.net/ranandrun/article/details/86509394

7.1、@Select、@Param

import com.td.pay.tdpay.entity.PayParamsModel;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

@Repository
public interface PayParamsDao extends Mapper<PayParamsModel> {
    /**
     * 根据sn查询订单
     */
    @Select("SELECT * FROM pay_params WHERE sn = #{sn};")
    public PayParamsModel selectBySn(@Param("sn") String srcOrderSn);
}

8、springboot常用注解

8.1、@ConfigurationProperties

(1)解释

将配置文件中配置的每一个属性的值,映射到这个组件中

(2)例子

**
 * @ConfigurationProperties:
 *      prefix = "person":配置文件下面的所有属性和类的属性进行一一映射
 *
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

配置文件

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: 小狗
      age: 12

我们可以导入配置文件处理器,以后编写配置就有提示了

<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

8.2、@MapperScan("com.test.dao")

扫描dao接口,放启动类上面

8.3、@SpringBootApplication(scanBasePackages = {"com.test"})

SpringBootApplication启动时会默认扫描主类当前包及子包,如果需要扫描主类当前包外的其他包就用@SpringBootApplication

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄