#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 у них общий.
Комментариев нет:
Отправить комментарий