springboot AOP 實現日誌管理
阿新 • • 發佈:2018-12-12
本文使用註解進行spring AOP的實現。
1.AOP的基本概念
(1)Aspect(切面):通常是一個類,裡面可以定義切入點和通知
(2)JointPoint(連線點):程式執行過程中明確的點,一般是方法的呼叫
(3)Advice(通知):AOP在特定的切入點上執行的增強處理,有before,after,afterReturning,afterThrowing,around
(4)Pointcut(切入點):就是帶有通知的連線點,在程式中主要體現為書寫切入點表示式
2.用到的註解
[email protected] 註解位置為類,宣告切面。
execution表示式:
execution(* com.test.aspect.service.*.*(..)) 第一個* 代表的是所有返回值型別,第二個*代表的是包下所有的類,第三個*代表的是類下所有的方法,()裡的..代表的是所有引數型別
註解:
@annotation(com.test.aspect.LogOperate)
[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 */