自定义注解+反射+spring容器可实现策略类零配置自动发现与装配。通过@strategy标注策略实现类,spring启动时扫描并构建concurrenthashmap策略映射,运行时o(1)获取实例。

自定义注解 + 反射 + Spring 容器,可以实现策略类的零配置自动发现与自动装配,无需手动在配置类中 @Bean 注册,也不用维护策略映射表。
定义策略标识注解
创建一个用于标记策略实现类的自定义注解,通常带属性以区分策略类型:
- 使用
@Target(ElementType.TYPE)表明只能标注在类上 - 用
@Retention(RetentionPolicy.RUNTIME)确保运行时可通过反射读取 - 添加一个
value()或type()属性,作为策略唯一标识(如枚举、字符串)
示例:
@Target(ElementType.TYPE)<br>@Retention(RetentionPolicy.RUNTIME)<br>public @interface Strategy {<br> String value(); // 如 "PAY_ALIPAY", "PAY_WECHAT"<br>}
编写策略接口与实现类
定义统一策略接口(如 PaymentStrategy),各实现类用自定义注解标注,并指定 type:
- 实现类必须是 Spring 管理的 Bean(加
@Component或被扫描到) - 注解值建议用常量或枚举,避免硬编码字符串出错
示例:
@Component<br>@Strategy("ALIPAY")<br>public class AliPayStrategy implements PaymentStrategy { ... }<br><br>@Component<br>@Strategy("WECHAT")<br>public class WechatPayStrategy implements PaymentStrategy { ... }
构建策略上下文:反射扫描 + 自动注册
借助 Spring 的 ApplicationContext 获取所有标注了 @Strategy 的 Bean,再通过反射读取注解值,构建成 Map<string t></string> 策略容器:
- 在配置类或初始化 Bean 中,调用
context.getBeansWithAnnotation(Strategy.class) - 遍历返回的 Map,对每个 Bean 实例,用
getClass().getAnnotation(Strategy.class).value()提取 key - 将 key → bean 存入线程安全的 ConcurrentHashMap(推荐),供运行时按需获取
关键点:确保扫描时机在所有策略 Bean 初始化完成之后(可用 @PostConstruct 或 SmartInitializingSingleton)。
运行时按需获取策略实例
封装一个策略工厂方法,根据业务类型字符串快速定位并返回对应策略 Bean:
- 方法参数即注解中定义的 value 值(如
"ALIPAY") - 内部从预加载的 Map 中 get,不存在时可抛异常或返回默认策略
- 避免每次调用都反射读取注解——只在启动时扫描一次,运行时 O(1) 查找
示例调用:
PaymentStrategy strategy = strategyContext.get("ALIPAY");<br>strategy.pay(order);










