1

我正在尝试使用 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 实例中,我看到默认构造函数中填充了一个映射,其中键/值作为单例。我显然错过了一些东西。有谁知道那是什么?

4

1 回答 1

1

我们终于能够弄清楚这一点。解决方案是:

  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 无法启动。

于 2020-12-07T18:34:12.480 回答