Java EE предоставляет 2 механизма инжекции: инжекцию ресурсов и инжекцию зависимостей. Механизм инжекции позволяет получать доступ к ресурсам и зависимым объектам без необходимости их явного инстанцирования. Для инжектирования нужно объявить ресурс и декорировать поле или метод специальной аннотацией.
Инжекция ресурсов
Инжекция ресурсов позволяет инжектировать любой ресурс через JNDI в любой объект, управляемый контейнером будь то сервлет, ejb, managed bean. Основанная на поле инжекция ресурсов:
public class MyServlet extends HttpServlet { @Resource(name="java:comp/DefaultDataSource") private javax.sql.DataSource dsc; ... } Инжекция ресурсов основанная на методе. При этом метод должен обладать условиями, предъявляемые к JavaBean компоненту: он должен начинаться с set, возвращать void и иметь только один входной параметр. Следует помнить, что инжекция ресурсов разрешается (то есть вычисляется) по имени, поэтому является типо-небезопасной.
public class MyServlet extends HttpServlet { private javax.sql.DataSource dsc; ... @Resource(name="java:comp/DefaultDataSource") public void setDsc(java.sql.DataSource ds) { dsc = ds; } } Инжекция зависимостей Инжекция зависимостей позволяет превращать обычные Java классы в управляемые и внедрять (инжектировать) их в другие управляемые классы. Используя инжекцию зависимостей вы можете инжектировать любой управляемый объект и контейнер автоматически его создаст. Инжекция зависимостей определяет понятие контекста (scope), которая определяет жизненный цикл инжектируемого объекта. Контекст управляемого объекта необходимого для единственного ответа клиенту (например конвертер валюты) отличается от области действия объекта необходимого для множественной обработки в рамках одной сессии (например корзина интернет магазина). Инжекция зависимостей является типо-безопасной, в отличие от инжекции ресурсов.
@javax.enterprise.context.RequestScoped public class CurrencyConverter { ... } Use the javax.inject.Injectannotation to inject managed beans; for example: public class MyServlet extends HttpServlet { @Inject CurrencyConverter cc; ... }
|