Joh*_*erg 33 java spring autowired
该FactoryBean的可用于以编程方式创建,这可能需要复杂的实例化逻辑的对象.
但是,似乎由它创建的bean FactoryBean
不会成为弹簧管理.这种解释是否正确?如果是这样,有什么好的解决方法吗?包含一个简短的代码示例来说明我的问题.
ApplicationContext的:
<bean id="searcher" class="some.package.SearcherFactory" />
<bean id="service" class="some.package.Service" />
Run Code Online (Sandbox Code Playgroud)
工厂实施:
public class SearcherFactory implements FactoryBean<Searcher> {
@Override
public Searcher getObject() throws Exception {
return new Searcher(); // not so complex after all ;)
}
@Override
public Class<Searcher> getObjectType() {
return Searcher.class;
}
....
}
Run Code Online (Sandbox Code Playgroud)
工厂创建的类:
public class Searcher() {
private Service service;
@Autowired
public void setService(Service service) {
// never invoked
this.service=service;
}
}
Run Code Online (Sandbox Code Playgroud)
Sea*_*oyd 29
这是一个FactoryBean
为您自动装配的抽象实现:
public abstract class AbstractAutowiringFactoryBean<T> extends
AbstractFactoryBean<T> implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(
final ApplicationContext applicationContext){
this.applicationContext = applicationContext;
}
@Override
protected final T createInstance() throws Exception{
final T instance = doCreateInstance();
if(instance != null){
applicationContext
.getAutowireCapableBeanFactory()
.autowireBean(instance);
}
return instance;
}
/**
* Create the bean instance.
*
* @see #createInstance()
*/
protected abstract T doCreateInstance();
}
Run Code Online (Sandbox Code Playgroud)
扩展它,实现getObjectType()
和doCreateInstance()
方法,然后启动并运行自动装配.
注意:不应用BeanPostProcessors,这需要额外的代码.
ska*_*man 21
由创建的对象FactoryBean
是由Spring管理,而不是由Spring实例化或配置.通过使用a FactoryBean
,您自己负责.所有注射和配置必须由FactoryBean
有一种替代方案可以更好地为您工作 - 使用基于注释的配置而不是基于XML的配置.这意味着您可以在Java中使用复杂的实例化逻辑,同时仍然可以使用@Autowired
对象本身.
我现在倾向于为所有非平凡的Spring应用程序使用注释样式配置,它使许多事情变得更容易.
Ros*_*atl 18
那这个呢 ?
<bean id="serviceFactory"
class="some.package.SearcherFactory" />
<bean id="service"
factory-bean="serviceFactory"
factory-method="getObject"/>
Run Code Online (Sandbox Code Playgroud)
...然后只需注入bean'service',而不关心代码中的工厂
归档时间: |
|
查看次数: |
73316 次 |
最近记录: |