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