Spring注解
常用注解
最基础的三个注解
要实现IOC(控制反转)效果,首先需要让Spring框架感知到被管理的对象,方式是在类或方法上加如下注解。
@Component: 加在类上,Spring可自动创建并管理此类的对象。扩展变体有@Controller / @RestController、@Service、 @Repository / @Mapper。
@Bean: 加在方法上,方法需返回被管理的对象。
@AutoConfiguration: SpringBoot项目专属,加在类上,类内可加@Bean方法,还需要在文件
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
写入其包路径(写路径是核心,加注解只是让类功能更清晰)。加上此注解的类就是配置类,与常用的yml配置文件类似,只是以不同的格式修改spring配置。同时针对不能修改代码、但又需要被Spring管理的类,需配合@Bean生成可被管理的对象,例如MybatisPlusInterceptor。
@Configuration: Spring项目通用,但需
指定注入细节
有了管理对象后,Spring需要知道这些对象在哪里用、什么时候用,将根据下列注解设置注入细节:
@Autowired/@Resource/@Inject: [区别]
@Conditional / @ConditionalOnMissingBean:
@ConditionalOnClass(RedisTemplate.class) // 只有redis依赖存在才加载
@Qualifier("beanName"): 与@Autowired配合,指定注入的对象名称,前提是有不同名称的同类bean:
@Component("fooFormatter") 、@Component("fooFormatter")分别注释在Formatter的两个子类上。
AOP行为增强
仅仅是按照指定条件生成所需对象,常常不足以满足业务需求,因此Spring基于AOP()原理提供了日志、拦截、事务功能,常用注解如下:
@Transactional:
@Async / @Cacheable:
@Aspect + @Around / @Before / @After:
启用功能等配置类注解
这些注解本质上是对配置的修改,因此加在被@Configuration、@AutoConfiguration、@SpringBootApplication(包含配置注解)注解的类上。
@EnableAspectJAutoProxy:
@EnableTransactionManagement:
@EnableAsync:
@ComponentScan("..."):
@MapperScan("..."):
@Import + ImportSelector: 引入其他配置类。
@Import(RedisAutoConfiguration.class) // 导入自动配置类
生命周期增强注解
@PostConstruct:
@PreDestroy:
注解使用细节
Spring将扫描类路径,根据@Component等注解生成BeanDefinition,得到基本的bean信息,Spring不管理手动new得到的对象,因此:
| 对象特征 | 使用方式 |
|---|---|
| 有状态、需要依赖、需要增强、需要复用 | @Autowired 注入 |
| 无状态、纯数据、生命周期短、第三方基础类 | new |
关键认知:
@PostConstruct的执行顺序在@Autowired之后,在@Transactional代理生成之前。所以如果你在@PostConstruct里调用了@Transactional方法,事务不会生效(因为此时代理还没生成)。这是很多人踩过的坑。
按“Bean的生命周期”串联所有注解
这是理解Spring注解最好的视角——一个Bean从出生到销毁,经历了哪些环节,每个环节对应什么注解:
1. 定义阶段
├─ @Component / @Service / @Repository / @Controller
│ → 告诉Spring:扫描我,把我注册成Bean
├─ @Configuration + @Bean
│ → 在配置类中手动声明Bean(常用于第三方库,如RedisTemplate)
└─ @Conditional / @ConditionalOnMissingBean
→ 满足条件才注册(Spring Boot自动配置的灵魂)
2. 装配阶段(依赖注入)
├─ @Autowired / @Inject
│ → 按类型自动注入
├─ @Qualifier("beanName")
│ → 当有多个同类型Bean时,指定具体哪一个
└─ @Value("${xxx}")
→ 从配置文件(application.yml)中注入值
3. 初始化前后(增强)
├─ @PostConstruct(初始化后执行)
│ → 常用于加载缓存、初始化数据源连接池
├─ @PreDestroy(销毁前执行)
│ → 常用于释放资源、关闭线程池
├─ @Transactional
│ → BeanPostProcessor在初始化后,用AOP代理包装
└─ @Async / @Cacheable
→ 同理,都是通过AOP代理增强
4. 运行时拦截(AOP)
├─ @Aspect + @Around / @Before / @After
│ → 在方法执行前后插入自定义逻辑(如日志、权限)
└─ @EnableAspectJAutoProxy
→ 开启AOP代理机制(基石)

浙公网安备 33010602011771号