Spring @Autowiring with generic factory-built beans
我有一组具有复杂初始化方案的类。基本上,我从我需要的接口开始,然后进行一堆调用,最后得到一个实现该接口的对象。
为了处理这个问题,我创建了一个工厂类,它可以在给定接口的情况下生成最终对象。我把这个工厂变成了一个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;
}
没有找到相关结果
已邀请:
3 个回复
捐焦
课程。
接口有一个
方法,包含调用以发现工厂将返回的类型。只要您的工厂返回合理的价值,这就可以让您的自动装配成为可能。
断跑胺弄萎
包装。 这是我的JMockit mock bean工厂的Java:
然后在Spring上下文XML文件中,您只需创建创建特定bean类型工厂的元工厂:
为了使这个工作适用于原始提问者的情况,可以调整它以使
成为
的包装器/适配器:
然后在XML中(注意
id和
beanid只需要使用
注释):
就是这样,只需要一个小的Java类和一个简单的样板配置,你的自定义bean工厂就可以创建所有的bean并让Spring成功解决它们。
坝胺绣敝
然后你可以使用@Resource或@Autowired + @Qualifier直接注入你的对象。