Я хочу написать имя метода, который используется с @PostConstruct. Но я обнаружил, что АОП не может «обойти» метод PostConstruct. Есть ли способ использовать АОП с методом PostConstruct?
Spring АОП и пост-конструкция
Ответы (3)
Попробуйте это.
@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 и @PreDestroy являются частью библиотеки J2ee, а не частью Spring AOP. Итак, по умолчанию Spring не будет знать об аннотациях @PostConstruct и @PreDestroy. Чтобы включить его, вы должны либо зарегистрировать «CommonAnnotationBeanPostProcessor», либо указать «as» в файле конфигурации bean-компонента,
<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>
Or as
<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
во время загрузки, необходимо настроить Spring переплетение во время загрузки. После настройки используйте @annotation
в качестве формы привязки для @Around
совета следующим образом:
@Around("@annotation(javax.annotation.PostConstruct)")
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("method name: " + joinPoint.getSignature().getName());
}