Spring项目中混用@Configuration和xml(context:component-scan)配置

目前Spring支持:

  1. 传统的基于xml的配置方式, 一般使用bean标签配置bean
  2. JavaConfig 和Annotation-Driven的配置方式:启动注解驱动方式需要在xml文件中声名 ,以扫描注解配置的component。
  3. @Configuration: 对类注解,指明类会被JavaConfig 作为bean的定义的来源。
    见: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

在基于maven的ssm项目中,混合使用了和 @Configuration两种配置bean的方式,在使用junit做单元测试时,必须同时导入两种配置(context)
否则会报错:
java.lang.IllegalStateException: Failed to load ApplicationContext
......
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException NoSuchBeanDefinitionException
@ContextConfiguration内的属性声名:

    @AliasFor("value")
    String[] locations() default {};

    Class[] classes() default {};

使用locations表明配置文件xml的位置,classes表明JavaConfig的配置类,但因为内部实现原因不可同时使用这两种方式。
若要正常测试,需要做一个迂回:
在test下,创建一个导入xml配置文件的类,并用@Configuration注解

@Configuration
@ImportResource({"classpath:context-1.xml", "classpath:context-2.xml"})
class TestConfig {
}

再统一使用classes包含所有context:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SomeConfiguration.class, TestConfig.class})
public class RunRuleServiceTest {
  //
  //
}

解决方案如上

你可能感兴趣的:(Spring项目中混用@Configuration和xml(context:component-scan)配置)