温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring如何处理java注解

发布时间:2026-10-22 23:25:09 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Spring 中,“处理 Java 注解”主要涉及 注解的解析、注册和使用,Spring 通过 反射 + BeanPostProcessor / BeanFactoryPostProcessor + AOP 等机制来完成。下面从整体到常见场景说明。


一、Spring 处理注解的整体流程

1. 注解本身只是“标记”

Java 注解(如 @Component、@Autowired)在编译后只是元数据,本身不具备逻辑。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}

只有 Retention = RUNTIME 的注解,Spring 才能在运行时读取。


2. Spring 扫描与解析注解

Spring 启动时:

  1. 指定扫描路径
    @ComponentScan("com.example")
    
  2. ClassPathBeanDefinitionScanner
    • 扫描 .class 文件
    • 判断是否包含特定注解(如 @Component 及其衍生注解)
  3. 注册 BeanDefinition
    • 把带注解的类注册到 BeanFactory

3. 通过 BeanPostProcessor 处理注解

Spring 用 BeanPostProcessor 在 Bean 生命周期中“处理注解”。

常见处理器:

注解 处理器
@Autowired AutowiredAnnotationBeanPostProcessor
@PostConstruct CommonAnnotationBeanPostProcessor
@Transactional AOP + TransactionInterceptor
@Async AsyncAnnotationBeanPostProcessor

二、常见注解的处理方式

1. 组件注册类注解

@Component
@Service
@Repository
@Controller

处理方式:

  • ClassPathScanningCandidateComponentProvider
  • 扫描类上的注解
  • 生成 BeanDefinition
  • 交给 DefaultListableBeanFactory

2. 依赖注入注解

@Autowired
@Resource
@Value

处理流程:

  1. Bean 实例化
  2. AutowiredAnnotationBeanPostProcessor#postProcessProperties
  3. 反射获取字段 / 方法
  4. 从 BeanFactory 获取依赖
  5. 反射注入
field.setAccessible(true);
field.set(bean, dependency);

3. 生命周期注解

@PostConstruct
@PreDestroy
  • CommonAnnotationBeanPostProcessor
  • 在 Bean 初始化前后调用

4. AOP 相关注解(重点)

@Transactional
@Async
@Cacheable

处理方式:

  • 解析注解
  • 创建 代理对象(JDK / CGLIB)
  • 在方法调用前后插入逻辑
@Transactional
public void save() {}

实际调用的是:

TransactionInterceptor.invoke()

5. 自定义注解如何处理(重点)

(1)定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Log {}

(2)扫描 / 处理

方式一: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 如何“读取”注解(底层)

Spring 使用:

  • AnnotatedElementUtils
  • AnnotationUtils
  • ReflectionUtils
method.isAnnotationPresent(Log.class);
AnnotationUtils.findAnnotation(method, Log.class);

findAnnotation 支持 继承 / 元注解


四、总结一句话

Spring 通过“扫描注解 → 注册 Bean → Bean 生命周期中通过 Processor / AOP 解析并执行注解逻辑”来处理 Java 注解。

如果你愿意,我可以:

  • 画一张 Spring 注解处理流程图
  • 写一个 完整自定义注解示例
  • 深入讲 @Autowired 源码流程

你更想看哪一个?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手