持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
Spring 常用注解
@Autowired @Value
在Spring中
CommonAnnotationBeanPostProcessor处理了@Resource,
AutowiredAnnotationBeanPostProcessor处理了@Autowired、@Value、@Inject
- @Autowired、@Inject(Java JSR330中的规范)、@Resource(Java JSR250中的规范), 都可以用于Spring Bean的注入 Spring Bean的注入支持注入集合
// 注入所有IService类型的bean到List
@Autowired
private List<IService> serviceList;
// 注入所有IService类型的bean到Map, Map的key为beanName
@Autowired
private Map<String, IService> serviceMap;
- @Value用于配置注入, 支持SpringEL表达式
// 普通, : 后是默认值
@Value("${aa}")
@Value("${aa:xx}")
// List
@Value("#{"${aa}".split(',')}")
// Map
@Value("#{${aa}}")
// Date类型
@Value("#{new java.text.SimpleDateFormat("yyyy-MM-dd").parse("${date}")}")
当然注入复杂对象配置我们使用SpringBoot提供的@ConfigurationProperties会更加方便
@Component
声明为一个Spring组件, 被很多其他Spring注解引用
@Configuration @Bean
@Bean作用于方法上, 返回一个对象 @Configuration声明为一个配置类, 用于声明一个或多个@Bean方法, @Bean方法默认执行一次, 5.2后增加proxyBeanMethods属性, 默认true, proxyBeanMethods=false @Bean方法每次创建新的对象
@Repository @Service @Controller @RestController
声明为数据层、服务层、控制层, @RestController为响应json数据控制层
@RequestMapping @GetMapping @PostMapping @PutMapping @PatchMapping @DeleteMapping
@RequestMapping支持所有方式地址映射, 其余的是声明固定请求方式的地址映射, GET/POST/PUT/PATCH/DELETE
@RequestBody
请求数据为json格式
@ResponseBody
响应数据为json格式
@PathVariable
解析URL上的值绑定到方法参数上
@GetMapping("/details/{id}")
public R details(@PathVariable Integer id) {
return R.isOk();
}
@ControllerAdvice @RestControllerAdvice
全局异常处理, @RestControllerAdvice响应json数据
@ExceptionHandler(Exception.class)
public R globalExceptionHandler(Exception e) {
// do something ...
}
@Transactional
声明式事务 该注解被@Inherited标记支持继承
isolation隔离级别默认为数据库的默认隔离级别,MySQL InnoDB默认级别为可重复读(Repeated Read)timeout超时时间(秒), 默认-1rollbackFor默认回滚RuntimeException和Error
@DependsOn
指定当前bean依赖的bean, 用于@Component/@Bean
@EnableScheduling @Scheduled
定时任务, 支持cron表达式
@Import @Enablexxx
导入外部类, @Enablexxx中会使用@Import导入外部类
@Primary
多个实例, 默认优先选择被@Primary标记的
@Lazy
延迟加载
@EnableCaching @Cacheable @CachePut @CacheEvict
接口缓存, 可使用RedisCacheManager管理, 参考我之前的文章
@Profile
环境激活配置, 用于区分不同环境下的配置, 如@Profile(value = {"dev", "test"})
@PostConstruct
@PostConstruct注解的方法将会在依赖注入完成后被调用, 其实不是Spring的注解, 是Java EE5规范中用于影响Servlet生命周期的注解
@Aspect
用于标记为切面, 并不是Spring的注解, AspectJ来自于Eclipse基金会,
Spring AOP使用动态代理方式实现, AspectJ AOP使用静态织入方式实现,
从功能上看, AspectJ AOP比Spring AOP更加强大, 性能也更好, 但是需要使用ajc编译, 使用相对于Spring来说更加复杂
@Order
改变执行顺序, 值越小优先级越高, 可以搭配@Aspect使用, 改变切面的执行顺序等