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

时间:2011-07-13 18:31:21

标签: java spring

我有一个场景configuring Spring Security on embedded Jetty,如果我使用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");
    }
}

备选方案是documented,是让@Configuration类使用@ImportResource注释并引入现有的XML文件:

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

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

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

3 个答案:

答案 0 :(得分: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 :(得分:5)

  

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

是的,这是不好的形式。如果您要手动从上下文中取出内容,那么您可能不会首先考虑依赖注入。

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

第三个选项是使用@Feature使用{{1}}的Spring 3.1的当前里程碑版本。但是,这还没有生产就绪。

答案 2 :(得分:4)

也请检查此链接。它更具体(对于Web应用程序),但它有一个非常好的扫描代码示例,特别是:http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html

来自该链接:

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