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