1. 程式人生 > >springboot AOP 實現日誌管理

springboot AOP 實現日誌管理

本文使用註解進行spring AOP的實現。

1.AOP的基本概念

(1)Aspect(切面):通常是一個類,裡面可以定義切入點和通知

(2)JointPoint(連線點):程式執行過程中明確的點,一般是方法的呼叫

(3)Advice(通知):AOP在特定的切入點上執行的增強處理,有before,after,afterReturning,afterThrowing,around

(4)Pointcut(切入點):就是帶有通知的連線點,在程式中主要體現為書寫切入點表示式

2.用到的註解

[email protected] 註解位置為類,宣告切面。

[email protected]

宣告切點,支援倆種類型,一種是execution表示式,一種是註解形式的。

execution表示式:
execution(* com.test.aspect.service.*.*(..))  第一個* 代表的是所有返回值型別,第二個*代表的是包下所有的類,第三個*代表的是類下所有的方法,()裡的..代表的是所有引數型別

註解:
@annotation(com.test.aspect.LogOperate)

[email protected] 環繞增強

[email protected] 前置增強

[email protected] 後置增強

[email protected]

異常增強

3.具體實現

1.日誌一般使用的是註解型別的切點表示式,我們先建立一個日誌註解,當spring容器掃描到有此註解的方法就會進行增強。

@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogOperate {

}

2.切點宣告:

@Component  //宣告為元件,可有容器管理
@Aspect      
public class LogAdvice {

    @Pointcut("@annotation(com.test.aspect.LogOperate)")   //切點
    public void log(){

    }

    @Around(value = "log()")       //環繞增強,切點為log這個切點
    public void around(ProceedingJoinPoint point) throws Throwable {     //這裡使用引數為ProceedingJoinPoint 型別,只有環繞增強可以使用,並且在方法中必須執行proceed方法,否則被增強的方法不會執行
        System.out.println("around exec");
        point.proceed();
    }

    @Before(value = "log()")            //除了環繞增強,其他使用的是joinPoint 型別
    public void before(JoinPoint point) throws Throwable {
        System.out.println("before exec");
    }

    @After(value = "log()")
    public void after(JoinPoint point) throws Throwable {
        System.out.println("after exec");
    }

    @AfterThrowing("log()")
    public void afterThrowing(JoinPoint point){
        System.out.println("after throw");
    }

3.宣告一個使用註解的類

public class Service {

    @LogOperate
    public void operate(){
            System.out.println("operate exec");
    }
}

4.Java配置類

@Configuration
@ComponentScan(basePackages = "com.test.aspect")
@EnableAspectJAutoProxy   //開啟對AOP的支援,在springboot裡無需此註解
public class Config {

    @Bean
    public Service service(){
        return new Service();
    }
}

5.Java測試類:

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        Service bean = context.getBean(Service.class);
        bean.operate();
    }
}

/*結果:
around exec
before exec
operate exec
after exec  */