java开发注解大全

目录

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

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

(1)解释

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

注解 层级
@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 里面的 < beans > 标签
@Bean 可理解为用 spring 的时候 xml 里面的 < bean > 标签

<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.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)解释

  • @Entity 表明该类是实体类,并且使用默认的 orm 规则,即 class 名即数据库表中表名,class 字段名即表中的字段名。如果 class 名和数据库表中名字不一致就用 @Table,如果 class 字段名和表中的字段名不一直就用 @Column
  • @Column 用来标识实体类中属性与数据表中字段的对应关系

name 定义了被标注字段在数据库表中所对应字段的名称;
unique 表示该字段是否为唯一标识,默认为 false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用 @Table 标记中的 @UniqueConstraint。
nullable 表示该字段是否可以为 null 值,默认为 true。
insertable 表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
updatable 表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable 和 updatable 属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
columnDefinition 表示创建表时,该字段创建的 SQL 语句,一般用于通过 Entity 生成表定义时使用。(也就是说,如果 DB 中表已经建好,该属性没有必要使用。)
table 表示当映射多个表时,指定表的表中的字段。默认值为主表的表名。
length 表示字段的长度,当字段的类型为 varchar 时,该属性才有效,默认为 255 个字符。
precision 和 scaleprecision 属性和 scale 属性表示精度,当字段类型为 double 时,precision 表示数值的总长度,scale 表示小数点所占的位数。

  • @Id 表名该字段是主键,如果要开启自增主键就用 @GeneratedValue
  • @Temporal 帮 Java 的 Date 类型进行格式化,一共有三种注解值

第一种:@Temporal(TemporalType.DATE)——> 实体类会封装成日期“yyyy-MM-dd”的 Date 类型。
第二种:@Temporal(TemporalType.TIME)——> 实体类会封装成时间“hh-MM-ss”的 Date 类型。
第三种:@Temporal(TemporalType.TIMESTAMP)——> 实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”的 Date 类型。

  • @Generated 自动生成

generated= never 标明此属性值不是从数据库中生成。
generated 默认值是 never。
generated= insert 标明此属性值在 insert 的时候生成,但是不会在随后的 update 时重新生成。
generated= always 标明此属性值在 insert 和 update 时都会被生成

(2)例子

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

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

<span class="hljs-meta">@Id</span>
<span class="hljs-meta">@GeneratedValue(strategy= GenerationType.AUTO)</span>
<span class="hljs-keyword">private</span> Integer id;

<span class="hljs-comment">//在插入的时候自动赋值当前时间</span>
<span class="hljs-meta">@Column(insertable = false)</span>
<span class="hljs-meta">@Temporal(TemporalType.TIMESTAMP)</span>   
<span class="hljs-meta">@Generated(GenerationTime.INSERT)</span>   
<span class="hljs-keyword">private</span> Date createdTime;

<span class="hljs-comment">//自动变化更新时间</span>
<span class="hljs-meta">@Temporal(TemporalType.TIMESTAMP)</span>
<span class="hljs-meta">@Column(insertable = false, updatable = false)</span>
<span class="hljs-meta">@Generated(GenerationTime.ALWAYS)</span>
<span class="hljs-keyword">private</span> Date updatedTime;

<span class="hljs-comment">//在插入的时候自动赋值1</span>
<span class="hljs-meta">@Column(insertable = false ,columnDefinition="Short default 1")</span>
<span class="hljs-meta">@Generated(GenerationTime.INSERT)</span>
<span class="hljs-keyword">private</span> 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 {

<span class="hljs-meta">@Path("/pay")</span>
<span class="hljs-meta">@POST</span>
<span class="hljs-meta">@Produces({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})</span>
<span class="hljs-meta">@Consumes({ ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})</span>
<span class="hljs-keyword">public</span> JsonResponse <span class="hljs-title function_">pay</span><span class="hljs-params">(<span class="hljs-meta">@Context</span> HttpServletRequest request)</span>;

}

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 {
<span class="hljs-meta">@NotBlank(message = "用户名不能为空")</span>
<span class="hljs-keyword">private</span> String username;

<span class="hljs-meta">@NotBlank(message = "密码名不能为空")</span>
<span class="hljs-keyword">private</span> 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 {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">func</span><span class="hljs-params">()</span> {
    log.info(<span class="hljs-string">"【使用{}】"</span>,<span class="hljs-string">"@Slf4j"</span>);
}

}

6.2、@Data

(1)解释

用在 pojo 类,在类上面加这个注解。简化 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)解释

在 pojo 类上面加了这些注解以后,自动生成 get、set、toString、equals、hashCode 等方法
@EqualsAndHashCode(callSuper = false) 的意思是忽略父类的字段,来调用 equals 和 hashcode

6.4、@AllArgsConstructor、@NoArgsConstructor

(1)解释

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

