java中通过反射扫描带@producttype注解的类,自动注册为product接口实例,实现新增产品零配置:只需实现接口并添加注解,工厂启动时自动加载、缓存并支持多态调用。

Java中通过反射与多态结合工厂模式,可以实现无需硬编码修改、自动识别并加载新产品的“全自动扫描”机制。核心在于:用注解标记产品类,用反射扫描类路径,再借助多态统一调用接口,让新增产品对工厂完全透明。
定义可扩展的产品接口与注解
先约定产品行为契约,并用自定义注解标识哪些类属于可被自动发现的“产品”:
- 定义统一接口(如 Product),声明关键方法(如
execute()、getType()) - 创建注解 @ProductType,支持指定唯一类型标识(如
@ProductType("payment")),便于运行时分类 - 所有具体产品实现类(如
AlipayProduct、WechatPayProduct)实现接口并添加该注解
用反射扫描 classpath 下带注解的类
不依赖 Spring 的 @Component 或 XML 配置,而是手动扫描 jar/class 目录下所有标注了 @ProductType 的类:
- 借助
ClassPathScanningCandidateComponentProvider(Spring 提供)或轻量级工具如 Reflections 库 - 或纯 JDK 方式:遍历
ClassLoader.getResources("BOOT-INF/classes/")(Spring Boot)或Thread.currentThread().getContextClassLoader()加载的包路径,用URLClassLoader解析 .class 文件并检查注解 - 关键点:只加载带有 @ProductType 的类,跳过抽象类、接口和未标注类
构建泛型化自动注册工厂
工厂不再维护 if-else 或 Map<string class></string> 手动映射,而是启动时自动注册:
- 扫描完成后,遍历每个匹配类,读取
@ProductType.value()作为 key,用Class.newInstance()(或更安全的Constructor.newInstance())生成实例 - 将实例缓存进
Map<string product></string>,key 即注解值(如"alipay"),value 是已初始化的对象 - 提供
getProduct(String type)方法——返回的是 Product 接口类型,具体实现由多态决定,调用方完全无感知
新增产品零配置,开箱即用
当要接入新支付方式(比如 PayPalProduct):
- 只需新建类,实现 Product 接口,加上
@ProductType("paypal") - 编译进 classpath(打 jar 或放 classes 目录),下次启动时工厂自动扫描、实例化、注册
- 业务代码仍调用
factory.getProduct("paypal").execute(),无需改一行工厂或调度逻辑 - 若需运行时热加载,可封装为定时扫描+类卸载(注意 ClassLoader 隔离),但常规场景启动扫描已足够
这种设计把“发现”交给反射,“行为”交给多态,“装配”交给工厂,三者解耦清晰。不是黑魔法,但确实让扩展从“改代码→测→发版”变成“写类→编译→重启”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











