【发布时间】:2011-06-18 07:03:09
【问题描述】:
我有一组具有复杂初始化方案的类。基本上,我从需要获取的接口开始,然后进行大量调用,最后得到一个实现该接口的对象。
为了处理这个问题,我创建了一个工厂类,它可以在给定接口的情况下生成最终对象。我把这个工厂变成了一个 bean,在 XML 中我指定我的各种服务 bean 通过这个工厂对象实例化,并带有它们将实现的接口的参数。
这很好用,我完全得到了我需要的豆子。不幸的是,我想从我的控制器类中访问它们,这些是通过组件扫描发现的。我在这里使用@Autowired,似乎Spring不知道这些是什么类型的对象,并且由于@Autowired按类型工作,所以我是SOL。
在这里使用@Resource(name="beanName") 会很完美,但是对某些bean 使用@Resource 而对其他bean 使用@Autowired 似乎很奇怪。
有没有办法让 Spring 知道工厂将为这些 bean 中的每一个创建什么接口,而无需为每种类型设置不同的工厂方法?
顺便说一下,我使用的是 Spring 2.5.6,否则我只会 JavaConfig 整个事情并忘记它。
工厂类:
<T extends Client> T buildService(Class<T> clientClass) {
//Do lots of stuff with client class and return an object of clientClass.
}
应用上下文:
<bean id="serviceFactoryBean" class="com.captainAwesomePants.FancyFactory" />
<bean id="userService" factory-bean="serviceFactoryBean" factory-method="buildService">
<constructor-arg value="com.captain.services.UserServiceInterface" />
</bean>
<bean id="scoreService" factory-bean="serviceFactoryBean" factory-method="buildService">
<constructor-arg value="com.captain.services.ScoreServiceInterface" />
</bean>
我的控制器:
public class HomepageController {
//This doesn't work
@Autowired @Qualifier("userService") UserServiceInterface userService;
//This does
@Resource(name="scoreService") ScoreServiceInterface scoreService;
}
【问题讨论】:
标签: spring spring-mvc autowired