2015-09-17 5 views
1
package test.aop; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.aspectj.lang.annotation.Aspect; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 
import org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration; 
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; 
import org.springframework.context.annotation.Bean; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service; 

@Component 
@Aspect 
class LoggingMonitor { 

    @AfterThrowing(
      pointcut = "execution(* test.aop..foo(..))", 
      throwing = "error") 
    public void logAfterThrowing(JoinPoint joinPoint, Throwable error) { 
     System.out.println(joinPoint); 
    } 
} 

@Service 
class MyBean { 
    void foo() { 
     throw new RuntimeException("run error"); 
    } 
} 

@SpringBootApplication 
public class App { 
    @Autowired 
    MyBean myBean; 

    @Bean 
    CommandLineRunner runner() { 
     return r -> { 
      System.out.println("Run"); 
      myBean.foo(); 
     }; 
    } 

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

Я не понимаю, почему выше код не работает, но когда я изменил свой Pointcut на «* org.springframework.boot.CommandLineRunner.run (..)», это работает.Spring AOP загрузка не работает AfterThrow

ответ

2

Spring AOP работает только с общественными методами. Сделайте свой метод общедоступным или вернитесь в AspectJ.

Благодаря прокси на основе характера рамок АОП в Spring, защищенные методы по определению не перехватили, ни для JDK прокси (где это не применимо), ни для CGLIB прокси (где это технически возможно, но не рекомендуется для целей АОП). В качестве результата любой данный pointcut будет сопоставляться только с общедоступными методами ! Если ваш перехват включает в себя защищенные/частные методы или , даже конструкторы, рассмотрите использование родственного AspectJ сплетения вместо основы AOP на основе прокси-сервера Spring. Этот представляет собой различный режим использования АОП с различными характеристиками , поэтому перед принятием решения обязательно ознакомьтесь с ткачеством .

Source

Смежные вопросы