@EgorSvinarev

Как использовать CDI для внедрения типа, возвращаемого из метода?

Здравствуйте. Имеется несколько типов:
1) ConnectionPool- тип, отвечающий за получение объектов-соединения Connection с базой данных. Его объект инициализируется и хранится в ServletContext.
public class ConnectionPool {

	@Inject
	private DataSource dataSource;
	private Stack<Connection> pool;
	
	public ConnectionPool() {
		this.pool = new Stack<Connection>(); 
	}

	public DataSource getDataSource() {
		return dataSource;
	}

	public void setDataSource(DataSource dataSource) {
		this.dataSource = dataSource;
		
		this.closeAllConnections();	
	}
	
	private synchronized void openNewConnections() {
		if (dataSource != null) {
			for (int i = 0; i < 10; i++) {
				pool.add(dataSource.getConnection());
			}
		}
	}
	
	private synchronized void closeAllConnections() {
		for (int i = 0; i < pool.size(); i++) {
			Connection connection = pool.pop();
			try{
				connection.close();
			}
			catch (Exception ex) {
				System.out.println(ex);
			}
		}
	}
	
	public synchronized Connection takeConnection() {
		if (this.pool.size() < 2) {
			this.openNewConnections();
		}
		return this.pool.pop(); 
	}
	
	public synchronized void putConnection(Connection connection) {
		this.pool.add(connection);
	}	
}

2)DAO - тип, работающий непосредственно с базой данных. Здесь происходит внедрение зависимости - внедряется объект типа Connection.
public class EmailDAO {

	@Inject
	private Connection Connection

}


Вопрос: Как мне разрешить эту зависимость? Т.е . по сути объекты типа Connection, получаемые из метода ConnectionPool, должны внедряться в объекты тип DAO, и как мне заставить контейнер Weld решать зависимость с помощью объектов, возвращаемых из методов?
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
Возможно тут стоит внедрить в EmailDAO объект
ConnectionPool и создать в EmailDAO приватный метод getConnection, который через
ConnectionPool получить коннект и сохранит его в поле Connection. Имея в EmailDAO ссылку на ConnectionPool можно будет перед разрушение объекта EmailDAO вернуть в пул ненужный уже Connection через метод putConnection и тем сохранить ценный ресурс.
Ну или второй вариант - создать промежуточный объект, который в своём конструкторе будет получать Connection из ConnectionPool и уже это промежуточный объект инжектировать в EmailDAO.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы