spring中自定义注解实现自动装配bean,需定义运行时保留的注解(如@rpcreference),编写beanpostprocessor在postprocessproperties中反射注入依赖,并注册为@component;若用于controller参数,则需实现handlermethodargumentresolver。

Spring 中自定义注解实现自动装配 Bean,核心在于让 Spring 容器识别你的注解,并在合适时机(如 Bean 创建后)完成依赖注入。这不是靠 @Autowired 那套默认逻辑就能直接生效的,需要主动介入容器生命周期。
定义自定义注解并声明作用目标
先明确注解用途,比如叫 @RpcReference,用于注入远程服务代理对象:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RpcReference {
String value() default "";
boolean lazy() default false;
}
注意:必须加 @Retention(RetentionPolicy.RUNTIME),否则运行时无法反射读取;@Target 要覆盖字段、方法、参数等常见注入点。
编写 BeanPostProcessor 拦截并处理注入
这是最关键的一步——利用 Spring 的扩展点,在 Bean 初始化前后扫描并注入自定义注解标记的属性或方法:
- 实现 BeanPostProcessor 接口,重写 postProcessProperties(推荐 Spring 5.1+)或 postProcessAfterInitialization
- 用 ReflectionUtils 遍历目标 Bean 的所有字段/方法,找到标注了 @RpcReference 的位置
- 根据注解属性(如 value)构造对应 Bean 名称或类型,调用 beanFactory.getBean(...) 获取实例
- 通过 Field.set() 或 Method.invoke() 完成赋值(注意设置 accessible = true)
注册处理器并确保执行顺序
让自定义处理器被 Spring 扫描到:
- 加 @Component 注解,或在配置类中用 @Bean 声明
- 若依赖其他基础设施(如注册中心客户端),需通过 SmartInitializingSingleton 或 @DependsOn 控制初始化顺序
- 避免与 @Autowired 冲突:不要在同一个字段上同时使用 @Autowired 和你的自定义注解
补充:支持方法参数注入(如 AOP 或 HandlerMethod)
如果想在 Controller 方法参数里用 @RpcReference,就得走另一条路:
- 实现 HandlerMethodArgumentResolver,重写 supportsParameter 和 resolveArgument
- 在 resolveArgument 中根据参数类型或注解提取对应 Bean 并返回
- 通过 WebMvcConfigurationSupport.addArgumentResolvers 注册










