有时我们会在代码中出错,并将@Autowired
原型范围的 bean 变成单例范围的 bean。这当然是错误的,因为单例可能会像使用单例一样使用该依赖项。
有什么方法可以拦截自动装配/DI 过程以检测到这一点并引发错误?这将用于在开发时进行检测。
实现这一目标的最佳方法是通过您的单元测试。例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyAppConfig.class, loader = AnnotationConfigContextLoader.class)
public class MyServiceTest {
@Autowired(required = true)
MyService myService;
@Test
public void shouldAutowire() {}
}
@ContextConfiguration 可以与上面的 Java 配置一起使用,也可以引用 XML 配置文件。通过这样做,Spring 将用于在您运行测试时注入所有依赖项。通过在 @Autowired bean 中包含“required = true”,您可以确保 Spring 在该阶段抛出异常,并且您的测试将失败。上面的示例可能看起来并不花哨,但它可以确保捕获任何配置错误。当然,您可以更进一步,让您的测试使用注入的 bean。我发现这对于数据库访问集成测试相当方便。
这不会拦截自动装配过程本身,但您当然可以测试您的 bean 是否正确运行。
您将需要导入 spring-test 依赖项。即对于Maven:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>