首页 > 技术文章 > Spring 注解集

ruhuanxingyun 2020-08-28 12:38 原文

 一、声明Bean

  1. @Component:表示一个组件,标识为Spring中的Bean,可以作用在任何层次;

  2. @Controller

    A. 通常作用在控制层,其功能与@Component相同;

    B. 组合注解:@RestController,相当于@Controller+@ResponseBody。

  3. @Service

    A. 通常作用在业务逻辑(Service)层,其功能与@Component相同;

    B. 注意是放在实现类上,而非接口,因为接口不能实例化。

  4. @Repository:作用在数据访问(Dao)层,其功能与@Component相同。

 

二、注入Bean

  1. @Autowired

    A. 由Spring提供,默认按照类型(byType)自动注入,如果没有找到就按照名称(byName)自动注入;

    B. 如果查找到多个,则要借助@Qualifier("name")注解匹配其中一个;

    C. 用于Bean的字段(可能出现NPE问题)、setter方法和构造方法上,显示地声明依赖;

  2. @Inject:由JSR-330提供;

  3. @Resource:由JSR-250提供,按照名称(byName)自动注入,如果没有找到就按照类型(byType)自动注入;

  4. @Lazy:作用在Spring的组件类上,是为了延迟初始化一个Bean,在第一次使用时才会被创建和初始化;

  5. @Qualifier:注解是和@Autowired一起使用的。使用此注解可以让你对注入的过程有更多的控制。@Qualifier可以被用在单个构造器或者方法的参数上。当上下文有几个相同类型的bean, 使用@Autowired则无法区分要绑定的bean,此时可以使用@Qualifier来指定名称;

  6. @Required:此注解用于bean的setter方法上。表示此属性是必须的,必须在配置阶段注入,否则会抛出BeanInitializationExcepion。

 

三、配置类相关

  1. @Configuration

    A. 声明当前类为配置类,相当于xml形式的Spring配置;

    B. 其中内部组合了@Component注解;

    C. 组合注解:@WishlyConfiguration,相当于@Configuration+@ComponentScan。

  2. @Bean

    A. 作用在方法上,声明当前方法的返回值为一个Bean,替代xml中的方式;

    B. @Scope:设置Spring容器如何新建Bean实例,方法上得有@Bean。

  3. @ComponentScan:用于对@Controller、@Service、@Repository和@Component的组件进行扫描;

   另外:@MapperScan:用于扫描Mapper接口的包路径,然后接口在编译之后都会生成相应的实现类;

      @Mapper:使单个接口在编译之后生成实现类。

  4. @Import

    A. 直接导入Configuration配置类;

    B. 根据条件选择导入不同的配置类ImportSelector;

    C. 动态注册Bean ImportBeanDefinitionRegistrar。

    可参考:spring注解之@Import注解的三种使用方式

  5. @ImportResource:用来导入xml配置文件,比如有些配置用的xml配置;

  6. @Value:作用在字段、构造器参数和方法参数上,读取配置文件的值。

 

四、SpringMVC相关注解

  1. @RequestMapping

    A. 作用:将HTTP请求映射到MVC和REST控制器的处理方法上;

    B. 作用域:类级别或方法级别,其中类上相对于Web根目录,方法上的是相对于类上的路径;

    C. 多个URI:可以将多个请求映射到一个方法上,支持通配符和ANT风格的路径;

    D. methd属性:表示请求方法,将请求映射到一个特定的方法上,所有的请求默认都会是GET类型的,方法有GET、POST、PUT、DELETE和PATCH;

    E. params属性:表示请求参数,可以进一步缩小请求映射的定位范围,即让多个处理方法处理同一个URL请求,而请求的参数是不一样的;

    F. headers属性:表示请求头,根据请求头中消息头内容缩小请求映射的范围;

    G. produces和consumes属性:配合@ResponseBody使用,也是缩小请求映射的范围;

    H. 动态URI:配合@PathVaraible使用,URI中的值可以作为控制器中处理方法的参数,也可以使用正则表达式,占位符使用{};

    I. 默认方法:在控制器类中,可以有一个默认的处理方法,即方法上没有请求路径value值;

    J. 组合注解:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping和@PatchMapping。

  2. @RestController

    A. 是一个组合注解,相当于@Controller+@ResponseBody;

    B. 注解在类上,表示该Controller的所有方法都默认加上了@ResponseBody。

  3. @RequestBody:作用在方法参数前面,表示请求的参数放在对象中,而不是在直接拼接在地址后面;

  4. @ResponseBody:作用在方法上,表示将返回值放在response内,而不是一个页面,通常用户返回json数据;

  5. @PathVariable:作用在方法参数前面,用于接收路径参数,比如@RequestMapping(“/hello/{id}”),常用在Restful的接口上;

  6. @EnableWebMvc:在配置类中开启Web MVC的配置支持,如一些ViewResolver或者MessageConverter等,若无此句,重写WebMvcConfigurerAdapter方法(用于对SpringMVC的配置);

  7. @ControllerAdvice:通过该注解,我们可以将对于控制器的全局配置放置在同一个位置,注解了@Controller的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上,
