【问题标题】:Spring component scanning : can we use @componentscan and <context:component-scan base-package="com.web.*" /> in same project?Spring 组件扫描:我们可以在同一个项目中使用 @componentscan 和 <context:component-scan base-package="com.web.*" /> 吗?
【发布时间】:2017-11-07 13:23:04
【问题描述】:

我已经在调度器 servlet 中配置了组件扫描 代码:

<context:component-scan base-package="com.web.rest"
        annotation-config="true" scoped-proxy="targetClass" />
<annotation-driven />

此代码正在扫描“com.web.rest”包, 现在我必须使用@ComponentScan 注解再扫描一个包,

示例:

@Configuration
@ComponentScan(basePackages = {"com.web.utils"})
@Component
public class FileUtil {
}

但是@ComponentScan(basePackages = {"com.web.utils"}) 对我不起作用,它没有扫描“com.web.utils”包

我们可以在同一个项目中使用注解驱动和xml配置组件扫描吗??

【问题讨论】:

    标签: spring-mvc


    【解决方案1】:

    您可以将注释驱动的配置文件和基于 xml 的配置文件结合在一起。如果您使用的是 Java @Configuration 文件,则只需添加 @ImportResource 注释即可同时加载 XML 配置文件。以下注解在名为 spring-servlet.xml 的 Spring XML 配置文件中加载到基于注解的 Spring ApplicationContext 对象中:

    @Configuration
    @ImportResource("classpath:spring-servlet.xml")
    class JConfig { }
    

    确保 spring-servlet.xml 在您的应用程序类路径中。更多详情请参考http://www.theserverside.com/tip/Combining-Annotation-and-XML-Configurations-in-your-Spring-3-Applications

    然后在你的web.xml中修改dispatcher servlet配置如下:

    <servlet>
          <servlet-name>spring</servlet-name>
          <servlet-class>
             org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
             <param-name>contextClass</param-name>
             <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
             </param-value>
          </init-param>
          <init-param>
             <param-name>contextConfigLocation</param-name>
             <param-value>org.rest.spring.rest</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
       </servlet>
       <servlet-mapping>
          <servlet-name>spring</servlet-name>
          <url-pattern>/</url-pattern>
       </servlet-mapping>
    

    您只需在此处更改或添加两个init-param 标签,其余的将与以前相同。将 contextConfigLocation 的参数值作为基于注释的配置 java 文件所在的包。并从基于注释的配置文件中导入基于 xml 的配置文件,如上所示。请参阅http://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration。如果有任何问题,请告诉我。

    【讨论】:

      【解决方案2】:

      您可以在同一个项目中使用 Annotation 驱动和 XML 配置组件扫描。但是,如果您同时使用这两种配置,那么 XML 配置会覆盖 Annotation 驱动的配置,就像这里用于组件扫描一样。所以我们应该避免混合,如果不可避免,我们应该减少混合。否则结果有时是不可预测的。以下是 Java 文档的摘录(参见第 3 点)。

      以下注解和部署描述符组合是 支持:

      1. Java EE 应用程序或模块可以与完整的 Java EE 6 一起打包 兼容的标准和运行时部署描述符。如果标准 部署描述符已指定 metadata-complete 属性, 模块中的注释被忽略。

      2. Java EE 应用程序或模块可以使用元数据进行完全注释 由列出的规格定义。注释消除了需要 用于 Java EE 标准部署描述符。在大多数情况下, 也不需要 GlassFish Server 部署描述符。

      3. Java EE 应用程序或模块可以部分注释 标准部署描述符中的部署信息。的情况下 冲突,部署描述符值取代注释 元数据,并记录一条警告消息。

      所以为了解决你的问题,你可以在你的 XML 配置文件中添加另一个组件扫描,如下所示:

      <context:component-scan base-package="com.web.utils"
              annotation-config="true" scoped-proxy="targetClass" />
      

      并从您的 FileUtil 类中删除以下内容。

      @ComponentScan(basePackages = {"com.web.utils"})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-04
        • 2014-01-28
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 2020-06-04
        相关资源
        最近更新 更多