В древнем мире J2EE традиционным способом управления этим было использование ServiceLocator
. Ниже пример реализации (без оптимизации, DataSource
может быть кэширован):
public class ServiceLocator {
private Context initalContext;
private static ServiceLocator ourInstance = new ServiceLocator();
public static ServiceLocator getInstance() {
return ourInstance;
}
private ServiceLocator() {
try {
this.initalContext = new InitialContext();
} catch (NamingException ex) {
throw new ServiceLocatorException(...);
}
}
public DataSource getDataSource(String dataSourceName) {
DataSource datasource = null;
try {
Context ctx = (Context) initalContext.lookup("java:comp/env");
datasource = (DataSource) ctx.lookup(dataSourceName);
} catch (NamingException ex) {
throw new ServiceLocatorException(...);
}
return datasource;
}
}
Чтобы использовать это, просто назовите это так:
DataSource ds = ServiceLocator.getInstance().getDataSource("jdbc/mydatabase");
Но это было до эры EJB3 и Dependency Injection. Теперь при использовании EJB3, если вы настроили DataSource
в своем контейнере EJB, все, что вам нужно сделать, чтобы автоматически внедрить DataSource
в ваш компонент без сохранения состояния, это написать (где mydatabase
название источника данных):
@Resource
private DataSource mydatabase;
Используйте атрибут name, если хотите явно, ну, установите имя:
@Resource(name="jdbc/mydatabase")
private DataSource dataSource;
EJB3 фактически делает шаблон ServiceLocator
устаревшим, и вы действительно должны предпочитать инъекцию при работе с ними.