# 43.3.19 用户配置与切片

如果你合理地[组织你的代码](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#using-boot-structuring-your-code)，Spring Boot默认会把`@SpringBootApplication`类[当做测试的配置使用](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-detecting-config)。

所以，不要把针对特定功能区域的配置放置在应用的主类上。

假设你正在使用Spring Batch，并依赖自动配置。你会如下定义你的`@SpringBootApplication`：

```java
@SpringBootApplication
@EnableBatchProcessing
public class SampleApplication { ... }
```

因为这个类是测试的源配置，任何切片测试实际上都会尝试启动Spring Batch。这肯定不是你想做的。一种推荐的方法是把那个针对特定区域的配置移到一个独立的在应用的同一级上的`@Configuration`类。如下所示：

```java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration { ... }
```

**注** 根据应用的复杂度，你可能有一个定义所有配置的`@Configuration`类，或者每个域区域一个类。后面的方法让你在其中的一个测试里启用它。如果需要，加上`@Import`注解。

另一个困惑的根源是类路径扫描。假设你合理地组织了代码，你需要扫描一个额外的包。你的应用代码可能是这样的：

```java
@SpringBootApplication
@ComponentScan({ "com.example.app", "org.acme.another" })
public class SampleApplication { ... }
```

这样做实际上覆盖了默认的组件扫描指令，产生了不顾所选的切片而扫描那两个包的副作用。比如，`@DataJpaTest`突然扫描了应用的组件和用户配置。同样的，把自定义的指令移到独立的类上是修复此方法的好办法。

**注** 如果这不是你的一个选项，你可以在测试的某个层级里创建`@SpringBootConfiguration`。另外，你可以为你的测试指定一个源。这会禁用寻找默认源的行为。
