Spring中通過Annotation來實現AOP

FrankYou發表於2018-09-29

一、Spring配置檔案

<!--通過@AspectJ註解的形式來使用Spring AOP,強制使用CGLIB代理-->
<aop:aspectj-autoproxy proxy-target-class="true"/>

 上面這個配置的目的是告知Spring,我們將使用Annotation註解(比如:@Aspect、@Before、@After、@AfterReturning等)的方式來使用Spring AOP。

二、定義方面類(aspect)

package aop;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 定義一個方面(Aspect),Maven需要引用spring-aspects
 * 這個方面(Aspect)包括了多個增加處理(通知,比如:前置、後置、後置返回、異常等)
 *
 * @author xfyou
 * @date 2018/9/29
 */
@Aspect
@Component
public class Advice {

    @Before(value = "execution(* bean.*.*(..)) && args(arg0)", argNames = "arg0")
    public void beforeAdvice(String arg0) {
        System.out.println("arg0=" + arg0);
    }

    @AfterReturning(pointcut = "execution(* bean.*.*(..))", returning = "retVal")
    public void afterReturnAdvice(String retVal) {
        System.out.println("fristName=" + retVal);
    }

    @AfterThrowing(pointcut = "execution(* bean.*.*(..))", throwing = "ex")
    public void afterThrowingAdvice(Exception ex) {
        System.err.println(ex.getMessage());
    }

}

上面分別定義了三個“前置”、“後置返回”、“異常”增強處理(或者叫著:通知)方法。通過@Aspect標註的Advice類必須註冊到Spring容器中才能使用,所以我們這裡使用到了一個@Component註解讓Spring能夠自動掃描並註冊到Spring容器中。

三、測試

package bean;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author xfyou
 * @date 2018/9/6
 */
public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring.xml");
        Person person = context.getBean(Person.class);
        person.setFirstName("frank");
        person.getFirstName();
        person.test();
    }

}

輸出如下:

beforeAdvice,arg0=frank
afterReturnAdvice,retVal=frank
afterThrowingAdvice,exception:RuntimeException
Exception in thread "main" java.lang.RuntimeException: RuntimeException
    at bean.Person.test(Person.java:18)
    at bean.Person$$FastClassBySpringCGLIB$$40dc9373.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

 

相關文章