0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: java enterprise, cdi, interceptors, beans.xml, @audited, invocationcontext, метод proceed(), calledafter, calledbefore, @aroundinvoke, @interceptor, auditedinterceptor, @interceptorbinding, enterprise javabeans, cross cutting concerns</p>
1
<p>Теги: java enterprise, cdi, interceptors, beans.xml, @audited, invocationcontext, метод proceed(), calledafter, calledbefore, @aroundinvoke, @interceptor, auditedinterceptor, @interceptorbinding, enterprise javabeans, cross cutting concerns</p>
2
<p>В спецификации<strong>CDI</strong>предусмотрен механизм "перехватчиков", который позволяет реализовывать в прикладном коде приёмы аспектно-ориентированного программирования. Иначе говоря, разработчику становится доступна сквозная функциональность (<strong>cross cutting concerns</strong>), то есть прежде, чем обратиться к некоторому методу<strong>CDI</strong>-бина, у программиста появляется возможность выполнить предобработку, сам бизнес-метод и постобработку.</p>
2
<p>В спецификации<strong>CDI</strong>предусмотрен механизм "перехватчиков", который позволяет реализовывать в прикладном коде приёмы аспектно-ориентированного программирования. Иначе говоря, разработчику становится доступна сквозная функциональность (<strong>cross cutting concerns</strong>), то есть прежде, чем обратиться к некоторому методу<strong>CDI</strong>-бина, у программиста появляется возможность выполнить предобработку, сам бизнес-метод и постобработку.</p>
3
<p>Для этих целей и существует механизм<strong>CDI Interceptors</strong>, причём применяется он не только для спецификации<strong>CDI</strong>, но и активно используется в технологии<strong>Enterprise JavaBeans</strong>.</p>
3
<p>Для этих целей и существует механизм<strong>CDI Interceptors</strong>, причём применяется он не только для спецификации<strong>CDI</strong>, но и активно используется в технологии<strong>Enterprise JavaBeans</strong>.</p>
4
<p>Для связи бизнес-метода с кодом аспектно-ориентированного программирования необходимо создать кастомную аннотацию, которая дополнительно помечается аннотацией<strong>@InterceptorBinding</strong>:</p>
4
<p>Для связи бизнес-метода с кодом аспектно-ориентированного программирования необходимо создать кастомную аннотацию, которая дополнительно помечается аннотацией<strong>@InterceptorBinding</strong>:</p>
5
@InterceptorBinding @Target( { METHOD, TYPE } ) @Retention( RUNTIME ) public @interface Audited { }<p>Запуск работы<strong>Interceptors</strong>включает создание класса<strong>AuditedInterceptor</strong>, над которым следует разместить две аннотаци:<strong>@Interceptor</strong>(из коробки CDI) и только что созданную пользовательскую аннотацию<strong>@Audited</strong>.</p>
5
@InterceptorBinding @Target( { METHOD, TYPE } ) @Retention( RUNTIME ) public @interface Audited { }<p>Запуск работы<strong>Interceptors</strong>включает создание класса<strong>AuditedInterceptor</strong>, над которым следует разместить две аннотаци:<strong>@Interceptor</strong>(из коробки CDI) и только что созданную пользовательскую аннотацию<strong>@Audited</strong>.</p>
6
<p>Ключевым методом соответствующего класса перехватчика является метод, помеченный аннотацией<strong>@AroundInvoke</strong>. Для наглядности переменные<strong>calledBefore</strong>и<strong>calledAfter</strong>определяют места для пред- и постобработки, поэтому в приведённом ниже примере они выставляются в истинное значение до и после выполнения метода<strong>proceed()</strong>.</p>
6
<p>Ключевым методом соответствующего класса перехватчика является метод, помеченный аннотацией<strong>@AroundInvoke</strong>. Для наглядности переменные<strong>calledBefore</strong>и<strong>calledAfter</strong>определяют места для пред- и постобработки, поэтому в приведённом ниже примере они выставляются в истинное значение до и после выполнения метода<strong>proceed()</strong>.</p>
7
<p>Вызов этого метода у объекта<strong>InvocationContext</strong>позволяет выполнять код бизнес-метода. Без данной конструкции передача управления в метод бина не будет осуществляться, что в определённых случаях позволяет менять привычный порядок выполнения приложения (например, фильтр проверки ролей пользователя).</p>
7
<p>Вызов этого метода у объекта<strong>InvocationContext</strong>позволяет выполнять код бизнес-метода. Без данной конструкции передача управления в метод бина не будет осуществляться, что в определённых случаях позволяет менять привычный порядок выполнения приложения (например, фильтр проверки ролей пользователя).</p>
8
@Audited @Interceptor public class AuditedInterceptor { public static boolean calledBefore = false; public static boolean calledAfter = false; @AroundInvoke public Object auditMethod(InvocationContext ctx) throws Exception { calledBefore = true; Object result = ctx.proceed(); calledAfter = true; return result; } }<p>Теперь осталось пометить бизнес-метод самого<strong>CDI</strong>-бина аннотацией<strong>@Audited</strong>, которую мы уже неоднократно упоминали:</p>
8
@Audited @Interceptor public class AuditedInterceptor { public static boolean calledBefore = false; public static boolean calledAfter = false; @AroundInvoke public Object auditMethod(InvocationContext ctx) throws Exception { calledBefore = true; Object result = ctx.proceed(); calledAfter = true; return result; } }<p>Теперь осталось пометить бизнес-метод самого<strong>CDI</strong>-бина аннотацией<strong>@Audited</strong>, которую мы уже неоднократно упоминали:</p>
9
public class SuperService { @Audited public String deliverService(String uid) { return uid; } }<p>Если аннотация помечается над классом бина, то механизм перехватчиков задействуется для всех его методов.</p>
9
public class SuperService { @Audited public String deliverService(String uid) { return uid; } }<p>Если аннотация помечается над классом бина, то механизм перехватчиков задействуется для всех его методов.</p>
10
<p>Кроме того, чтобы интерцептор заработал в приложении, для спецификации<strong>CDI</strong>важно определить его в конфигурационном файле<strong>beans.xml</strong>:</p>
10
<p>Кроме того, чтобы интерцептор заработал в приложении, для спецификации<strong>CDI</strong>важно определить его в конфигурационном файле<strong>beans.xml</strong>:</p>
11
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_2.xsd"> <interceptors> <class>ru.otus.interceptor.AuditedInterceptor</class> </interceptors> </beans><h2>Осталось рассмотреть преимущества и недостатки CDI Interceptors</h2>
11
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_2.xsd"> <interceptors> <class>ru.otus.interceptor.AuditedInterceptor</class> </interceptors> </beans><h2>Осталось рассмотреть преимущества и недостатки CDI Interceptors</h2>
12
<p>Начнём с плюсов: - использование<strong>CDI Interceptors</strong>является стандартной фичей спецификации Java EE; -<strong>CDI</strong>-библиотеки могут применяться в приложениях Java SE; -<strong>CDI Interceptors</strong>могут использоваться, когда есть серьёзные ограничения на сторонние библиотеки в рамках приложений Java EE.</p>
12
<p>Начнём с плюсов: - использование<strong>CDI Interceptors</strong>является стандартной фичей спецификации Java EE; -<strong>CDI</strong>-библиотеки могут применяться в приложениях Java SE; -<strong>CDI Interceptors</strong>могут использоваться, когда есть серьёзные ограничения на сторонние библиотеки в рамках приложений Java EE.</p>
13
<p>А теперь минусы: - возникает жёсткая связка между классом бизнес-логики и классом интерцептора; - трудно определить, какие классы подвергаются интерцепции в проекте; - нет гибкого механизма применения<strong>CDI Interceptors</strong>к некоторой группе методов, т. е. нужно над каждым вешать соответствующую аннотацию.</p>
13
<p>А теперь минусы: - возникает жёсткая связка между классом бизнес-логики и классом интерцептора; - трудно определить, какие классы подвергаются интерцепции в проекте; - нет гибкого механизма применения<strong>CDI Interceptors</strong>к некоторой группе методов, т. е. нужно над каждым вешать соответствующую аннотацию.</p>
14
<p>Пожалуй, на этом всё. Узнать больше можно на курсах<a>OTUS по Java EE</a>.</p>
14
<p>Пожалуй, на этом всё. Узнать больше можно на курсах<a>OTUS по Java EE</a>.</p>
15
<p><em>Возникли сложности при использовании CDI Interceptors? Задавайте вопросы в комментариях!</em></p>
15
<p><em>Возникли сложности при использовании CDI Interceptors? Задавайте вопросы в комментариях!</em></p>
16
16