Spring Boot试图解决不在我的xml中的bean

时间:2019-06-24 14:11:52

标签: java spring spring-boot

我想测试一个简单地关闭应用程序的类:

@Component
public class ShutdownManager {
    @Autowired
    private ApplicationContext applicationcontext;

    public int shutdown(int returnCode) {
        return SpringApplication.exit(applicationcontext, () -> returnCode);
    }
}

我创建的测试用例是这样的:

public class ShutdownManagerTest {
    @Test
    public void should_shutdown_gracefully() {
        SpringApplication app = new SpringApplication(TestClass.class);
        ConfigurableApplicationContext context = app.run();

        ShutdownManager shutdownManager = (ShutdownManager)context.getBean("shutdownManager");

        int result = shutdownManager.shutdown(10);

        assertThat(result).isEqualTo(10);
    }

    @SpringBootApplication
    @ImportResource("classpath:/core/shutdownmanagertest.xml")
    private static class TestClass {
        public TestClass() {
        }

        public static void main(String[] args) {
        }
    }
}

我的shutdownmanagertest.xml仅包含一个bean:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="shutdownManager" class="com.mycodebase.ShutdownManager" />

</beans>

但是,当我运行它时,它抱怨:

Field myOtherService in com.mycodebase.MyTask required a bean of type 'com.mycodebase.MyOtherService ' that could not be found.

类MyTask与ShutdownManager包含在同一个程序包中,该程序包包含具有@Autowire注释的myOtherService字段。但这在我的仅包含一个bean的测试xml中未定义。

有人可以帮助我理解为什么它试图解析不在上下文中的bean吗?

1 个答案:

答案 0 :(得分:2)

这样做是因为@SpringBootApplication的工作方式。

@SpringBootApplication

  

这是一个方便注释,等效于声明@ Configuration,@ EnableAutoConfiguration和 @ComponentScan

@ComponentScan

  

如果未定义特定的程序包,则将从声明此注释的类的程序包中进行扫描

因此,ShutdownManagerTest的相同包或子包中的所有内容都将被拾取。