2017-02-16 61 views
1

这似乎应该是微不足道的,但Google和StackOverflow似乎都与Spring文档一样不合作(或者我只是不知道在哪里看到)。在Spring中手动解决依赖关系[引导]

我的Spring Boot应用程序需要手动实例化某些类。有些类有依赖关系,所以我不能使用.newInstance();相反,我想我需要问Spring从它的DI容器中给我实例。像

Class<? extends Interface> className = service.getClassName(); 
Interface x = SpringDI.getInstance(className); 

但有些事我似乎无法找到这样做的任何方式。我该怎么办?

编辑

的类名动态解析的,我已经更新了我的样本pseuido代码来反映这一点。

+0

是不存在的Spring上下文中获取Bean功能? –

+0

@DmytroGrynets是的。我刚刚给他提供了一个例子 –

回答

3

如何在要实例化这些类的组件中自动装配ApplicationContext?由于ApplicationContext实现了BeanFactory接口,因此可以调用getBean()方法。

喜欢的东西:

@Autowired 
private ApplicationContext applicationContext; 

[...] 

applicationContext.getAutowireCapableBeanFactory().getBean(clazz_name); 

我不知道你为什么会想这样做,寿,因为它违背了使用Spring的目的。 (你可以不使用Spring,但使用Java的反射API)

请参考JavaDocs的这一部分:http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/BeanFactory.html

+0

我假设我不得不使用spring,因为Spring是处理所有Component和Service的注解,因此知道哪些类可用于DI。这只能通过Java来完成? –

+0

您将需要了解Java的反射API。本质上,它允许您基于名称实例化类,在运行时分析类以找出方法的名称,并根据方法名称(这是过度简化)在对象上调用方法。 Spring使用下面的反射,并使用ApplicationContext(更正确地说,BeanFactory)为它提供抽象。就像Spring利用反射一样,你也可以做到这一点。 –

+0

在这种情况下,如果Spring已经实现并且简化为单行命令,我不会看到编写整个类查找的好处 - 这正是我所期待的。谢谢! :) –