Как передать базовый пакет как переменную внутри выражения pointcut в Spring AOP? - PullRequest
0 голосов
/ 14 апреля 2020

Я создаю библиотеку java для ведения журналов, чтобы, если какое-либо приложение использовало мою библиотеку, советы Spring AOP применялись к каждому методу приложения. Но в моей библиотеке я не знаю базовый пакет приложений, которые будут его использовать. Таким образом, приложения должны указать свой базовый пакет в файле application.properties , и моя библиотека будет использовать его и поместить в мой pointcut в качестве переменной. Но кажется, что выражения pointcut принимают только константы внутри него.

Я не хочу go для подхода, основанного на аннотациях.

@Component
@Aspect
@Slf4j
public class LoggingAop {

    @Value("${base.package}")
    String basePackage;

    @Pointcut("within("+basePackage+"..*)") //error
    public void logAllMethods()
    {

    }
}

1 Ответ

2 голосов
/ 14 апреля 2020

Ответы на следующие вопросы объясняют, почему это невозможно в конфигурации Spring AOP на основе аннотаций

Пружинная загрузка поддерживает конфигурации на основе xml, и требование может быть достигнуто как следует.

Предполагая, что мы должны перехватить все вызовы методов в базовом пакете com.app.service

Есть запись в resources / application.properties.

base.package=com.app.service

Аспект Записать вызовы метода в базовый пакет можно следующим образом:

package com.app.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class LogAspect {

    Logger log = LoggerFactory.getLogger(LogAspect.class);

    public Object logAllMethods(ProceedingJoinPoint pjp) throws Throwable {
        log.info("Log before method call");
        try {
            return pjp.proceed();
        }finally {
            log.info("Log after method call");
        }
    }
}

Конфигурацию AOP можно определить следующим образом.

Файл: resources / aop-application-context. xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd">

<bean id="logAspect" class="com.app.aspect.LogAspect"></bean>  

<aop:config>  
  <aop:aspect id="logallaspect" ref="logAspect" >  
     <!-- @Around -->  
     <aop:pointcut id="logAllMethodsAround" expression="within(${base.package}..*)" />  
     <aop:around method="logAllMethods" pointcut-ref="logAllMethodsAround" />  
  </aop:aspect>  
</aop:config>

</beans>

Обратите внимание, что выражение pointcut создается с записью application.properties.

Помните чтобы загрузить aop-application-context. xml следующим образом

@SpringBootApplication
@ImportResource("classpath:aop-application-context.xml")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

Приведенный выше код сообщит обо всех допустимых вызовах методов Spring bean-компонентов в пределах определенного базового пакета и зарегистрирует их.

Надеюсь, это поможет.

...