Spring 教程

Spring 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/spring_framework-annotation.html

Spring 常用注解介绍


java 中注解是一种元数据,元数据即解释数据的数据,这就是所谓配置,xml 也是一种元数据。spring 中大量使用了注解的方式,利用反射机制原理解决大量的配置问题,给我们的工作带来方便。

下面列出了基于 spring 开发中常见的注解。

声明 bean 组件的注解

  • @Component:底层的组件注解,没有明确的逻辑角色,很多高层的组件底层其实就是 @Component
  • @Service:在业务逻辑层使用(service 层),底层其实是 @Component
  • @Repository:在数据访问层使用(dao层),底层其实是 @Component
  • @Controller:在展现层使用,控制器的声明,MVC 框架中的 C,底层其实还是 @Component
  • @Configuration:声明当前类为配置类,其中内部组合了 @Component 注解,表明这个类是一个 bean。

注入 bean 的注解

  • @Autowired:由 spring 定义;
  • @Inject:由 JSR-330 提供;
  • @Resource:由 JSR-250 提供。

java 配置类相关注解

  • @Bean:注解在方法上,声明当前方法的返回值为一个 bean,替代 xml 中的方式;
  • @ComponentScan:用于对 Component 进行扫描;
  • @WishlyConfiguration:为 @Configuration@ComponentScan 的组合注解,可以替代这两个注解。

AOP(切面)相关注解

Spring 支持 AspectJ 的注解式切面编程,其注解都是 aspectj 包里的。

  • @Aspect:声明一个切面,然后类内部使用 @After、@Before、@Around 定义建言(advice),可直接将拦截规则(切点)作为参数;
  • @After:在方法执行之后执行(方法上);
  • @Before:在方法执行之前执行(方法上);
  • @Around:在方法执行之前与之后执行(方法上);
  • @PointCut:声明切点(方法上)。

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

@Bean 的属性支持

  • @Scope:设置 Spring 容器如何新建 Bean 实例(方法上,得有 @Bean) 其设置类型包括:
    • Singleton - 单例,一个 Spring 容器中只有一个 bean 实例,默认模式;
    • Prototype - 每次调用新建一个 bean;
    • Request - web 项目中,给每个 http request 新建一个 bean;
    • Session - web 项目中,给每个 http session 新建一个 bean;
    • GlobalSession - 给每一个 global http session 新建一个 Bean 实例;
  • @StepScope:在 Spring Batch 中还有涉及;
  • @PostConstruct:由 JSR-250 提供,在构造函数执行完之后执行,等价于 xml 配置文件中 bean 的 initMethod
  • @PreDestory:由 JSR-250 提供,在 Bean 销毁之前执行,等价于 xml 配置文件中 bean 的 destroyMethod

@Value 注解

@Value 为属性注入值(属性上)。

@Value 支持 spring 环境配置注入、SpEL(Spring 表达式)形式注入、文件资源注入等,具体可以参考 Spring @Value 注解使用方法详解

环境切换

  • @Profile:通过设定 Environment 的 ActiveProfiles 来设定当前 context 需要使用的配置环境,在类或方法上;
  • @Conditional:Spring4 中可以使用此注解定义条件化的 bean,通过实现 Condition 接口,并重写 matches 方法,从而决定该 bean 是否被实例化,其作用在方法上。

@Enable* 注解说明

Enable 开头的注解顾名思义是针对 spring 某些功能或组件的开启支持。

  • @EnableAsync:开启异步方法的支持,通过此注解开启对异步任务的支持,然后和 @Async 具体执行的方法注解一起使用;
  • @EnableScheduling:开启计划任务的支持;然后和 @Scheduled 具体执行任务的方法注解一起使用;
  • @EnableAspectJAutoProxy:开启对 AspectJ 自动代理的支持;
  • @EnableWebMvc:开启 Web MVC 的配置支持;
  • @EnableConfigurationProperties:开启对 @ConfigurationProperties 注解配置 Bean 的支持;
  • @EnableJpaRepositories:开启对 Spring Data JPA Repository 的支持;
  • @EnableTransactionManagement:开启注解式事务的支持;
  • @EnableCaching:开启注解式的缓存支持。

Spring MVC 相关注解

除了上面提到的 @EnableWebMvc 和 @Controller 注解之外,具体还有如下注解:

  • @RequestMapping:用于映射 Web 请求,包括访问路径和参数(类或方法上);
  • @RequestBody:允许 request 的参数在 request 体中,注解放在参数前;
  • @ResponseBody:支持将返回值放在 response 内,而不是一个页面,通常用户返回 json 数据(返回值旁或方法上);
  • @PathVariable:用于接收路径参数,比如 @RequestMapping("/hello/{name}") 声明的路径,将注解放在参数中前,即可获取该值,通常作为 Restful 的接口实现方法;
  • @RestController:该注解为一个组合注解,相当于 @Controller@ResponseBody 的组合,注解在类上,意味着,该 Controller 的所有方法都默认加上了 @ResponseBody
  • @ControllerAdvice:通过该注解,我们可以将对于控制器的全局配置放置在同一个位置,注解了 @Controller 的类的方法可使用 @ExceptionHandler@InitBinder@ModelAttribute 注解到方法上,这对所有注解了 @RequestMapping 的控制器内的方法有效;
  • @ExceptionHandler:用于全局处理控制器里的异常;
  • @InitBinder:用来设置 WebDataBinder,WebDataBinder 用来自动绑定前台请求参数到 Model 中;
  • @ModelAttribute:本来的作用是绑定键值对到 Model 里,在 @ControllerAdvice 中是让全局的 @RequestMapping 都能获得在此处设置的键值对。