java - 如何以编程方式配置 Spring 的 @Configuration 注释?

标签 java spring spring-annotations spring-java-config

具体来说,我希望能够通过实例化和包含它们来共享配置类。你通常会在哪里这样做:

@Configuration
@Import({SharedConfiguration.class})
public class MyAppContext extends WebMvcConfigurerAdapter {
  //stuff
}

@Configuration
@ComponentScan("com.example")
public class SharedConfiguration {
  //stuff
}

我想这样做:

@Configuration
public class MyAppContext extends WebMvcConfigurerAdapter {
  public SharedConfiguration sharedConfig(){
    return new SharedConfiguration("com.example");
  }

  //stuff
}

@Configuration
public class SharedConfiguration {
  public SharedConfiguration(String package){
    //tell Spring to scan package
  }
}

这样做的原因是我需要能够告诉进行扫描的共享组件要查看什么包。它会根据使用的项目而有所不同。

编辑:

为了提供一些额外的上下文,我正在尝试使用我们的多个项目可以使用的外部配置提供程序来创建一个通用配置来设置 Hibernate 和 EHCache。我当然对其他方法持开放态度,但这对我来说似乎是最合乎逻辑的途径。我确定在 Spring 中有一些东西可以让我摆弄说,“这里!当 Spring 初始化你时扫描这条路径!”而不是将其硬编码到注释中。

最佳答案

在这种情况下,您可以利用属性(property)来源。
在测试用例中,我正在设置一个由 Spring 属性源配置获取的系统属性 -

@RunWith(SpringRunner.class)
@ContextConfiguration
public class MyAppContextTest {

    @Autowired
    ApplicationContext context;

    @BeforeClass
    public static void beforeClass() {
        // use a system property to configure the component scan location of the SharedConfiguration
        // where the "ExampleBean" lives
        System.setProperty("packages", "net.savantly.other.packages");
    }

    @Test
    public void ensureExampleBeanExists() {
        // throws exception if it doesnt exist
        context.getBean(ExampleBean.class);
    }


    @Configuration
    @Import(MyAppContext.class)
    static class TestContext {

    }
}

在 ComponentScan 中使用 Spring 表达式语言 -

@Configuration
@ComponentScan("${packages}")
public class SharedConfiguration {}  

其他引用类 -

@Configuration
@Import(SharedConfiguration.class)
public class MyAppContext extends WebMvcConfigurerAdapter {

    @Autowired
    SharedConfiguration sharedConfig;

  //stuff
}

@Service
public class ExampleBean {

}

关于java - 如何以编程方式配置 Spring 的 @Configuration 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36343222/

相关文章:

java - Spring依赖注入(inject)缺少bean

java - 为什么这个java优雅的配对方法没有给出正确的结果?

java - 为什么我们在 Web 浏览器和 java swing 中无法获得相同的特定字体显示

java.lang.NoClassDefFoundError : ch/qos/logback/core/joran/spi/JoranException while connecting Cassandra DB 错误

java - 使用proguard在android上解析Gson

java - Camel 响应从 bean 返回到 ActiveMQ 队列

java - 使用 Spring 在 Java 中发送文本 REST 消息

java - Spring security oauth2 修改响应主体连接

java - 不要在 Spring MVC 3 中使用 Jackson 序列化子类型属性

spring - 如何调试Spring Security授权注解?