在 Spring 中,“处理 Java 注解”主要涉及 注解的解析、注册和使用,Spring 通过 反射 + BeanPostProcessor / BeanFactoryPostProcessor + AOP 等机制来完成。下面从整体到常见场景说明。
Java 注解(如 @Component、@Autowired)在编译后只是元数据,本身不具备逻辑。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}
只有 Retention = RUNTIME 的注解,Spring 才能在运行时读取。
Spring 启动时:
@ComponentScan("com.example")
.class 文件@Component 及其衍生注解)BeanFactorySpring 用 BeanPostProcessor 在 Bean 生命周期中“处理注解”。
常见处理器:
| 注解 | 处理器 |
|---|---|
@Autowired |
AutowiredAnnotationBeanPostProcessor |
@PostConstruct |
CommonAnnotationBeanPostProcessor |
@Transactional |
AOP + TransactionInterceptor |
@Async |
AsyncAnnotationBeanPostProcessor |
@Component
@Service
@Repository
@Controller
处理方式:
ClassPathScanningCandidateComponentProviderBeanDefinitionDefaultListableBeanFactory@Autowired
@Resource
@Value
处理流程:
AutowiredAnnotationBeanPostProcessor#postProcessPropertiesBeanFactory 获取依赖field.setAccessible(true);
field.set(bean, dependency);
@PostConstruct
@PreDestroy
CommonAnnotationBeanPostProcessor@Transactional
@Async
@Cacheable
处理方式:
@Transactional
public void save() {}
实际调用的是:
TransactionInterceptor.invoke()
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {}
方式一:BeanPostProcessor
public class LogProcessor implements BeanPostProcessor {
public Object postProcessAfterInitialization(Object bean, String name) {
// 反射判断是否含有 @Log
}
}
方式二:AOP(最常用)
@Aspect
@Component
public class LogAspect {
@Around("@annotation(Log)")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("before");
return pjp.proceed();
}
}
Spring 使用:
AnnotatedElementUtilsAnnotationUtilsReflectionUtilsmethod.isAnnotationPresent(Log.class);
AnnotationUtils.findAnnotation(method, Log.class);
findAnnotation支持 继承 / 元注解
Spring 通过“扫描注解 → 注册 Bean → Bean 生命周期中通过 Processor / AOP 解析并执行注解逻辑”来处理 Java 注解。
如果你愿意,我可以:
你更想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。