微服务中常用的注解

2023-11-07

注解的定义

Annotation(注解),用于为Java代码提供元数据。简单理解注解可以看做是一个个标签,用来标记代码。是一种应用于类、方法、参数、变量、构造器及包的一种特殊修饰符。

1.@Target
表示该注解类型所使用的程序元素类型,结合ElementType.XXX来使用。

2.Override
用于告知编译器,我们需要覆写超类的当前方法

3.@Deprecated
使用这个注解,用于告知编译器,某一程序元素(比如方法,成员变量)不建议使用了(即过时了)。

4.@Component

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

5.@Autowired

这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

6.@MapperScan

扫描mapper类包的路径,还可以扫描多个包。

7.@Id

标注用于声明一个实体类的属性映射为数据库的主键列该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。 @Id标注也可置于属性的getter方法之前。

8.@Bean

注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。它是一个方法级别上的注解,主要用在@Configuration注解的类里

9.@Configuration

这个注解类标识这个类可以使用Spring IOC容器作为bean定义的来源。

10.@EnableAutoConfiguration

能够自动配置spring的上下文,试图猜测和配置你想要的bean类,通常会自动根据你的类路径和你的bean定义自动配置。

11.@ComponentScan

会自动扫描指定包下的全部标有@Component的类,并注册成bean

12.@SpringBootApplication

来标注这是一个springboot的应用,被标注的类是一个主程序

这个注解相当于@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的结合

实例:

@SpringBootApplication

public class App{

 

    public static void main(String[] args) {

 

        SpringApplication.run(App.class,args);

    }

}

13.@RunWith

是一个运行器

14.@RunWith(JUnit4.class)

是指用JUnit4来运行

15.@RunWith(SpringJUnit4ClassRunner.class)

让测试运行于Spring测试环境

16.@RunWith(Suite.class)

是一套测试集合

17.@SpringBootTest

进行单元测试

18.@GeneratedValue

存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键),@GeneratedValue提供了主键的生成策略。@GeneratedValue注解有两个属性,分别是strategy和generator,其中generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。

19.@Service

加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了

20.@Controller

被@Controller标记的类实际上就是个SpringMVC Controller对象,它是一个控制器类,而@Contoller注解在org.springframework.stereotype包下。其中被@RequestMapping标记的方法会被分发处理器扫描识别,将不同的请求分发到对应的接口上。

实例:

@Controller

public class TestController {

 

    private static final Log logger  = LogFactory.getLog(TestController.class);

 

    @RequestMapping(value = "/hello")

    public ModelAndView hello () {

        logger.info("hello() 方法被调用");

        ModelAndView mv = new ModelAndView();

        mv.addObject("message", "Hello, Ma Yuzhe!");

        mv.setViewName("/WEB-INF/views/hello.jsp");

        return mv;

    }

}

TestController即为一个自定类。在该类的前面标记@Controller,该类就成了一个控制器类。

在浏览器地址栏中输入http://localhost:8080/hello,即对hello()方法进行调用,前台返回hello.jsp界面

21.@RequestMapping

开发者需要在控制器内部为每一个请求动作开发相应的处理方法。org.springframework.web.bind.annotation.RequestMapping 注解类型指示Spring用哪一个类或方法处理请求动作,该注解可用于类和方法。

@RequestMapping可以用来注释一个控制器类,在这种情况下,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。示例代码如下:

实例:

@Controller

@RequestMapping(value="/user")

public class UserController{

  @RequestMapping(value="/register")

  public String register(){

    return "register";

  }

 

  @RequestMapping(value="/login")

  public String login(){

    return "login";

  }

 

 

 

 

22.@ResponseBody

@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

实例:

  @RequestMapping("/login")

  @ResponseBody

  public User login(User user){

    return user;

  }

  //User字段:userName pwd

  //那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'

 

  //效果等同于如下代码:

  @RequestMapping("/login")

  public void login(User user, HttpServletResponse response){

    response.getWriter.write(JSONObject.fromObject(user).toString());

  }

 

 

 

 

23.@Repository

实现dao访问,用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件

24.@RestController

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

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

实例:

@RestController

public class HelloController {

 

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

    public String sayHello(){

        return "hello";

    }

}

与下面的代码作用一样

 

@Controller

@ResponseBody

public class HelloController {

 

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

