Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Java EE. Интерцептор и new

#java_ee


Как известно, в Java EE есть интерцепторы. Интерцептор - это некоторый класс, перехватывающий
вызовы методов целевого класса и "оборачивающий" их в некоторую дополнительную функциональность.
Например, аннотация @Transactional "оборачивает" вызов перехватываемых методов в транзакцию.

Но интерцепторы работают только в том случае, когда целевой объект создан контейнером.
Если объект создаётся при помощи new, интерцептор не применяется.

Что же делать в том случае, когда экземпляр класса производится фабрикой (аннотация
@Produces), вызывающей new? Как "привязать" интерцепторы к объектам, созданным фабрикой
при помощи оператора new?
    


Ответы

Ответ 1



Я вижу использование интерсепторов в более глобальном смысле, то есть например при использовании уровня DAO, Service, Controller, при этом используется Spring с аннотациями @Autowire, каждый вызов при этом будет перехвачен соответствующим interceptorom например: @Aspect ... @Around("execution(* com.mycompany.controller.*.*(..))") public Object interceptController(ProceedingJoinPoint pjp) throws Throwable { try { result = pjp.proceed(); } catch (Exception ex) { } return result } Это полезно использовать для перехвата всех Exception для общего стиля их обработки. Но может использоваться любая другая логика например найти шпиона :). В вашем же случае, если я правильно понял вы хотите обернуть выполнения метода какого то класса в interceptor при этом класс будет создан оператором new. В таком случае советую написать свой кастомный interceptor, уже даже есть паттерн программирования для этой цели. Называется Proxy. https://www.tutorialspoint.com/design_pattern/proxy_pattern.htm В двух словах расскажу как вижу реализацию. Есть общий интерфейс между объектом на котором будет вызываться метод и interceptor который будет перехватывать. В интерсепторе будет ссылка на объект и он же будет вызывать метод на реальном объекте после того или до как будет выполнена соответствующая функц. логика в interceptore. Далее Вам остается только засетить реальный объект в interceptor и использовать его как реальный объект, это получится делать так как interface у них общий.

Комментариев нет:

Отправить комментарий