我对Spring不太熟悉,我有以下情况:
存储库类:
@Repository
public class MyRepository {
// ...
}
使用存储库类的类:
public class MyClass extends AbstractClass {
@Autowired
private MyRepository myRepository;
//...
}
我知道如果我注释我的MyClass
with @Component
并将其与@Autowired
,那么@Autowired
MyRepository
解决得很好。
问题是我面临的情况是我需要创建新的实例MyClass
与反思。所以MyRepository
永远不会被解决并且始终为空。
有没有办法使用@Autowired
在这个情况下?
更好地解释我的情况:
我有一些实现AbstractClass
。
在我的应用程序的设置阶段,我创建了一个HashMap
这些实现。基本上:
{"MyClass", MyClass.class}
//...
然后我有一个通用的Controller
映射到 url/{class}?options=...
使用{class}
@PathVariable
, the HashMap
上面和反射我能够根据给定的创建一个类的实例options
(这部分很重要)。你们认为有更好的方法吗?
提前致谢
Spring 本身提供了一些在对象中进行自动装配的功能
你创建的new
or newInstance()
管他呢。
要使用它,您需要一个AutowireCapableBeanFactory https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html您可以通过 Spring 的正常依赖注入获得@Autowired
.
@Autowired
private AutowireCapableBeanFactory autowireCapableBeanFactory;
然后你使用它的autowireBean(Object) https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html#autowireBean-java.lang.Object-方法
注入@Autowired
属性到你的bean中。
Object myBean = map.get(className).newInstance();
autowireCapableBeanFactory.autowireBean(myBean);
设计注意事项:
如果您确实需要上述方法,请好好考虑一下。
的 javadocAutowireCapableBeanFactory https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html建议不要在大多数用例中使用此接口:
BeanFactory 的这个子接口不适合在普通应用程序代码中使用:坚持BeanFactory
or ListableBeanFactory
对于典型的用例。
其他框架的集成代码可以利用此接口来连接和填充 Spring 不控制其生命周期的现有 bean 实例。例如,这对于 WebWork Actions 和 Tapestry Page 对象特别有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)