我有一个第三方库,我无法控制它,并且其中有一些 java 代码:
@Configuration
public class DemoConfig {
@Autowired
@Bean
public DemoService demoService() {
return new DemoService(demoService2());
}
@Bean
public DemoService2 demoService2() {
return new DemoService2();
}
}
上面的代码一直运行良好,直到 Spring 6.2.0,此时 Spring 开始拒绝 @Autowired 为无效(这很公平)并导致应用程序崩溃(详细信息请参阅 BeanMethod 类)。
我的主要问题是:我的选择是什么?
作为我的构建工具(在本例中为 gradle)的一部分,以编程方式修改第 3 方库字节码是我的最佳选择吗?
非常感谢您的专业知识和时间。
我会尝试从组件扫描中排除此配置,并在需要时在其他配置类中手动添加其 bean。 在 Spring Boot 上,它可能如下所示:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class),
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DemoConfig.class) // exclude configuration from the scan
})
public class MyApplication {
}
新配置:
@Configuration
public class NewDemoConfig {
@Bean
public DemoService demoService() {
return new DemoService(demoService2());
}
@Bean
public DemoService2 demoService2() {
return new DemoService2();
}
}
P.s.:为了在 Spring Boot 应用程序中从组件扫描中排除配置,我接受了 this 答案,可能有更优雅的方法。