1.IUserServcie.java
package com.zy.aop05;
import java.util.List;
public interface IUserService {
? ? /**
? ? * 獲取所有的用戶對象列表
? ? * @return
? ? */
? ? List<Object> getAllUser();
? ? /**
? ? * 保存用戶
? ? * @param user
? ? * @return
? ? */
? ? boolean saveUser(Object user);
? ? /**
? ? * 根據(jù)用戶uid刪除該uid對應(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;
/**
* 五種通知方式來實現(xiàn)aop
*? 1. 前置通知巡社,在業(yè)務(wù)方法之前執(zhí)行
*? 2. 后置通知,在業(yè)務(wù)方法之后執(zhí)行
*? 3. 環(huán)繞通知手趣,同時在業(yè)務(wù)方法的前后執(zhí)行
*? 4. 帶有返回值通知晌该,可以拿到業(yè)務(wù)方法的返回值
*? 5. 異常通知,可以捕獲業(yè)務(wù)方法中的異常對象
*
*? ? ? 注意:如果同時配置來所有的通知方式绿渣,則執(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();
? ? }
}