Spring学习03——AOP Demo
切面类StudentServiceAspect.java
package com.su.advice; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class StudentServiceAspect { public void doBefore(JoinPoint jp){ System.out.println("类名:"+jp.getTarget().getClass().getName()); System.out.println("方法名:"+jp.getSignature().getName()); System.out.println("开始添加学生:"); } public void doAfter(JoinPoint jp){ System.out.println("类名:"+jp.getTarget().getClass().getName()); System.out.println("方法名:"+jp.getSignature().getName()); System.out.println("学生添加完成:"+jp.getArgs()[0]); } public Object doAround(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("添加学生前"); Object retVal=pjp.proceed(); System.out.println(retVal); System.out.println("添加学生后"); return retVal; } public void doAfterReturning(JoinPoint jp){ System.out.println("返回通知"); } public void doAfterThrowing(JoinPoint jp,Throwable ex){ System.out.println("异常通知"); System.out.println("异常信息:"+ex.getMessage()); } }
接口StudentService
package com.su.service; public interface StudentService { public void addStudent(String name); }
接口的实现类StudentServiceImpl
package com.su.service.impl; import com.su.service.StudentService; public class StudentServiceImpl implements StudentService{ @Override public void addStudent(String name) { // System.out.println("开始添加学生"+name); System.out.println("添加学生"+name);// System.out.println("完成学生"+name+"的添加"); } }
测试类
package com.su.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.su.service.StudentService; public class T { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml"); StudentService studentService=(StudentService)ac.getBean("studentService"); studentService.addStudent("张三"); } }
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="studentServiceAspect" class="com.su.advice.StudentServiceAspect"></bean> <bean id="studentService" class="com.su.service.impl.StudentServiceImpl"></bean> <aop:config> <aop:aspect id="studentServiceAspect" ref="studentServiceAspect"> <aop:pointcut expression="execution(* com.su.service.*.*(..))" id="businessService"/> <aop:before method="doBefore" pointcut-ref="businessService"/><!-- 将doBefore切入 切点配置的方法中 --> <aop:after method="doAfter" pointcut-ref="businessService"/> <aop:around method="doAround" pointcut-ref="businessService"/> <aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/> <aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/> </aop:aspect> </aop:config> </beans>
如果只配置doBefore、doAfter,只切入这两个方法的话,执行结果如图