@NoArgsConstructor
在 pojo 类上面加了这些注解以后,会生成一个无参构造函数

6.5、@NonNull

(1)解释

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

(2)例子

public class Person {
 	 private String name;
<span class="hljs-keyword">public</span> <span class="hljs-title function_">NonNullExample</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> Person person)</span> {
  <span class="hljs-built_in">super</span>(<span class="hljs-string">"Hello"</span>);
  <span class="hljs-built_in">this</span>.name = person.getName();
}

<span class="hljs-meta">@NonNull</span>
<span class="hljs-keyword">public</span> List&lt;Person&gt; <span class="hljs-title function_">getMembers</span><span class="hljs-params">()</span> {
  <span class="hljs-keyword">return</span> members;
}

}

6.6、@Cleanup

(1)解释

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

(2)例子

    import lombok.Cleanup;
    import java.io.*;
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">CleanupExample</span> {
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> <span class="hljs-keyword">throws</span> IOException {
    <span class="hljs-meta">@Cleanup</span> <span class="hljs-type">InputStream</span> <span class="hljs-variable">in</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileInputStream</span>(args[<span class="hljs-number">0</span>]);
    <span class="hljs-meta">@Cleanup</span> <span class="hljs-type">OutputStream</span> <span class="hljs-variable">out</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">FileOutputStream</span>(args[<span class="hljs-number">1</span>]);
    <span class="hljs-type">byte</span>[] b = <span class="hljs-keyword">new</span> <span class="hljs-title class_">byte</span>[<span class="hljs-number">10000</span>];
    <span class="hljs-keyword">while</span> (<span class="hljs-literal">true</span>) {
      <span class="hljs-type">int</span> <span class="hljs-variable">r</span> <span class="hljs-operator">=</span> in.read(b);
      <span class="hljs-keyword">if</span> (r == -<span class="hljs-number">1</span>) <span class="hljs-keyword">break</span>;
      out.write(b, <span class="hljs-number">0</span>, 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();
    <span class="hljs-comment">// 修改对象属性值</span>
    <span class="hljs-type">User</span> <span class="hljs-variable">updateUser</span> <span class="hljs-operator">=</span> user.toBuilder().name(<span class="hljs-string">"张三"</span>).password(<span class="hljs-string">"123"</span>).build();
}

7、tkMapper 注解

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

7.1、@Select、@Param

  • @Param 作用是用于传递参数,从而可以与 SQL 中的的字段名相对应,一般在 2=< 参数数 <=5 时使用最佳
  • @Select 作用是用注解方式来查询,不需要通过 mapperxml 文件
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 {
<span class="hljs-keyword">private</span> String lastName;
<span class="hljs-keyword">private</span> Integer age;
<span class="hljs-keyword">private</span> Boolean boss;
<span class="hljs-keyword">private</span> Date birth;

<span class="hljs-keyword">private</span> Map&lt;String,Object&gt; maps;
<span class="hljs-keyword">private</span> List&lt;Object&gt; lists;
<span class="hljs-keyword">private</span> 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

9、注入 bean 的三个注解

归纳:

  • @Autowired 是 spring 自带的,@Inject 是 JSR330 规范实现的,@Resource 是 JSR250 规范实现的,需要导入不同的包
  • @Autowired、@Inject 用法基本一样,不同的是 @Autowired 有一个 request 属性
  • @Autowired、@Inject 是默认按照类型匹配的,@Resource 是按照名称匹配的
  • @Autowired 如果需要按照名称匹配需要和 @Qualifier 一起使用,@Inject 和 @Name 一起使用

9.1、@Inject(javax.inject 下的)

(1)解释

根据类型进行自动装配的,默认需要配置与变量名一致。如果需要按名称进行装配,则需要配合 @Named;
@Inject 可以作用在变量、setter 方法、构造函数上。

(2)例子

    @Inject
    private Mongo mongo;

9.2、@Autowired (org.springframework 下的 sping-beans)

(1)解释

根据类型进行自动装配的,名称不一样也没事,如果需要按名称进行装配,则需要配合 @Qualifier;
@Autowired 有个属性为 required,可以配置为 false,如果配置为 false 之后,当没有找到相应 bean 的时候,系统不会抛错;
@Autowired 可以作用在变量、setter 方法、构造函数上。

(2)例子

    @Autowired
    private MongoTemplate mongoTemplate;

9.3、 @Resource (jdk 下的 rt.jar 下的 javax.annotation)

(1)解释

根据名称进行自动装配的,默认需要配置与变量名一致,一般会指定一个 name 属性。
@Resource 可以作用在变量、setter 方法上。

(2)例子

    @Resource(name = "userMapper")
    private UserMapper userMapper;

10、java 内置注解(java.lang 下的)

10.1、@Override

(1)解释

帮助自己检查是否正确的复写了父类中已有的方法
告诉读代码的人,这是一个复写的方法

(2)例子

public class Apple extends Fruit{
     @Override
     public void show_name(int num){
         System.out.println("Apple");
    }
}

10.2、@Deprecated

(1)解释

这个方法或类不再建议使用。调用时也会出现删除线,但并不代表不能用。在新版本中有其他方法或类可以代替这个使用,以后的版本也不会再更新这个方法或类

(2)例子

     /**
     * 请改用每个实体对象的实例方法的 existed() 方法。
     */
    @Deprecated
    public static <T extends Entity> boolean exists(Class<T> clazz, Serializable id) {
        return getRepository().exists(clazz, id);
    }

10.3、@SuppressWarnings

(1)解释

抑制内容警告,我们使用是要保证抑制影响的范围最小。
@ SuppressWarnings 可以使用的属性列表如下:

属性 备注
all 禁止所有警告
boxing 禁止与装箱 / 拆箱操作相关的警告
cast 强制转换以抑制与强制转换操作相关的警告
dep-ann 用于抑制相对于已弃用注释的警告
deprecation 弃用以抑制相对于弃用的警告
fallthrough 在 switch 语句中,通过 fallthrough 来抑制与丢失中断相关的警告
finally 最后抑制与最终块相关的不返回的警告
hiding 隐藏以抑制相对于隐藏变量的本地警告
incomplete-switch 在 switch 语句 (enum 案例) 中,incomplete-switch 用来抑制相对于丢失条目的警告
javadoc 禁止与 javadoc 警告相关的警告
nls 使用 nls 来抑制相对于非 nls 字符串的警告。
null 空值来抑制相对于空值分析的警告
rawtypes 拒绝与使用原始类型相关的警告
resource 用于抑制与使用类型为 Closeable 的资源相关的警告的资源
restriction 限制禁止与使用不鼓励或禁止引用相关的警告
serial 串行用于抑制相对于可串行化类缺少 serialVersionUID 字段的警告
static-access 静态访问,抑制相对于不正确的静态访问的警告
static-method 静态方法,用于抑制相对于可以声明为静态的方法的警告
super 超级 - 来抑制相对于在没有超级调用的情况下重写方法的警告
synthetic-access 用于抑制相对于内部类的未优化访问的警告的合成访问
sync-override 在覆盖同步方法时,由于缺少同步而取消警告
unchecked 未选中以抑制与未选中操作相关的警告
unqualified-field-access 不限定字段访问来抑制与字段访问不限定相关的警告
unused 不常用来抑制与未使用代码和死代码相关的警告

(2)例子

public class SuppressWarnings {
<span class="hljs-comment">/**
 * 变量单个类型的警告
 */</span>
<span class="hljs-meta">@java</span>.lang.SuppressWarnings(<span class="hljs-string">"unused"</span>)
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">unused</span><span class="hljs-params">()</span> {
    <span class="hljs-type">String</span> <span class="hljs-variable">s</span> <span class="hljs-operator">=</span> <span class="hljs-string">""</span>;
}

<span class="hljs-comment">/**
 * 抑制多个类型的警告
 * <span class="hljs-doctag">@param</span> item 元素
 */</span>
<span class="hljs-meta">@java</span>.lang.SuppressWarnings({<span class="hljs-string">"unchecked"</span>, <span class="hljs-string">"rawtypes"</span>})
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">addItems</span><span class="hljs-params">(String item)</span>{
    <span class="hljs-type">List</span> <span class="hljs-variable">items</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span>();
    items.add(item);
}

<span class="hljs-comment">/**
 * 抑制所有类型的警告
 * <span class="hljs-doctag">@param</span> item
 */</span>
<span class="hljs-meta">@java</span>.lang.SuppressWarnings(<span class="hljs-string">"all"</span>)
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">all</span><span class="hljs-params">(String item)</span> {
    <span class="hljs-type">List</span> <span class="hljs-variable">items</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span>();
    items.add(item);
}

}

10.4、@SafeVarargs

(1)解释

抑制堆污染警告
问:什么时候会出现对堆污染警告?
答:使用泛型 + 可变参数的时候就会出现堆污染警告。

(2)例子


        @SafeVarargs
	public static<T> T useVarargs(T... args){
		return args.length > 0?args[0]:null;
	}
	@Test
	public void testSafeVarargs(){
		System.out.println(useVarargs(Arrays.asList("s1","s2")));
	}

10.5、@FunctionalInterface

(1)解释

在 Java SE 8 中引入的 , 申明某个接口是函数式接口(函数式接口是就只含有一个抽象方法的接口)。加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错。该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。

(2)例子

如定义了一个函数式接口如下:

    @FunctionalInterface
    interface GreetingService 
    {
        void sayMessage(String message);
    }

那么就可以使用 Lambda 表达式来表示该接口的一个实现 (注:JAVA 8 之前一般是用匿名类实现的):

GreetingService greetService1 = message -> System.out.println("Hello" + message);