2016-01-06 11 views
1

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

+0

Вы всегда хотите, чтобы написать имя методы, если используется @PostConstruct? Или просто для некоторых методов? –

+0

Да, Dactabird. Я хочу написать имя метода PostConstruct. –

ответ

4

Дайте это попробовать.

@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 

Наслаждайтесь!

+0

Не работает. Он работает для других аннотаций, но @PostConstruct :( –

+0

Вам нужно активировать компиляцию во времени. Я отредактирую свой ответ выше. –

3

Аннотации @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); 
} 
1

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()); 
}