spring中的Aop
阿新 • • 發佈:2020-09-10
需要匯入的依賴:
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency>
一、spring實現aop方式一:
專案結構:
前置日誌:Log類
public class log implements MethodBeforeAdvice {//method:要執行的目標物件的方法 //Ojbects:引數 //o:目標物件 @Override public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println(o.getClass().getName() + "的" + method.getName() + "被執行了"); } }
後置日誌:AfterLog類
public class afterLog implements AfterReturningAdvice { @Overridepublic void afterReturning(Object returnValue, Method method, Object[] objects, Object o1) throws Throwable { System.out.println("執行了" + method.getName() + "方法" + ",返回結果為:" + returnValue); } }
抽象角色類:UserService
public interface UserService { public void add(); public void del();public void alt(); public void sel(); }
真實角色類UserServiceImpl
public class UserServiceImpl implements UserService { @Override public void add() { System.out.println("增加一個使用者"); } @Override public void del() { System.out.println("刪除一個使用者"); } @Override public void alt() { System.out.println("修改一個使用者"); } @Override public void sel() { System.out.println("查詢一個使用者"); } }
ApplicationContext.xml檔案:
<?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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="userService" class="aopDemo.UserServiceImpl"/> <bean id="log" class="aopDemo.log.log"/> <bean id="afterLog" class="aopDemo.log.afterLog"/> <!--這是測試註釋--> <aop:config> <!--切入點--> <aop:pointcut id="pointcut" expression="execution(* aopDemo.UserServiceImpl.*(..))"/> <!--前置與後置日誌--> <aop:advisor advice-ref="log" pointcut-ref="pointcut"/> <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/> </aop:config> </beans>
注:貼上程式碼時去掉註釋以防報錯。
輸出:
二、spring 實現aop方式二:
專案結構:
抽象角色:
public interface UserService { public void add(); public void del(); public void alt(); public void sel(); }
真實角色:
public class UserServiceImpl implements UserService { @Override public void add() { System.out.println("增加一個使用者"); } @Override public void del() { System.out.println("刪除一個使用者"); } @Override public void alt() { System.out.println("修改一個使用者"); } @Override public void sel() { System.out.println("查詢一個使用者"); }
自定義切入類:
public class DiyPointCut { //自定義切入點 public void before(){ System.out.println("方法執行前"); } public void after(){ System.out.println("方法執行後"); } }
測試程式碼:
public class Client { @Test public void test(){ ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("ApplicationContext.xml"); UserService userService = classPathXmlApplicationContext.getBean("userService", UserService.class); userService.add(); } }
輸出:
三、spring實現aop的方式三:
專案結構:
抽象角色:
public interface UserService { public void add(); public void del(); public void alt(); public void sel(); }
真實角色:
public class UserServiceImpl implements UserService { @Override public void add() { System.out.println("增加一個使用者"); } @Override public void del() { System.out.println("刪除一個使用者"); } @Override public void alt() { System.out.println("修改一個使用者"); } @Override public void sel() { System.out.println("查詢一個使用者"); } }
被註解的切面類:
@Aspect public class AnotationPointCut { @Before("execution(* aopDemo3.UserServiceImpl.*(..))") public void before(){ System.out.println("方法執行前"); } @After("execution(* aopDemo3.UserServiceImpl.*(..))") public void after(){ System.out.println("方法執行後"); } @Around("execution(* aopDemo3.UserServiceImpl.*(..))") public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("環繞前"); Signature signature = proceedingJoinPoint.getSignature();//獲取簽名 System.out.println("signature" + signature); Object proceed = proceedingJoinPoint.proceed();//執行方法 System.out.println("環繞後"); System.out.println("proceed:"+proceed); } }
ApplicationContext.xml:
<?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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="userService" class="aopDemo3.UserServiceImpl"/> <bean id="anotationPointCut" class="aopDemo3.AnotationPointCut"/> <aop:aspectj-autoproxy/> </beans>
輸出: