Я хочу написать имя метода, используемого с @PostConstruct. Но я обнаружил, что АОП не может «Вокруг» метода PostConstruct. Есть ли способ использовать АОП с методом PostConstruct?Spring AOP и Post Construct
ответ
Дайте это попробовать.
@Around("@annotation(javax.annotation.PostConstruct)")
public void myAdvice(ProceedingJoinPoint jp) throws Throwable{
System.out.println("This is before " + jp.getSignature().getName() + "()");
jp.proceed();
}
Кроме того, необходимо активировать ткачество во время компиляции. Я опубликовал демо-проект на github, который использует maven. Клон https://github.com/jannikweichert/PostConstructAOPDemo и выполнить
mvn clean compile spring-boot:run
После этого вы должны увидеть в SYSOUT:
This is before test()
test() is executed
Наслаждайтесь!
Не работает. Он работает для других аннотаций, но @PostConstruct :( –
Вам нужно активировать компиляцию во времени. Я отредактирую свой ответ выше. –
Аннотации @PostConstruct и @PreDestroy являются частью библиотеки J2ee, а не частью Spring AOP. Поэтому по умолчанию Spring не будет знать аннотации @PostConstruct и @PreDestroy. Чтобы включить его, вы должны либо зарегистрировать 'CommonAnnotationBeanPostProcessor' или указать как 'в файле конфигурации боба,
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<bean id="mybean" class="mypackage.MyBean">
<property name="myPropertyName" value="my value" />
</bean>
Или, как
<bean id="myBean" class="mypackage.myBEan">
<property name="myProperty" value="test message value" />
</bean>
и аннотировать метод
@PostConstruct
public void myMethod() throws Exception {
System.out.println("PostConstruct : " + myProperty);
}
Spring AOP основан на прокси. Если не указано иное, Spring AOP performs run-time weaving
и @PostConstruct
выполняется во время загрузки приложения.
Чтобы включить @PostConstruct
, выполните @Around
совет при загрузке, вы должны установить весну load-time weaving. После установки использовать @annotation
в качестве обязательной формы для @Around
совета, следующим образом:
@Around("@annotation(javax.annotation.PostConstruct)")
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("method name: " + joinPoint.getSignature().getName());
}
Вы всегда хотите, чтобы написать имя методы, если используется @PostConstruct? Или просто для некоторых методов? –
Да, Dactabird. Я хочу написать имя метода PostConstruct. –