这对所有注解了 @RequestMapping的控制器内的方法有效。

  8. @ExceptionHandler:用于全局处理控制器里的异常;

  9. @InitBinder:用来设置WebDataBinder,WebDataBinder用来自动绑定前台请求参数到Model中;

  10. @ModelAttribute:本来的作用是绑定键值对到Model里,在@ControllerAdvice中是让全局的@RequestMapping都能获得在此处设置的键值对;

  11. @CrossOrigin:支持跨域请求;

  12. @RequestParam:用在请求handler方法的参数上,用于将http请求参数的值绑定到参数上;

  13. @RequestPart:用在请求handler方法的参数上,用于将文件之类的multipart绑定到参数上;

  14. @RequestHeader:用在请求handler方法的参数上,用于将http请求头部的值绑定到参数上;

  15. @SessionAttributes:此注解用于type级别,用于将JavaBean对象存储到session中。一般和@ModelAttribute注解一起使用;

  16. @SessionAttribute:此注解用于方法的参数上,用于将session中的属性绑定到参数;

  17. @RestControllerAdvice:此注解用于class上,同时引入了@ControllerAdvice和@ResponseBody两个注解;

  18. @ResponseStatus:此注解用于方法和exception类上,声明此方法或者异常类返回的http状态码。可以在Controller上使用此注解,这样所有的@RequestMapping都会继承;

  19. @RequestAttribute:此注解用在请求handler方法的参数上,用于将web请求中的属性(request attributes,是服务器放入的属性值)绑定到方法参数上;

  20. @MatrixVariable:此注解使用在请求handler方法的参数上,Spring可以注入matrix url中相关的值。这里的矩阵变量可以出现在url中的任何地方,变量之间用;分隔;

  21. @CookieValue:此注解用在@RequestMapping声明的方法的参数上,可以把HTTP cookie中相应名称的cookie绑定上去。

 

五、@Enable*注解

  Enable表示开启/允许一项功能,主要核心的配置就是注解里@Import导入的配置文件

  1. @EnableConfigurationProperties:开启对@ConfigurationProperties注解配置Bean的支持;

  2. @EnableJpaRepositories 开启对SpringData JPA Repository的支持;

  3. @EnableCaching:开启注解式的缓存支持。

 

六、异步任务相关

  1. @EnableAsync

    A. 一般作用在启动类上,用于开启对异步任务的支持,如果其他地方使用需要配合@Configuration同时使用;

    B. 可以自定义线程池;

  2. @Async

    A. 只能使用到被代理的对象方法上,即代理类的入口方法处,且方法必须是public的,表明这是个异步任务,若是用在类上,那就代表所有方法都是异步执行;

    B. 需要使用@EnableAsync开启异步任务;

    C. 使用@Async异步注解不能和@Transaction事务注解在同一个方法上同时使用,不然事务注解将无效,要使用事务,需要把事务注解提取到方法里面的子方法上。

 

七、调度任务相关

  1. @EnableScheduling:一般作用在启动类上,用于开启对调度任务的支持,如果其他地方使用需要配合@Configuration同时使用;

  2. @Scheduled

    A. 作用在方法上,表明这是个调度任务;

    B. 需要使用@EnableScheduling开启调度任务;

    C. fixedRate——固定频率

     corn——自定义执行表达式

 

八、AOP(切面)相关

  1. @EnableAspectJAutoProxy:开启对AspectJ自动代理的AOP支持;

  2. @Aspect:声明一个切面,用在类上;

  3. @Before:在我们执行目标方法之前运行,指定一个切入点表达式,作用在方法上;

  4. @After:在我们目标方法运行结束之后 执行,不管有没有异常,指定一个切入点表达式,作用在方法上;

  5. @Around:在我们目标方法运行之前和之后执行,需要手动执行joinPoint.procced(),作用在方法上;

  6. @AfterReturning:在我们的目标方法正常返回值后执行,除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值;

  7. @AfterThrowing:在我们的目标方法出现异常后执行,除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名;

  8. @PointCut

    A. 声明切入点,写切点表达式,用在方法上;

    B. 在java配置类中使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持。

 

九、Profile(环境)相关

  1. @Profile:通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境,作用在类或方法上;

  2. @Conditional:Spring4中可以使用此注解定义条件话的bean,通过实现Condition接口,并重写matches方法,从而决定该bean是否被实例化,用在方法上。

 

十、数据访问相关

  1. @EnableTransactionManagement:开启注解式事务的支持;

  2. @Transactional:此注解使用在接口定义、接口中的方法、类定义或者类中的public方法上。需要注意的是此注解并不激活事务行为,它仅仅是一个元数据,会被一些运行时基础设施来消费。

 

十一、@ConditionalOnx注解

  1. @ConditionalOnBean:当容器中有指定Bean的条件下进行实例化;

  2. @ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化;

  3. @ConditionalOnResource:当类路径下有指定的资源时触发实例化;

  4. @ConditionalOnProperty:当指定的属性有指定的值时进行实例化;

  5. @ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化;

  6. @ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean;

  可参考:@ConditionalOn组合注解

 

十二、其他

  1. @PostConstruct:执行初始化的操作,只执行一次,方法执行顺序为:Constructor > @Autowired > @PostConstruct,即在对象加载完、依赖注入后执行;

  2. @PreDestroy:在对象消亡前执行的操作,只执行一次。

 

推荐阅读