我想知道是否可以使用Spring来解决在我的程序中手动创建的对象的依赖关系。看看下面的课程:
public class TestClass {
private MyDependency md;
public TestClass() {
}
...
public void methodThaUsesMyDependency() {
...
md.someMethod();
...
}
}
这个TestClass不是一个spring bean,但是需要MyDependency,这是一个spring bean。有没有什么方法可以通过Spring注入这个依赖,即使我在我的代码中使用new运算符实例化TestClass?
由于
答案 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可以很好地支持您上面描述的场景。