多态架构结合依赖注入实现动态加载的核心是容器机制+接口契约+显式路由策略。需定义统一接口(如NotificationService)及多个实现类(Email/Sms/PushNotification),通过@Service注册Bean,用@Qualifier或自定义语义化注解(如@Email)区分;运行时由NotificationStrategy根据type查Map选择实现;插件化场景可借助ServiceLoader或YAML配置按需加载。

多态架构结合依赖注入实现动态加载,核心不是“让多态自动选实现”,而是靠容器机制 + 接口契约 + 显式路由策略来达成运行时灵活切换。关键在于把“选择逻辑”从硬编码移到配置或条件判断中,同时保持调用方代码不变。
定义统一接口与多个实现类
这是所有后续操作的基础。必须有一个明确的接口(或抽象类),以及至少两个满足该契约的具体实现:
- 比如定义 NotificationService 接口,含
send(String content)方法 - 提供 EmailNotification、SmsNotification、PushNotification 三个实现类
- 每个类都用
@Service注册为 Spring Bean,不指定名称则默认使用类名首字母小写(如 emailNotification)
用 @Qualifier 或自定义注解区分同类型 Bean
当容器中存在多个同一接口的 Bean 时,Spring 默认无法决定注入哪一个,必须显式标识:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在实现类上加
@Service("email")或@Component("sms"),再通过@Autowired @Qualifier("email")注入 - 更推荐方式:定义语义化注解,如
@Email、@Sms,并在对应实现类上标注;注入时写@Autowired @Email NotificationService service - 自定义注解需加上
@Qualifier元注解,Spring 才能识别其作为限定符
运行时按需选择实现(策略模式 + 工厂封装)
如果选择依据是请求参数、用户配置或业务规则(比如根据消息类型决定发邮件还是短信),就不能只靠启动时注入,得引入运行时决策层:
立即学习“Java免费学习笔记(深入)”;
- 新建一个 NotificationStrategy 类,用
@Autowired注入所有NotificationService实现,存入Map<String, NotificationService> - 对外提供
sendByType(String type, String content)方法,内部根据type查 map 获取对应实例再调用 - type 可来自配置文件、数据库字段或 HTTP 请求 header,做到不改代码即可扩展新渠道
插件化场景下按需加载实现类
对于真正需要热插拔的场景(如第三方通知插件),可借助 Java 的 ServiceLoader 或配置驱动加载:
- 在
META-INF/services/下声明接口全限定名,内容为实现类名(支持多行) - 宿主启动时调用
ServiceLoader.load(NotificationService.class)获取全部可用实现 - 配合
PluginContext注入配置、日志等能力,避免插件直接依赖 Spring 上下文 - 启用/禁用通过 YAML 配置控制,例如
plugins: [email, push],未列出的实现不初始化

















