業務類與以前相同,做用不改變
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