AIGC标识 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代理机制(基石)
posted @ 2026-08-20 19:13  身娇体弱的咸鱼  阅读(3)  评论(0)    收藏  举报