【问题标题】:Spring @Configuration and <context:component-scan />Spring @Configuration 和 <context:component-scan />
【发布时间】:2011-10-04 18:07:20
【问题描述】:

我有一个场景configuring Spring Security on embedded Jetty,如果我使用 JavaConfig 来配置 Jetty 服务器,似乎可以解决这个问题。

因此,对于大型项目来说,JavaConfig 而不是 XML 可能是更好的选择。但是,XML 命名空间中有一些细节,例如 &lt;context:component-scan /&gt;,这些细节在 @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 是不好的形式,还是真的不是滥用”?这种方法让人感觉有些奇怪,所以如果 Spring 的家伙以某种我没有发现的方式涵盖了这个,我不会感到惊讶。

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

【问题讨论】:

    标签: java spring


    【解决方案1】:

    现在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

    【讨论】:

      【解决方案2】:

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

      是的,这是不好的形式。如果您要手动从上下文中获取内容,则最好不要首先使用依赖注入。

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

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

      【讨论】:

      • 是的,3.1 提供了一些不错的光泽。但我不是试图“从上下文中获取东西”,而是在上下文中注册东西,所以不确定你是否理解正确。 scan("package") 与 (give or take) context:component-scan 相同,这样做的类具体是一个配置类。我仍然不安,但你的论点并不成立。奇怪,我通常对你的回答印象深刻,所以我希望我错过了你的观点,而不是你错过了我的观点:)
      • @ptomli:是的,“从上下文中获取内容”是不对的;我指的是更普遍的做法,即注入上下文(强制转换),然后在其中调用方法。它将您的配置类与 Spring SPI 类结合起来,这不是很优雅。我仍然推荐选项 2。
      • 是的,尽管“加载一些 XML 来管理 JavaConfig”似乎是错误的,但我认为这只是因为 3.0 没有完全覆盖基础。我对属性配置器有同样的问题,但奇怪的是对此并不感到奇怪。干杯,一如既往的出色指导!
      【解决方案3】:

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

      来自该链接:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 2011-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-11-16
        • 2012-11-19
        相关资源
        最近更新 更多