常用注解整理

218 阅读8分钟

Spring 注解

@RequestMapping 是接受前台请求url的,在class和方法上都可以使用。

@ResponseBody 将返回的对象通过转换器转换成JSON或XML的形式返回。会将数据写入到response对象的body区中。

@RequestBody   接受参数时使用

@Autowired  相当于一个get方法,完成自动装配动作,将组件扫描得到的bean和他们的依赖装配在一起。与@Resource类似,对成员变量,方法,构造函数进行标注,来完成自动装配的工作。只按照byType的策略进行注入。默认情况下它要求依赖对象必须存在,如果允许null只,可以设置它的required属性为false.如果想按照byName来进行注入,可结合@Qualifier一起使用。

@Bean   产生bean,并放在Spring容器当中,通畅放在方法上。主要用在@Configuration中,也可用在@Component中。 用来代替 XML 配置文件里面的 <bean ...> 配置。

@Target  用于自定义注解,通过ElementType来指定注解可使用范围的枚举集合

@Repository  注解可标记在任何类上,用来表明该类是用来执行数据库相关操作的,并支持自动处理操作数据库产生的异常。

@Resource     做bean依赖注入时候使用,但是@Resource并不是spring的注解,它的包是javax.annotation.Resource,需要导入,Spring支持。默认按照 byName自动注入。有两个重要属性,name&type,Spring将@Resource注解的name属性解析为bean的名字,而type属性解析为bean的 类型。所以,如果使用name属性,则使用byName的自动注入策略,而是用type属性时,则使用buType的自动注入策略。如果既不指定 name,也不指定type,默认name。 装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛异常。
  2. 如果指定了name,则从上下文查找名称(id)匹配的bean进行装配,找不到则抛异常。
  3. 如果指定了type,则从上下文查找类似匹配的唯一bean进行装配,找不到或找到多个,抛异常。
  4. 如果既没有指定name也没指定type,则按照byName的方式去装配,如果没有匹配,则回退为一个原始类型进行匹配,匹配则自动装配。

@Cacheable   可以标记在一个方法上,也可以标记在类上。标记方法上时表示该方法是支持缓存的,当标记在一个类上时,表示该类下所有的方法都支持缓存。Spring缓存通过键值对存储。@Cacheable可指定三个属性,value,key,condition.  condition指定发生的条件。Spring每次执行前都会检查一下cache中是否有相同的key的缓存元素,如果存在就不再执行该方法,而是从缓存中获取结果进返回,否则才会执行,并将结果存入指定缓存中。

@CachePut      与@Cacheable相同,也可声明一个方法支持缓存功能,但是不会在执行前去缓存中检查有没有之前执行过的结果,而是每次都会执行该方法并将执行结果以键值对的形式 存放到指定缓存中。

@CacheEvict     是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与 @Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称); key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。 allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,SpringCache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率; 清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素;

@Caching         可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

@PersistJobDataAfterExecution    告诉Quartz在任务执行成功完毕之后(没有抛出异常),修改JobDetail的JobDataMap备份,以供下一个任务使用。如果使用了该注解的话,强烈建议同时使用@DisallowConcurrenExecution注解,以避免两个同样的job并发执行的时候产生的存储数据迷惑。

@DisallowConcurrenExecution        可以添加到你的任务类中,它会告诉Quartz不要执行多个任务实例。

@ModelAttribute    Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了 @ModelAttribute 的方法。 在方法的入参前使用 @ModelAttribute 注解: -可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参;

@Retention()   自定义注解,有三种状态RetentionPolicy.SOURCE,  RetentionPolicy.CLASS,   RetentionPolicy.RUNTIME。 SOURCE 注解只保留在源文件,当java编译成class文件时,注解被抛弃。 CLASS 注解被保留到CLASS文件中,但jvm加载class时被遗弃,这是默认的声明周期。 RUNTIME 注解不仅被保留到class文件中,jvm加载class文件后,仍然存在。

@Inject 实现依赖注入,把受管理的bean注入到由容器管理的其他资源中。

@Entity   说明这个class是一个实体类,并且默认使用orm的规则,即class名即为数据库对应表名,class字段名对于表中字段名。@Entity也指明这是一个实体Bean。

@EneityScan 会自动扫描指定包下的全部标有@Entity 的类。

@SpringBootApplication 该类为 spring boot 项目启动类中的核心注解。用于Spring boot的开启,该注解由三个注解组成

  • @Configuration
  • @ComponentScan
  • @EnableAutoConfiguration

前两个是Spring 自带的,最后一个是Spring Boot核心的注解。源码如下

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),        
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {    ...}

@Configuration

org.springframework.context.annotation.Configuration

这是Spring 3.0 添加的一个注解,用来代替applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类进行注册。(注意:该注解是Spring Boot最核心的注解之一!!!)

@ImportResource
如果有些类的注册方式配置不了的,可以通过这个注解引入额外的XML配置文件,有些老的配置文件无法通过@Configuration方式配置的非常管用。

@Import 用来引用额外的一个或多个@Configuration修饰的配置文件类。

@SpringBootConfiguration 这个注解就是 @Configuration注解的变体,只是用来修饰是Spring Boot配置而已,或者可利于Spring boot 后续的扩展,源码如下

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}

@ComponentScan

org.springframework.context.annotation.ComponentScan

这是Spring 3.1 添加的一个注解,用来代替配置文件中的component-sacn 配置,开启组件扫描,即自动扫描包路径下的@Component 注解进行注册bean实例到context中。 另外,@CompontentScans 是可重复注解,即可以配置多个,用来配置注册不同的子包。(注意:该注解是Spring Boot最核心的注解之一!!!)

Spring 是一个依赖注入的框架。所有的内容都是关于bean的定义和其依赖关系。 定义Spring的第一步是使用正确的注解:@ComponentScan @Service @Repository 但是,Spring不知道你定义了某个bean,除非他知道哪里能找到这个bean。 ComponentScan 做的事情就是告诉Spring从哪里找到bean。 由你来定义哪些包需要被扫描。一旦你指定了,Spring将会在被指定的包及其下级的包中寻找bean。

ComponentScan 和 Component 的区别(它们使用的目的不一样):

  • 在某个类上使用@Component注解,就表示当需要创建类时,这个被注解的类是一个候选类。就是举手
  • @ComponentScan 用于扫描指定包下的类,就像看一下哪些类举手了

@EnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration

看全路径就知道,这是Spring boot 诞生时添加的注解,用来提供自动配置,上面的两个都是spring-context 包下的,不属于Spring boot ,所以Spring 3.0 之后的去XML配置方式已经为Spring boot埋下了伏笔。(注意:该注解是Spring Boot最核心的注解之一!!!)

@Component 把普通pojo实例化到spring容器中,相当于配置文件中的 。 泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。