У меня есть набор классов со сложной схемой инициализации. По сути, я начинаю с интерфейса, который мне нужен, затем делаю кучу вызовов и заканчиваю объектом, реализующим этот интерфейс.
Чтобы справиться с этим, я создал фабричный класс, который при наличии интерфейса может создавать конечный объект. Я превратил эту фабрику в bean-компонент, а в XML я указал, что мои различные сервисные bean-компоненты создаются с помощью этого фабричного объекта с параметром интерфейса, который они будут реализовывать.
Это отлично работает, и я полностью получаю именно те бобы, которые мне нужны. К сожалению, я хотел бы получить к ним доступ из моих классов контроллера, которые обнаруживаются при сканировании компонентов. Я использую здесь @Autowired, и похоже, что Spring не знает, какой это тип объекта, а поскольку @Autowired работает по типу, я SOL.
Использование @Resource (name = "beanName") здесь будет работать отлично, однако кажется странным использовать @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;
}