如何使用spring来解决手动创建的对象的依赖关系?

Ale*_*dre 5 spring dependency-injection

我想知道是否可以使用Spring来解决在我的程序中手动创建的对象的依赖关系.看看下面的课程:

public class TestClass {

   private MyDependency md;

   public TestClass() {
   }

   ...

   public void methodThaUsesMyDependency() {
      ...
      md.someMethod();
      ...
   }

}
Run Code Online (Sandbox Code Playgroud)

这个TestClass不是一个spring bean,但是需要MyDependency,这是一个spring bean.有没有什么方法可以通过Spring注入这个依赖,即使我在我的代码中使用new运算符实例化TestClass?

谢谢

Rob*_*ell 3

编辑:我在下面的原始答案中描述的方法是在容器外部完成 DI 的一般方法。对于您的特定需求 - 测试 - 我同意 DJ 的回答。使用Spring的测试支持更合适,例如:

@Test
@ContextConfiguration(locations = { "classpath*:**/applicationContext.xml" })
public class MyTest extends AbstractTestNGSpringContextTests {

    @Resource
    private MyDependency md;

    @Test
    public void myTest() {
            ...
Run Code Online (Sandbox Code Playgroud)

虽然上面的示例是 TestNG 测试,但也有8.3.7.2 中解释的 Junit 支持。上下文管理和缓存


一般方法:使用@Configurable注释您的类并利用 AspectJ 加载时或编译时编织。有关更多详细信息,请参阅Spring 文档中有关 AOP 的 6.8.1 节。

然后,您可以使用@Resource@Autowired注释实例变量。尽管它们实现了相同的依赖注入目标,但我建议使用@Resource,因为它是 Java 标准而不是 Spring 特定的。

最后,如果您计划将来序列化或持久化对象,请记住考虑使用瞬态关键字(或JPA 的@Transient )。您可能不想序列化对 DI 存储库、服务或组件 bean 的引用。