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);
/**
* 根据用户uid删除该uid对应的用户信息
* @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;
/**
* 五种通知方式来实现aop
* 1. 前置通知,在业务方法之前执行
* 2. 后置通知,在业务方法之后执行
* 3. 环绕通知,同时在业务方法的前后执行
* 4. 带有返回值通知,可以拿到业务方法的返回值
* 5. 异常通知,可以捕获业务方法中的异常对象
*
* 注意:如果同时配置来所有的通知方式,则执行顺序依次为:
* before>around before>业务方法 >after returning > around after > after
* before>around before>业务方法 >after throwing > after
*
* ps. 使用注解的话是环绕通知proceed方法之前部分先执行,使用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();
}
}