spring-boot - 尝试将 JSR330ScopeMetadataResolver 与 Spring Boot 一起使用但没有成功
问题描述
我正在尝试使用 Spring Boot 将 Spring DI 改造到现有应用程序中。我想使用 JSR-330 注释而不是 Spring 的。我想将原型范围设为默认值,因此我不必在任何地方都使用非 JSR-330 范围 @Scope("prototype") 。我首先尝试使用以下方法安装 JSR330ScopeMetadataResolver:
SpringApplication application = new SpringApplication(OurApplication.class);
ConfigurableApplicationContext context = application.createContext();
context..setScopeMetadataResolver(new Jsr330ScopeMetadataResolver());
application.run(args);
注入没有注释的类时,我仍然得到一个单例。然后我尝试使用 ApplicationContextInitializer 来做同样的事情。无论哪种方式,我都会注入一个单例。在调试器中,我使用初始化程序验证了 Jsr330ScopeMetadataResolver 正在 ApplicationContext 中设置。在 Jsr330ScopeMetadataResolver 实例中,我看到默认构造函数中填充了一个映射,其中键/值作为单例。我显然错过了一些东西。有谁知道那是什么?
解决方案
我们终于能够弄清楚这一点。解决方案是:
private static final String CONTEXT_PACKAGES_TO_SCAN =
"my.company.package.*";
public static void main(String[] args) {
SpringApplication application = new SpringApplication(
MainApplication.class);
application.addInitializers(new Jsr330Initializer());
application.run(args);
}
public static class Jsr330Initializer implements
ApplicationContextInitializer<AnnotationConfigApplicationContext>
{
@Override
public void initialize(AnnotationConfigApplicationContext context) {
context.setScopeMetadataResolver(new Jsr330ScopeMetadataResolver());
context.scan(CONTEXT_PACKAGES_TO_SCAN);
}
}
关键是在初始化程序中执行 context.scan()。要扫描的包必须以“.*”结尾,否则主应用程序被添加两次并且 Spring 无法启动。
推荐阅读
- bash - ZSH:找不到命令 - 将 macOS 更新到 10.15.1 后
- php - 如何在 Laravel 命令而不是控制器中发送电子邮件
- swift - 如何在 Swift 5 中的 AWS-SES 上创建 RAW-Email-Message
- c# - net framework 4.6.1 无参数构造函数中依赖注入的配置问题
- ios - 谷歌驱动器显示自定义 UTI 文件在 UIDocumentBrowserViewController 控制器中变暗
- java - 如何将 Places API 自动完成小部件传递给自定义对话框?
- android - 无法将库添加到 Android
- mysql - Mysql Cluster binlog 复制顺序
- mqtt - Apache MQ Artemis - 连接到集群中其他节点的客户端无法使用 MQTT 保留消息
- mongodb - 通过cmd命令在mongo集合中插入数据