AOP的第五種實(shí)現(xiàn)方式-xml通知(#千鋒#)

1.IUserServcie.java

package com.zy.aop05;

import java.util.List;

public interface IUserService {

? ? /**

? ? * 獲取所有的用戶對(duì)象列表

? ? * @return

? ? */

? ? List<Object> getAllUser();

? ? /**

? ? * 保存用戶

? ? * @param user

? ? * @return

? ? */

? ? boolean saveUser(Object user);

? ? /**

? ? * 根據(jù)用戶uid刪除該uid對(duì)應(yīng)的用戶信息

? ? * @param uid

? ? * @return

? ? */

? ? boolean deleteUser(int uid);

? ? /**

? ? * 更新指定用戶信息

? ? * @param obj

? ? * @return

? ? */

? ? boolean updateUser(Object obj);

? ? void getUserByUid();

}

2.UserServiceImpl.java

package com.zy.aop05;

import java.util.ArrayList;

import java.util.List;

public class UserServiceImpl implements IUserService {

? ? @Override

? ? public List<Object> getAllUser() {

? ? ? ? System.out.println("--------getAllUser----------");

? ? ? ? return new ArrayList<>();

? ? }

? ? @Override

? ? public boolean saveUser(Object user) {

? ? ? ? System.out.println("--------saveUser----------");

? ? ? ? return true;

? ? }

? ? @Override

? ? public boolean deleteUser(int uid) {

? ? ? ? System.out.println("--------deleteUser----------");

? ? ? ? return false;

? ? }

? ? @Override

? ? public boolean updateUser(Object obj) {

? ? ? ? System.out.println("--------updateUser----------");

? ? ? ? return true;

? ? }

? ? @Override

? ? public void getUserByUid() {

? ? ? ? System.out.println("--------getUserByUid----------");

? ? ? ? System.out.println(1 / 0);

? ? ? ? String str = null;

? ? ? ? System.out.println(str.length());

? ? }

}

3.MyAspect.java

package com.zy.aop05;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

/**

* 五種通知方式來實(shí)現(xiàn)aop

*? 1. 前置通知,在業(yè)務(wù)方法之前執(zhí)行

*? 2. 后置通知,在業(yè)務(wù)方法之后執(zhí)行

*? 3. 環(huán)繞通知,同時(shí)在業(yè)務(wù)方法的前后執(zhí)行

*? 4. 帶有返回值通知,可以拿到業(yè)務(wù)方法的返回值

*? 5. 異常通知,可以捕獲業(yè)務(wù)方法中的異常對(duì)象

*

*? ? ? 注意:如果同時(shí)配置來所有的通知方式,則執(zhí)行順序依次為:

*? ? ? ? ? before>around before>業(yè)務(wù)方法 >after returning > around after > after

*? ? ? ? ? before>around before>業(yè)務(wù)方法 >after throwing >? after

*

*? ? ? ? ? ps. 使用注解的話是環(huán)繞通知proceed方法之前部分先執(zhí)行,使用xml配置的話取決于aop:before和aop:around的配置順序

*/

public class MyAspect {

? ? public void myBefore(JoinPoint jp){

//? ? ? ? System.out.println("args " + Arrays.toString(jp.getArgs()));

//? ? ? ? System.out.println("toString " + jp.toString());

//? ? ? ? System.out.println("getTarget " + jp.getTarget());

? ? ? ? System.out.println("this is before.");

? ? }

? ? public void myAfter(JoinPoint jp){

? ? ? ? System.out.println("this is after.");

? ? }

? ? public Object myAround(ProceedingJoinPoint pjp){

? ? ? ? try {

? ? ? ? ? ? System.out.println("this is around before");

? ? ? ? ? ? Object obj = pjp.proceed();

? ? ? ? ? ? System.out.println("this is around after " + obj);

? ? ? ? ? ? return obj;

? ? ? ? } catch (Throwable throwable) {

? ? ? ? ? ? throwable.printStackTrace();

? ? ? ? }

? ? ? ? return null;

? ? }

? ? /**

? ? * 帶有返回值的通知

? ? * @param jp

? ? * @param obj 配置文件中的obj

? ? */

? ? public void myReturn(JoinPoint jp, Object obj){

? ? ? ? System.out.println("this is after returning " + obj);

? ? }

? ? public void myThrow(JoinPoint jp, Throwable e){

? ? ? ? System.out.println("this is after throwing " + e.getMessage());

? ? }

}

4.beans.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="us" class="com.zy.aop05.UserServiceImpl"/>

? ? <bean id="ma" class="com.zy.aop05.MyAspect" />

? ? <aop:config proxy-target-class="true">

? ? ? ? <aop:aspect ref="ma">

? ? ? ? ? ? <aop:pointcut id="mpc" expression="execution(* com.zy.aop05.*.*(..))" />

? ? ? ? ? ? <aop:before method="myBefore" pointcut-ref="mpc"/>

? ? ? ? ? ? <aop:after method="myAfter" pointcut-ref="mpc" />

? ? ? ? ? ? <aop:around method="myAround" pointcut-ref="mpc" />

? ? ? ? ? ? <aop:after-returning method="myReturn" pointcut-ref="mpc" returning="obj" />

? ? ? ? ? ? <aop:after-throwing method="myThrow" pointcut-ref="mpc" throwing="e" />

? ? ? ? </aop:aspect>

? ? </aop:config>

</beans>

5.TestAOP05.java

package com.zy.aop05;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestAOP05 {

? ? @Test

? ? public void test(){

? ? ? ? ApplicationContext ac = new ClassPathXmlApplicationContext("com/zy/aop05/beans.xml");

? ? ? ? IUserService us = ac.getBean("us", IUserService.class);

? ? ? ? us.updateUser(new Object());

? ? ? ? us.getAllUser();

? ? ? ? us.saveUser(new Object());

? ? ? ? us.deleteUser(1);

? ? ? ? us.getUserByUid();

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容