Spring АОП и пост-конструкция

Я хочу написать имя метода, который используется с @PostConstruct. Но я обнаружил, что АОП не может «обойти» метод PostConstruct. Есть ли способ использовать АОП с методом PostConstruct?


person Thien Dinh    schedule 06.01.2016    source источник
comment
Вы всегда хотите писать имя метода, если используется @PostConstruct? Или только для некоторых методов?   -  person Jannik Weichert    schedule 06.01.2016
comment
Да, Дактаберд. Я хочу написать название метода PostConstruct.   -  person Thien Dinh    schedule 06.01.2016


Ответы (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

Наслаждаться!

person Jannik Weichert    schedule 06.01.2016
comment
Это не работает. Это работает для других аннотаций, кроме @PostConstruct :( - person Thien Dinh; 07.01.2016
comment
Вам нужно активировать плетение во время компиляции. Я отредактирую свой ответ выше. - person Jannik Weichert; 07.01.2016

Аннотации @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);
} 
person kapil das    schedule 09.01.2016

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());
}
person Arpit Aggarwal    schedule 09.01.2016