2013-10-10 6 views
0

Предположим, что у меня есть несколько различных источников данных, определенных как весенние бобы:Использование Spring Bean в Non-Spring Bean контейнер класса

<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/db1?user=root&amp;password=password" /> 
</bean> 

<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/db2?user=root&amp;password=password" /> 
</bean> 

Теперь я хотел бы использовать один из этих DataSource бобов, но из не-весна бобовый контейнер. Я мог бы вызвать appContext.getBean («dataSource1»), но я прочитал, что это плохая практика, поскольку он создает явную зависимость от весенней рамки вашего кода. Есть ли лучший способ достичь этого таким образом, который не является специфичным для реализации? Возможно, что-то вроде DatasourceFactory.getInstance («datasource1»)?

Это странный запрос? Я понимаю, что это было бы очень легко, если бы класс контейнера был фасолью Spring, поскольку я мог просто использовать стандартную инъекцию зависимостей в этом случае. Но мне это любопытно. Кажется, что использование инъекции зависимостей создает бесконечный цикл, где, если вы хотите использовать весенний боб в классе, тогда этот класс также должен быть bean-компонентом, а затем, если другой класс хочет использовать этот bean-компонент, он также должен быть bean-компонентом, И так далее, и так далее. Я не вижу изящного способа сломать цепочку инъекций зависимостей.

Опять же, возможно, нет необходимости разрывать цепочку, может быть, ответ заключается в том, что вы делаете все свои классы весенними бобами, но мне было просто любопытно.

Может ли применяться шаблон локатора обслуживания здесь? Если да, может ли кто-нибудь привести пример? Благодарю.

ответ

1

Метод, который вы описываете, - это классический способ сделать это.

public class UnmanagedBean { 
    public UnmanagedBean(DataSource dataSource) { 
     ... // do something 
    } 
} 

... 

ApplicationContext context = ...; 
DataSource dataSource2 = context.getBean("dataSource2"); 
UnmanagedBean bean = new UnmanagedBean(dataSource2); 

Вы можете добавить уровень абстракции с BeanProvider класса, который делает это для вас, но вы ограничены получать бобы непосредственно из ApplicationContext.

Смежные вопросы