java框架學習日誌-11(註解實現AOP)

第三種實現方式——經過註解來實現。

業務類與以前相同,做用不改變
Log類java

public class Log {
    public void before(){
        System.out.println("——————方法執行前");
    }
    public void after(){
        System.out.println("——————方法執行後");
    }

}

Service類spring

public interface Service {
    public void add();
    public void update();
    public void delete();
    public void search();

}

ServiceImpl類ide

public class ServiceImpl implements Service{
    @Override
    public void add() {
        System.out.println("增長用戶");
    }

    @Override
    public void update() {
        System.out.println("修改用戶");
    }

    @Override
    public void delete() {
        System.out.println("刪除用戶");
    }

    @Override
    public void search() {
        System.out.println("查詢用戶");
    }
}

配置文件修改一下,增長aop:aspectj-autoproxy/。它會自動去找aop。測試

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <bean id="service" class="ServiceImpl"/>
    <bean id="log" class="Log"/>
    <aop:aspectj-autoproxy/>

</beans>

Log類前面加上註解,@Aspect,表示Log類是一個切面,方法前面加上@before或者其餘,表示爲前置通知或者其餘通知。括號填寫表達式execution(* Service.*(..)表示切入點,第一個*表示全部返回值,Service表示全限定名,第二個*表示全部方法。(..)表示全部參數。.net

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class Log {

    @Before("execution(* ServiceImpl.*(..))")
    public void before(){
        System.out.println("——————方法執行前");
    }
    @After("execution(* ServiceImpl.*(..))")
    public void after(){
        System.out.println("——————方法執行後");
    }

}

執行結果
code


環繞通知
環繞通知特殊一點,須要參數ProceedingJoinPoint。而後調用ProceedingJoinPoint的proceed()來執行目標方法。視頻

public class Log {

    @Before("execution(* ServiceImpl.*(..))")
    public void before(){
        System.out.println("——————方法執行前");
    }
    @After("execution(* ServiceImpl.*(..))")
    public void after(){
        System.out.println("——————方法執行後");
    }
    @Around("execution(* ServiceImpl.*(..))")
    public void aroud(ProceedingJoinPoint jp)throws Throwable{
        System.out.println("環繞前");
        jp.proceed();
        System.out.println("環繞後");
    }

}

測試一下

目標方法也執行了。視頻中到這一步,雖然方法也執行了,可是後面也有報錯信息,顯示沒有返回object。由於proceed()會返回一個Object,可是咱們沒有處理。這裏能夠把around方法改爲返回一個Object。而後返回proceed()執行後的結果就能夠了。可是並無處理返回的Object。也沒有報錯信息。多是spring版本不一樣,有點改變吧。xml

相關文章
相關標籤/搜索