    public String sayHello(){

        return "hello";

    }

}

25.@RequestMapping

此注解可以作用在控制器的某个方法上,也可以作用在此控制器类上。当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。

实例:

@RestController

@RequestMapping("consumer")

public class ConsumerController {

    @Autowired

    private RestTemplate restTemplate;

 

    @GetMapping("{id}")

    @HystrixCommand(fallbackMethod = "queryByIdFallback")

    public String queryById(@PathVariable("id") Long id) {

        String url = "http://user-service/user/" + id;

        String user = restTemplate.getForObject(url, String.class);

        return user;

    }

    public String queryByIdFallback(Long id) {

        return "服务器忙!";

    }

}

 

 

 

 

26.@GetMapping与 @PostMapping

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

27.@EnableEurekaServer

启动EurekaServer

28.@EnableDiscoveryClient与@EnableEurekaClient

开启客户端

@EnableDiscoveryClient注解是基于spring-cloud-commons依赖,并且在classpath中实现;

@EnableEurekaClient注解是基于spring-cloud-netflix`依赖,只能为eureka作用;

如果你的classpath中添加了eureka,则它们的作用是一样的。

29.@LoadBalanced

在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能力

实例:

@Bean

    @LoadBalanced

    public RestTemplate restTemplate() {

        // 这次我们使用了OkHttp客户端,只需要注入工厂即可

        return new RestTemplate();

    }

 

 

 

 

30.@EnableCircuitBreaker

启动断路器

方法RestTemplate restTemplate():初始化RestTemplate 对象,并使用 @LoadBalanced作负载均衡

实例:

@SpringBootApplication

@EnableCircuitBreaker

@EnableEurekaClient // 配置本应用将使用服务注册和服务发现

public class HystrixSimpleCloudConsumerApplication {

 

    public static void main(String[] args) {

        args = new String[1];

        args[0] = "--spring.profiles.active=hystrix-simple";

        SpringApplication.run(HystrixSimpleCloudConsumerApplication.class, args);

    }

 

    /**

     * 初始RestTemplate

     * @return

     */

    @LoadBalanced

    @Bean

    public RestTemplate restTemplate() {

        return new RestTemplate();

    }

 

    /**

     * 使用fastjson做为json的解析器

     * @return

     */

    @Bean

    public HttpMessageConverters fastJsonHttpMessageConverters() {

        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();

        FastJsonConfig fastJsonConfig = new FastJsonConfig();

        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);

        fastConverter.setFastJsonConfig(fastJsonConfig);

        HttpMessageConverter<?> converter = fastConverter;

        return new HttpMessageConverters(converter);

    }

}

 

 

 

 

31.@EnableHystrix

启动熔断降级服务

32.@SpringCloudApplication

因为一个标准的Eureka服务,一般都需要@EnableDiscoveryClient、@SpringBootApplication以及@EnableCircuitBreaker三个注解,所以Spring官方提供了这个注解

实例:

@SpringCloudApplication

public class ConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConsumerApplication.class, args);

    }

 

    @Bean

    @LoadBalanced

    public RestTemplate restTemplate() {

        // 这次我们使用了OkHttp客户端,只需要注入工厂即可

        return new RestTemplate();

    }

}

 

 

 

33.@HystrixCommand

在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为"hi,"+name+",sorry,error!",代码如下:

实例:

@Service

public class HelloService {

 

    @Autowired

    RestTemplate restTemplate;

 

    @HystrixCommand(fallbackMethod = "hiError")

    public String hiService(String name) {

        return restTemplate.getForObject("http://SERVICE-HI/hi?name="+name,String.class);

    }

 

    public String hiError(String name) {

        return "hi,"+name+",sorry,error!";

    }

}

34.@DefaultProperties

读取properties文件

如果每一个方法都提供一个熔断处理方法,那么会显的类特别的臃肿,所以我们可以提供一个通用的处理方式,也就是在类上面添加一个注解@DefaultProperties

实例:

@RestController

@RequestMapping("consumer")

@DefaultProperties(defaultFallback = "defaultFallback")

public class ConsumerController {

    @Autowired

    private RestTemplate restTemplate;

    @GetMapping("{id}")

    @HystrixCommand//开启启用

    public String queryById(@PathVariable("id") Long id) {

        String url = "http://user-service/user/" + id;

        String user = restTemplate.getForObject(url, String.class);

        return user;

    }

    public String defaultFallback() {

        return "抱歉,服务器hin忙!";

    }

}

35.@HystrixProperty

设置熔断等级

实例:

@GetMapping("{id}")

@HystrixCommand(

        commandProperties = {

        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),

        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),

        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")

})

public String queryById(@PathVariable("id") Long id) {

    if(id % 2 == 0) {

        throw new RuntimeException("");

    }

    String url = "http://user-service/user/" + id;

    String user = restTemplate.getForObject(url, String.class);

    return user;

}

 

 

36.@FeignClient

指明要访问的服务名称

37.@EnableFeignClient

在启动类上,添加注解,开启Feign功能

实例:

@SpringCloudApplication

@EnableFeignClients//开启feign

public class ConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConsumerApplication.class, args);

    }

/*  如果前面有测试注意不会受影响

    @Bean

    @LoadBalanced

    public RestTemplate restTemplate() {

        // 这次我们使用了OkHttp客户端,只需要注入工厂即可

        return new RestTemplate();

    }*/

}

 

 

 

 

 

 

38.@EnableZuulProxy

通过@EnableZuulProxy注解开启Zuul的功能

实例:

@SpringBootApplication

@EnableZuulProxy // 开启Zuul的网关功能

public class GatewayApplication {

    public static void main(String[] args) {

        SpringApplication.run(GatewayApplication.class, args);

    }

}

 

 

 

 

 

39.@EnableFurekaServer

在顶目启动类上使用@EnableEurekaServer,可以将项目作为SpringCloud中的注册中心

40.@EnableDiscoveryClient、 @EnableEurekaClient

在启动类上面添加 @EnableDiscoveryClient、 @EnableEurekaclient 这二个注解作用,都可以让该服务注册到注册中心上去。

@EnableEurekaClient 只支持Eureka注册中心,@EnableDiscoveryClient 支持Eureka、 Zookeeper、Consul 这二个注册中心

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务中常用的注解 的相关文章

  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 带有 @RequestBody 的 Spring 多部分文件

    我正在尝试将数据从应用程序上传到 Spring 后端服务 要上传的内容是一个 DataModel 其中包含要创建的对象的数据以及链接到该数据的多个图像 因此我使用这个方法签名 RequestMapping method RequestMet
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 用于从字段中查找最大值的 MongoTemplate 方法或查询

    我正在使用 MongoTemplate 进行数据库操作 现在我想从所选结果中获取最大字段值 有人可以指导我如何编写查询 以便当我将查询传递给 find 方法时 它将返回我所需的文档最大字段 提前致谢 问候 可以在spring data mo
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • mysql 同步失败_线上MYSQL同步报错故障处理方法总结

    前言 在发生故障切换后 经常遇到的问题就是同步报错 下面是最近收集的报错信息 记录删除失败 在master上删除一条记录 而slave上找不到 Last SQL Error Could not execute Delete rows eve
  • C语言执行过程

    系列1 C语言执行过程 系列2 C程序方法调用 系列3 CS IP 寄存器 本文中涉及的代码地址 analyseExecutionOfC 文件结构 analyse execution of c compilePreProcessSource
  • [失败] 网易云音乐爬虫分析

    网易云音乐js破解分析 大家好 我是W 最近在搞毕设相关的材料 所以很久没有敲代码和写博客了 刚好 一个同学有个需求 要获取网易云音乐的歌曲id和封面地址 然后用外链播放 相当于在他的系统里加一个小功能 锦上添花 所以来找到我 刚开始我觉得
  • module xxx has no attribute

    授人以鱼不如授人以渔 希望这篇文章可以帮助大家解决一系列类似的问题 大家耐心看下去 肯定会有收获 今天看见一篇博客解决问题的思路给了我很大的启发 于是我就将他记录下来 大家可以一起学习一下 在文章的最后我也会挂出他的链接 这里具体为具体错误
  • Python操作SQL中json格式的问题

    1 json中的引号必须使用双引号 在mysql中双引号和单引号可以互换 但不可混合使用 需成对出现 mysql支持存储json格式数据 但是写入时json内容中引号必须使用双引号 否则出现下述错误 pymysql err Operatio
  • 超分辨率基础

    超分辨率综述 Image Super resolution 的深度学习方法 微信二维码引擎OpenCV开源 微信扫码背后的图像超分辨率技术 技术解析 即构移动端超分辨率技术 DIV2K数据集下载 B100 Manga109 Set5 Set
  • firefly框架分析之netconnect package(一)

    firefly下的目录结构如下 里面的各个包将会一一的介绍 今天先开始看看netconnect包 该包下面这些模块从connection开始 Connection py 与客户端的连接对象 通过其与客户端通讯 向客户端发送封装过的数据 还可
  • Qt源码解析1---D指针原理

    D指针 什么是d指针 如果你已经看过到Qt源文件像QLablel QPicture QLabel picture const Q D const QLabel if d gt picture return d gt picture retu
  • ChatGPT的接口在哪

    ChatGPT本身不是一个独立的接口 而是一个预训练的自然语言处理模型 如果您需要使用ChatGPT来实现某个自然语言处理任务 例如文本生成 问答等 您可以使用Python中的深度学习框架 如TensorFlow PyTorch 加载预训练
  • 谈我对于ajax的理解

    Ajax的全称是Asynchronous JavaScript and XML 中文名称定义为异步的JavaScript和XML Ajax是Web2 0技术的核心由多种技术集合而成 使用Ajax技术不必刷新整个页面 只需对页面的局部进行更新
  • qt 信号槽默认参数 toggled 和 trigger的区别

    toggled和trigger区别 1 toggle 类似开关 具有2个状态 打开 关闭 使用这个信号 是在这2个状态之间切换 2 trigger是一次性的 点击后 无法改变状态 要么是打开 要么是关闭 参考 http blog csdn
  • c# 对txt文件的读取与写入

    C txt文件分析 读取与写入 c 中对txt文件的读取写入在工作中用到的很多 今天写一个之前工作中用到的小demo 案例场景要求 txt文件中为很多条标记时间戳的报文 需要计算出每条报文从开始接收到结束用了多长时间 案例执行 如txt文件
  • Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法 为什么要学习数据结构和算法 这里我举个简单的例子 编程好比是一辆汽车 而数据结构和算法是汽车内部的变速箱 一个开车的人不懂变速箱的原理也是能开车的 同理一个不懂数据结构和算法的人也能编程 但是如果一个开车
  • apk文件 -- 反编译

    源博客 https www cnblogs com mfrbuaa p 4588057 html 编译工具 apktool 资源文件获取 能够提取出图片文件和布局文件进行使用查看 dex2jar 将apk反编译成java源代码 classe
  • Python中多线程和线程池的使用方法

    Python是一种高级编程语言 它在众多编程语言中 拥有极高的人气和使用率 Python中的多线程和线程池是其强大的功能之一 可以让我们更加高效地利用CPU资源 提高程序的运行速度 本篇博客将介绍Python中多线程和线程池的使用方法 并提
  • ad9361收发异常问题分析

    最近在调试ad9361 发送都调试好了 但是接收一直没调试好 折腾了一个多月才搞定接收 根据官方提供的api代码 需要修改的有 1 修改reference clk rate参考时钟 2 修改xo disable use ext refclk
  • CTF——被改错的密码

    http ctf idf cn index php g game m article a index id 29 cca9cc444e64c8116a30la00559c042b4看着像一串MD5加密 但是实际不是 去掉中间的l 进行md5
  • 新手小白一看就懂的Excel技能之入门基础

    很多同学开开心心拿到新买的电脑 开机一看 桌面干干净净的 想打开Excel 半天找不到 这些痛 只有新手小白才能懂 今天 我给大家好好讲讲怎么使用Excel 鼠标左键点击电脑桌面左下角的 搜索 输入 Excel 看到 Microsoft O
  • 过拟合现象,原因,以及降低过拟合的方法

    一 什么是过拟合 为什么要避免过拟合 图1 1 Overfit Normal 上图是一张使用线性回归拟合二维样本数据的matlab输出图片 其中Normal曲线是使用使用了带参数空间限制的最小二乘法进行求解的模型 Overfit曲线是使用最
  • 微服务中常用的注解

    注解的定义 Annotation 注解 用于为Java代码提供元数据 简单理解注解可以看做是一个个标签 用来标记代码 是一种应用于类 方法 参数 变量 构造器及包的一种特殊修饰符 1 Target 表示该注解类型所使用的程序元素类型 结合E