2011-07-13 47 views
14

我有一个场景configuring Spring Security on embedded Jetty,如果我使用JavaConfig配置Jetty服务器,这似乎有点解决。Spring @Configuration和<context:component-scan />

因此,它看起来像JavaConfig而不是XML可能是项目大块的更好选择。但是,在XML命名空间中有一些细节,例如<context:component-scan />,这些设置在@Configuration设置中不易获得。

我发现ApplicationContextAware很荣幸为@Configuration班,所以下面是可能

@Configuration 
public class FooConfig implements ApplicationContextAware { 
    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) { 
     ((AnnotationConfigApplicationContext) applicationContext).scan("org.example"); 
    } 
} 

另一种选择,这是documented,是有@Configuration类使用@ImportResource注释和拉在现有的XML文件:

@Configuration 
@ImportResource("applicationContext-withComponentScan.xml") 
public class BarConfig {} 

我想这个问题是“它是坏的形式,以这种方式滥用ApplicationContextAware,或者是不是真的不能滥用”?对于这种方法,有些东西感觉很肮脏,所以如果春天的人们以某种​​方式覆盖了我没有发现的东西,我不会感到惊讶。

对于感兴趣的问题,该问题与使用@Resource@Provider类来扫描Jersey设置有关,我不想手动管理类/ XML配置中的条目。

回答

5

它是不好的形式滥用了ApplicationContextAware这样,还是真的不滥用

是的,这是不好的形式。如果您要手动从上下文中提取出东西,那么您最好不要在第一时间打扰依赖注入。

但是,您的第二个选项(@ImportResource("applicationContext-withComponentScan.xml"))是一个很好的选择 - 当您想要将这些XML宏与注释样式配置结合使用时,这是当前的最佳做法。

第三个选项是使用Spring 3.1的当前里程碑版本,其中adds a way of doing these things all in Java,使用@Feature。不过,这还没有生产准备。

+0

是,3.1提供了一些很好的光泽。但我并不是试图“从情境中获取东西”,而是将注意力放在情境中,所以不确定你是否理解正确。 scan(“package”)与(give或take)context:component-scan相同,而这样做的类特别是一个配置类。我仍然不安,但你的论点并不成立。奇怪的是,我通常对你的答案印象非常深刻,所以我期待着我已经错过了你的观点,而不是错过了我的观点:) – ptomli

+0

@ptomli:是的,“从情境中获取东西”是不正确的。我指的是获取注入上下文的更一般的做法,(转换它),然后调用其中的方法。它将你的配置类与Spring SPI类联系起来,这不是很优雅。我仍然推荐选项2. – skaffman

+0

是的,即使“加载一些XML来管理JavaConfig”似乎是错误的,但我认为这是因为3.0没有完全覆盖基础。我有一个与财产配置相同的问题,但奇怪的是不觉得这么奇怪。欢呼声,一如既往的恒星指导! – ptomli

4

请检查此链接。这是一个比较具体的(Web应用程序),但它有一个非常漂亮的代码示例的扫描,具体为:

从该链接:

@ComponentScan(basePackages = { "org.example"}) 
36

现在Spring 3.1准备进出,如果您使用Spring 3.1,则可以安全地使用@ComponentScan。 Spring MVC不仅仅是过时的回答之一。您可以按如下方式使用它:

@Configuration 
@ComponentScan({"com.foo.bar", "org.foo.bar"}) 
public class AppConfig{ /** config code */ } 

这里是文档http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/ComponentScan.html

+1

这应该是被接受的答案。 – Asturio

相关问题