【问题标题】:Dynamically adding spring context configuration at runtime?在运行时动态添加spring上下文配置?
【发布时间】:2011-11-09 20:29:44
【问题描述】:

在spring/junit中你可以使用@ContextConfiguration来加载应用上下文文件,比如

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"})

我有一个要求,如果我在测试类上看到特殊注释,然后动态添加另一个 XML 上下文文件。例如:

@ContextConfiguration({"classpath:a.xml", "classpath:b.xml"})
@MySpecialAnnotation 
class MyTest{
...
}

在上面的示例中,我将查找 @MySpecialAnnotation 并添加 special-context.xml。做这个的最好方式是什么?我已经看了一段时间,似乎将我自己的ContextLoader 子类化,这是@ContextConfiguration 的参数之一是最好的方法吗?这个对吗?有一个更好的方法吗?

【问题讨论】:

  • 动态是什么意思。 Annotation 是静态的,它在运行时不会改变?
  • 显然这是我要解决的问题。我想动态地将新上下文添加到弹簧加载的文件列表中。
  • 但是那个注解是什么意思呢?什么应该触发“现在添加上下文 x”?
  • @Ralph 一切都在 spring 和 junit 环境中执行。我在问是否有一个句柄或回调可以控制它。什么应该触发回调是我的问题。
  • 您能否提供一个描述其背后原因的实际需求?我相信你正在尝试做的事情可以在不改变 applicationContext 的胆量的情况下得到解决。

标签: java spring junit


【解决方案1】:

事实证明,最好的解决方案是创建我自己的ContextLoader。我通过扩展抽象的来做到这一点。

public class MyCustomContextListener extends GenericXmlContextLoader implements ContextLoader {
    @Override
    protected String[] generateDefaultLocations(Class<?> clazz) {
        List<String> locations = newArrayList(super.generateDefaultLocations(clazz));
        locations.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz)));
        return locations.toArray(new String[locations.size()]);
    }

    @Override
    protected String[] modifyLocations(Class<?> clazz, String... locations) {
        List<String> files = newArrayList(super.modifyLocations(clazz, locations));
        files.addAll(ImmutableList.copyOf(findAdditionalContexts(clazz)));
        return files.toArray(new String[files.size()]);
    }

    private String[] findAdditionalContexts(Class<?> aClass) {
        // Look for annotations and return 'em
    }
}

【讨论】:

  • 如何添加和创建相同的测试用例(不是套件但需要一个测试用例)来交叉检查和验证?
【解决方案2】:

也许你可以利用 Spring 3.1 Profiles 来实现这一点。

如果您将在 special-context.xml 中定义的 bean 放入一个名为 special 的配置文件中,您可以在您的类上使用 @Profile("special) 激活该特殊配置文件。

这将完全消除对您的特殊注释的需要。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 2016-04-18
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多