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都能获得在此处设置的键值对。