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

时间:2009-11-26 18:09:05

标签: spring dependency-injection

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

public class TestClass {

   private MyDependency md;

   public TestClass() {
   }

   ...

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

}

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

由于

3 个答案:

答案 0 :(得分:3)

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

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

    @Resource
    private MyDependency md;

    @Test
    public void myTest() {
            ...

虽然上面的示例是TestNG测试,但8.3.7.2. Context management and caching中也解释了Junit支持。


常规方法:使用 @Configurable 注释您的类,并使用AspectJ加载时或编译时编织。有关详细信息,请参阅6.8.1 in the Spring documentation on AOP

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

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

答案 1 :(得分:2)

请参阅AutowireCapableBeanFactory课程上的autowire()方法。如果您使用ClasspathXmlApplicationContext,则可以使用getAutowireCapableBeanFactory()

进入工厂

要获取ApplicationContext,您需要使用静态单例或其他中央存储库,例如JNDI或Servlet容器。有关如何获取ApplicationContext的实例,请参阅DefaultLocatorFactory

答案 2 :(得分:1)

如果您需要的是用于测试目的,Spring可以很好地支持您上面描述的场景。

查看Spring Reference manual section on Testing