2009-11-26 37 views
4

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

public class TestClass { 

    private MyDependency md; 

    public TestClass() { 
    } 

    ... 

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

} 

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

感谢

回答

3

编辑:下面,我描述我原来的答复的方法来完成容器的DI外部的一般方式。为了您的具体需求 - 测试 - 我同意DJ的答案。它更适合使用Spring的测试支持,例如:

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

    @Resource 
    private MyDependency md; 

    @Test 
    public void myTest() { 
      ... 

虽然上面的例子是一个TestNG的测试,也有JUnit支持在8.3.7.2. Context management and caching解释。


一般方法:注释你的类@Configurable和利用AspectJ装载时或编译时编织。有关更多详细信息,请参阅6.8.1 in the Spring documentation on AOP

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

最后,记住,如果你打算序列化或持续在未来的对象考虑使用瞬态关键字(或@Transient为JPA)。您可能不希望序列化对您的DI库,服务或组件bean的引用。

+0

Spring只能对Spring所了解的bean进行操作,但OP明确指出Spring并不知道“TestClass”,因为它是手动创建的。 – 2009-11-27 05:46:05

+1

@非限制,请阅读我提供的文档。它明确指出:“spring-aspects.jar包含一个注解驱动的方面,它利用这个功能来允许任何对象的依赖注入。支持旨在用于在任何容器的控制之外创建的对象** 。域对象通常属于这个类别,因为它们通常是使用新运算符或通过ORM工具作为数据库查询的结果以编程方式创建的。“ – rcampbell 2009-11-27 09:32:24

+1

AspectJ织使用,这样你实际上并不实例你原来的TestClass,但TestClass中的相当一字节码修改的版本,知道如何从春要求DI。 我大量使用这一技术在我自己的项目,我可以向你保证,它的工作原理。 – rcampbell 2009-11-27 09:33:35

2

见关于AutowireCapableBeanFactoryautowire()方法。如果您使用的ClasspathXmlApplicationContext,你可以得到工厂getAutowireCapableBeanFactory()

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