Аспектно-ориентированное программирование (AOP) позволяет модульизировать общие функциональные возможности, которые необходимы во многих местах (точках соединения), таких как ведение журнала, безопасность, кэширование, обработка ошибок и т.д.
Spring AOP использует динамические прокси (расширенные классы, которые заменяют оригиналы) для объединения аспектов (объединения аспектов с кодом). Аспект – это класс java, который содержит pointcut (выражения, которые выбирают одну или несколько точек соединения) и advice (код, который должен выполняться в каждой выбранной точке соединения).
Например, давайте реализуем аспект для ведения журнала. Во-первых, нам нужно включить использование аннотации @Aspect, добавив аннотацию @EnableAspectJAutoProxy в класс @Configuration (см. Spring Configuration) (с соответствующим @ComponentScan в пакеты с аспектами). Теперь мы можем создать @Aspect:
@Aspect @Component public class LoggingAspect { private Logger logger = Logger.getLogger(getClass()); @Before("execution(public * package_name.*(..))") public void log() { logger.info("Logging from aspect"); } }
Мы можем получить точку соединения (или ее подинтерфейс ProceedingJoinPoint) в качестве параметра в методах и получить некоторые свойства (см. Joinpoint interface ). И не только использовать аннотацию @Before поверх методов, но и использовать другие аннотации из пакета org.aspectj.lang.annotation как @Around, @After, @AfterReturning и @AfterThrowing, за которыми следует контекст о перехваченной точке с использованием языка выражений AspectJ pointcut (подстановочная звездочка совпадает один раз, две точки соответствуют нулю или более) для выбора, где применять рекомендации (см. AspectJ Documentation ).
Принять во внимание:
- Если совет @Before выдает исключение, цель вызываться не будет.
- Вы можете рекомендовать только непубличные методы.
- Вы можете применять аспекты только к весенним бобам.
Оригинал: “https://dev.to/eidher/spring-aop-1dpp”