Читаем Изучаем Java EE 7 полностью

public class ProfileInterceptor {

··@Inject

··private Logger logger;

··@PostConstruct

··public void logMethod(InvocationContext ic) throws Exception {

····logger.fine(ic.getTarget(). toString());

····try {

······ic.proceed();

····} finally {

······logger.fine(ic.getTarget(). toString());

····}

··}

··@AroundInvoke

··public Object profile(InvocationContext ic) throws Exception {

····long initTime = System.currentTimeMillis();

····try {

······return ic.proceed();

····} finally {

······long diffTime = System.currentTimeMillis() — initTime;

······logger.fine(ic.getMethod() + " took " + diffTime + " millis");

····}

··}

}

Как видно из листинга 2.26, перехватчики жизненного цикла берут параметр InvocationContext и вместо Object возвращают void. Чтобы применить перехватчик, определенный в листинге 2.26, компонент CustomerService (листинг 2.27) должен использовать аннотацию @Interceptors и определять ProfileInterceptor. Если компонент инстанцируется контейнером, метод logMethod() будет вызван раньше метода init(). Затем, если клиент вызывает createCustomer() или findCustomerById(), будет вызван метод profile().

Листинг 2.27. CustomerService, использующий перехватчик и аннотацию обратного вызова

@Transactional

@Interceptors(ProfileInterceptor.class)

public class CustomerService {

··@Inject

··private EntityManager em;

··@PostConstruct

··public void init() {

····//…

··}

··public void createCustomer(Customer customer) {

····em.persist(customer);

··}

··public Customer findCustomerById(Long id) {

····return em.find(Customer.class, id);

··}

}

<p>Связывание и исключение перехватчиков</p>

Вы уже видели, как перехватываются вызовы в пределах одного компонента (с аннотацией @Around Invoke), а также среди множественных компонентов (с использованием аннотации @Interceptors). Спецификация Interceptors 1.2 также позволяет связать в цепочку несколько перехватчиков.

В действительности аннотация @Interceptors способна прикреплять более одного перехватчика, так как в качестве параметра она берет список перехватчиков, разделенных запятой. Когда определяются множественные перехватчики, порядок их вызова задается тем порядком, в котором они указаны в аннотации @Interceptors. Например, код в листинге 2.28 использует аннотацию @Interceptors у компонента и на уровне методов.

Листинг 2.28. CustomerService, соединяющий несколько перехватчиков

@Stateless

@Interceptors({I1.class, I2.class})

public class CustomerService {

··public void createCustomer(Customer customer) {…}

··@Interceptors({I3.class, I4.class})

··public Customer findCustomerById(Long id) {…}

··public void removeCustomer(Customer customer) {…}

··@ExcludeClassInterceptors

··public Customer updateCustomer(Customer customer) {…}

}

Когда клиент вызывает метод updateCustomer(), перехватчик не вызывается, так как метод аннотирован @ExcludeClassInterceptors. При вызове метода createCustomer() выполняется перехватчик I1, за которым следует перехватчик I2. При вызове метода findCustomerById() перехватчики I1, I2, I3 и I4 выполняются в соответствующем порядке.

<p>Связывание с перехватчиком</p>

Перехватчики определяются в своей собственной спецификации (запрос JSR 318) и могут использоваться в любых управляемых компонентах (EJB, сервлетах, веб-службах RESTful и т. д.). Но CDI расширил исходную спецификацию, добавив к ней связывание с перехватчиком. Это означает, что связывание с перехватчиком может применяться только тогда, когда активизирован CDI.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных