Spring @Configuration和<context:component-scan />

pto*_*mli 14 java spring

我有一个在嵌入式Jetty上配置Spring Security的场景,如果我使用JavaConfig来配置Jetty服务器,这似乎有点解决了.

因此,它看起来像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");
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择,这是记录在案,就是有@Configuration类使用@ImportResource注释和在现有的XML文件中提取:

@Configuration
@ImportResource("applicationContext-withComponentScan.xml")
public class BarConfig {}
Run Code Online (Sandbox Code Playgroud)

我想问题是" ApplicationContextAware以这种方式滥用是不是形式,还是真的不滥用"?对于这种方法来说,有点奇怪的是,如果春天的家伙以某种方式覆盖了这个我没有发现的东西,我也不会感到惊讶.

对于感兴趣的,这个问题涉及到扫描泽西设置有@Resource@Provider我宁愿没有在类/ XML配置手动管理项类.

小智 36

现在Spring 3.1已准备就绪,如果您使用的是Spring 3.1,那么可以安全地使用@ComponentScan.它不仅仅是Spring MVC作为过时的答案之一.您可以按如下方式使用它:

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

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


ska*_*man 5

以这种方式滥用ApplicationContextAware是不好的形式,还是真的没有滥用

是的,这是不好的形式.如果你要手动从上下文中取出东西,你可能也不会首先考虑依赖注入.

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

第三种选择是使用Spring 3.1的当前里程碑版本,它使用Java添加了一种在Java中完成这些工作的方法@Feature.但是,这还没有生产就绪.