Поскольку вы используете внедрение зависимостей, вы должны попытаться использовать проводку, поставляемую «из коробки» из рассматриваемой структуры DI, а не писать собственные фабрики.
Текущую проблему можно решить с помощью SpringPropertyPlaceHolder и простого соглашения об именах DAO в файле конфигурации Spring.
Шаги:
1. Сначала используйте соглашение об именах, чтобы назвать идентификаторы ваших отдельных DAO и сконфигурировать их в весеннем файле.
Пример:
<bean id='hibernateUserDao' class='UserHibernateDao'/>
<bean id='ibatisUserDao' class='UserIbatisDao'/>
Здесь мы говорим, что все Даос Hibernate начинаются с hibernate, а все Даос ibatis начинаются с ibatis и т. Д.
2.Следующая настройка потребителя Daos. Убедитесь, что проводка динамическая в зависимости от свойств.
<bean id='daoconsumer' class='some.consumer.class'>
<property name='dao' ref='${daoImpl}UserDao'/>
</bean>
3. После этого настройте заполнитель Spring Property в файле Spring.
<bean id="propertyConfigurator" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:/path/to/app.properties</value>
</property>
</bean>
4. Наконец, вы пишете app.properties одной строкой.
daoImpl=hibernate # choose hibernate implementations.
Теперь daoImpl будет заменен на "hibernate". Другое преимущество этого метода заключается в том, что SpringPropertyPlaceHolder может также получать свойства из среды, которые он может использовать в предпочтении к app.properties (зависит от параметра конфигурации, смотрите подробности в javadocs)
Следовательно, вы можете настроить поведение своего приложения, используя свойства среды, которые могут быть довольно мощными.
Альтернатива 2:
Вы также можете использовать профили Maven для достижения аналогичного поведения. Maven имеет возможность «фильтровать» ваши ресурсы - в этом случае он заменит заполнители на некоторые строки в зависимости от профиля maven, под которым он выполняется. Вы можете использовать эту функцию для генерации пакетов приложений (jar, уши и т. Д.), Которые работают с данной реализацией (например, hibernate, ibatis и т. Д.). Очевидно, что это менее гибкий подход, чем PropertyPlaceHolder, но может быть предпочтительным при определенных условиях.