不修改原类前提下,无构造/setter的Spring字段注入如何初始化依赖
解决方案
方案1:组件扫描(优先推荐,JarClass带Spring组件注解时使用)
如果JarClass上标注了@Component、@Service等Spring组件注解,直接在你的项目配置类上添加@ComponentScan扫描JarClass所在的包即可,Spring会自动完成实例化和内部@Autowired字段的注入,无需手动声明@Bean:
@Configuration @ComponentScan("com.example.jarpackage") // 替换为JarClass实际所在的包路径 public class Config { @Bean public JarField jarField() { return new JarField(); } }
方案2:借助Spring Bean工厂完成注入(通用方案,无需JarClass有组件注解)
你之前手动new JarClass返回的方式不会触发Spring的字段注入逻辑,你可以通过AutowireCapableBeanFactory让Spring处理已创建实例的注入逻辑:
@Configuration public class Config { @Autowired private ApplicationContext applicationContext; @Bean public JarField jarField() { return new JarField(); } @Bean public JarClass jarClass() { JarClass jarClass = new JarClass(); // 触发Spring对该实例的@Autowired字段注入 applicationContext.getAutowireCapableBeanFactory().autowireBean(jarClass); return jarClass; } }
这个方案不需要修改Jar包源码,也不依赖JarClass的内部字段名,后续JarClass新增其他@Autowired字段也无需调整配置。
方案3:反射直接赋值(备选方案)
如果不想依赖Spring的注入逻辑,也可以通过反射直接给私有字段赋值:
@Configuration public class Config { @Bean public JarField jarField() { return new JarField(); } @Bean public JarClass jarClass(JarField jarField) throws NoSuchFieldException, IllegalAccessException { JarClass jarClass = new JarClass(); Field field = JarClass.class.getDeclaredField("jarfield"); field.setAccessible(true); field.set(jarClass, jarField); return jarClass; } }
该方案的缺点是耦合JarClass的内部字段名,如果Jar包升级修改了字段名会导致注入失败。
内容的提问来源于stack exchange,提问作者user11691092
相关产品推荐
相关产品推荐

