Java反射条件化装配核心是绕过Spring手动加载配置类:先反射解析@Conditional注解并校验条件,再Class.forName安全实例化,最后注册Bean到轻量级Map容器。

Java中通过反射加载配置类并实现条件化装配,核心在于绕过Spring容器、手动触发类的加载与条件判断,再按需注入Bean。这在轻量级框架、测试环境或嵌入式场景中很实用。
获取并解析配置类的注解信息
用反射读取配置类上自定义的条件注解(如 @ConditionalOnClass、@ConditionalOnProperty),提取关键参数:
- 调用 clazz.getAnnotationsByType(ConditionalOnClass.class) 获取所有条件注解实例
- 对 @ConditionalOnClass,检查 Class.forName(className) 是否成功,捕获 ClassNotFoundException
- 对 @ConditionalOnProperty,从系统属性或本地Map中读取对应key值,比对是否匹配 havingValue 或是否 matchIfMissing
动态加载满足条件的配置类
不是直接 new ConfigClass(),而是通过 Class.forName() + getDeclaredConstructor().newInstance() 安全实例化,避免无参构造缺失问题:
- 先验证类是否被JVM加载:用 ClassLoader.getSystemClassLoader().loadClass("xxx.Config")
- 若类存在且所有条件通过,再执行实例化;任一条件失败则跳过该类
- 建议缓存已加载成功的配置类实例,避免重复反射开销
模拟条件上下文,支持嵌套判断
真实场景中条件常组合使用(如“有A类 且 属性enabled=true”),需构建简易条件上下文对象:
- 定义 ConditionContext 接口,提供 getClassLoader()、getEnvironment()、getRegistry() 等基础能力
- 每个条件处理器(Condition 实现类)接收该上下文,自行决定是否匹配
- 配置类上可叠加多个 @Conditional,按声明顺序依次校验,全部通过才加载
注册Bean到简易容器(可选)
若需进一步管理Bean生命周期,可维护一个轻量级Map容器:
- 遍历配置类中的 @Bean 方法(用反射获取所有返回非void的public方法)
- 对每个方法,用 method.invoke(configInstance) 执行并获取Bean实例
- 以方法名或自定义 @Bean(name = "xxx") 为key,存入 ConcurrentHashMap
- 后续可通过名称获取Bean,模拟Spring的IoC基本行为

















