Spring组件扫描:我们可以在同一个项目中使用@componentscan和<context:component-scan base-package =“com.web。*”>吗?

时间:2017-11-07 13:23:04

标签: spring-mvc

我在调度程序servlet中配置了组件扫描 的

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

此代码正在扫描&#34; com.web.rest&#34;包, 现在我必须使用@ComponentScan注释再扫描一个包

示例:

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

但@ComponentScan(basePackages = {&#34; com.web.utils&#34;})对我不起作用,它不是扫描&#34; com.web.utils&#34;封装

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

2 个答案:

答案 0 :(得分:0)

您可以将注释驱动的配置文件和基于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中的调度程序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的param值作为基于注释的配置java文件所在的包。从基于注释的配置文件导入基于xml的配置文件,如上所示。请参阅http://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration。如果有任何问题,请告诉我。

答案 1 :(得分:0)

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

  

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

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

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

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

  6.   

因此,要在此处解决您的问题,您可以在XML配置文件中添加另一个组件扫描,如下所示:

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

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

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