首页 > 代码库 > (三)Spring 之AOP 详解
(三)Spring 之AOP 详解
第一节:AOP 简介
AOP 简介:百度百科;
面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
--------
这里我先开头讲一个例子代码程序:
T.java:
1 package com.wishwzp.test; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 import com.wishwzp.service.StudentService; 9 10 11 public class T {12 13 private ApplicationContext ac;14 15 @Before16 public void setUp() throws Exception {17 ac=new ClassPathXmlApplicationContext("beans.xml");18 }19 20 @Test21 public void test1() {22 StudentService studentService=(StudentService)ac.getBean("studentService");23 studentService.addStudent("张三");24 }25 26 27 }
beans.xml:
1 <?xml version="1.0" encoding="UTF-8"?>2 <beans xmlns="http://www.springframework.org/schema/beans"3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"4 xsi:schemaLocation="http://www.springframework.org/schema/beans5 http://www.springframework.org/schema/beans/spring-beans.xsd">6 7 <bean id="studentService" class="com.wishwzp.service.impl.StudentServiceImpl"></bean>8 9 </beans>
StudentServiceImpl.java:
1 package com.wishwzp.service.impl; 2 3 import com.wishwzp.service.StudentService; 4 5 public class StudentServiceImpl implements StudentService{ 6 7 @Override 8 public void addStudent(String name) { 9 System.out.println("开始添加学生"+name);10 System.out.println("添加学生"+name);11 System.out.println("完成学生"+name+"的添加");12 }13 14 }
StudentService.java:
1 package com.wishwzp.service;2 3 public interface StudentService {4 5 public void addStudent(String name);6 }
运行结果显示:
开始添加学生张三
添加学生张三
完成学生张三的添加
--------------
第二节:Spring AOP 实例
1,前置通知;
2,后置通知;
3,环绕通知;
4,返回通知;
5,异常通知;
1,前置通知;
T.java:
1 package com.wishwzp.test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import com.wishwzp.service.StudentService; 7 8 9 public class T {10 11 public static void main(String[] args) {12 ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");13 StudentService studentService=(StudentService)ac.getBean("studentService");14 studentService.addStudent("张三");15 16 }17 }
beans.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <!-- 注入bean,StudentServiceAspect -->11 <bean id="studentServiceAspect" class="com.wishwzp.advice.StudentServiceAspect"></bean>12 13 <!-- 注入bean,StudentServiceImpl -->14 <bean id="studentService" class="com.wishwzp.service.impl.StudentServiceImpl"></bean>15 16 <!-- 配置AOP -->17 <aop:config>18 <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">19 <aop:pointcut expression="execution(* com.wishwzp.service.*.*(..))" id="businessService"/>20 <aop:before method="doBefore" pointcut-ref="businessService"/>21 </aop:aspect> 22 </aop:config>23 </beans>
StudentServiceAspect.java:
1 package com.wishwzp.advice; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinPoint; 5 6 public class StudentServiceAspect { 7 8 public void doBefore(JoinPoint jp){ 9 System.out.println("类名:"+jp.getTarget().getClass().getName());10 System.out.println("方法名:"+jp.getSignature().getName());11 System.out.println("开始添加学生:"+jp.getArgs()[0]);12 }13 14 }
StudentServiceImpl.java:
1 package com.wishwzp.service.impl; 2 3 import com.wishwzp.service.StudentService; 4 5 public class StudentServiceImpl implements StudentService{ 6 7 @Override 8 public void addStudent(String name) { 9 // System.out.println("开始添加学生"+name);10 System.out.println("添加学生"+name);11 // System.out.println("完成学生"+name+"的添加");12 }13 14 }
StudentService.java:
1 package com.wishwzp.service;2 3 public interface StudentService {4 5 public void addStudent(String name);6 }
运行结果显示:
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
开始添加学生:张三
添加学生张三
2,后置通知;
T.java:
1 package com.wishwzp.test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import com.wishwzp.service.StudentService; 7 8 9 public class T {10 11 public static void main(String[] args) {12 ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");13 StudentService studentService=(StudentService)ac.getBean("studentService");14 studentService.addStudent("张三");15 16 }17 }
beans.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <!-- 注入bean,StudentServiceAspect -->11 <bean id="studentServiceAspect" class="com.wishwzp.advice.StudentServiceAspect"></bean>12 13 <!-- 注入bean,StudentServiceImpl -->14 <bean id="studentService" class="com.wishwzp.service.impl.StudentServiceImpl"></bean>15 16 <!-- 配置AOP -->17 <aop:config>18 <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">19 <!-- 配置执行切点路径和id -->20 <aop:pointcut expression="execution(* com.wishwzp.service.*.*(..))" id="businessService"/>21 <!-- 前置通知 -->22 <aop:before method="doBefore" pointcut-ref="businessService"/>23 <!-- 后置通知 -->24 <aop:after method="doAfter" pointcut-ref="businessService"/>25 </aop:aspect> 26 </aop:config>27 </beans>
StudentServiceAspect.java:
1 package com.wishwzp.advice; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinPoint; 5 6 public class StudentServiceAspect { 7 8 //前置通知 9 public void doBefore(JoinPoint jp){10 System.out.println("类名:"+jp.getTarget().getClass().getName());11 System.out.println("方法名:"+jp.getSignature().getName());12 System.out.println("开始添加学生:"+jp.getArgs()[0]);13 }14 15 //后置通知16 public void doAfter(JoinPoint jp){17 System.out.println("类名:"+jp.getTarget().getClass().getName());18 System.out.println("方法名:"+jp.getSignature().getName());19 System.out.println("学生添加完成:"+jp.getArgs()[0]);20 }21 }
StudentServiceImpl.java:
1 package com.wishwzp.service.impl; 2 3 import com.wishwzp.service.StudentService; 4 5 public class StudentServiceImpl implements StudentService{ 6 7 @Override 8 public void addStudent(String name) { 9 // System.out.println("开始添加学生"+name);10 System.out.println("添加学生"+name);11 // System.out.println("完成学生"+name+"的添加");12 }13 14 }
StudentService.java:
1 package com.wishwzp.service;2 3 public interface StudentService {4 5 public void addStudent(String name);6 }
运行结果显示:
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
开始添加学生:张三
添加学生张三
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
学生添加完成:张三
3,环绕通知;
T.java:
1 package com.wishwzp.test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import com.wishwzp.service.StudentService; 7 8 9 public class T {10 11 public static void main(String[] args) {12 ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");13 StudentService studentService=(StudentService)ac.getBean("studentService");14 studentService.addStudent("张三");15 16 }17 }
beans.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <!-- 注入bean,StudentServiceAspect -->11 <bean id="studentServiceAspect" class="com.wishwzp.advice.StudentServiceAspect"></bean>12 13 <!-- 注入bean,StudentServiceImpl -->14 <bean id="studentService" class="com.wishwzp.service.impl.StudentServiceImpl"></bean>15 16 <!-- 配置AOP -->17 <aop:config>18 <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">19 <!-- 配置执行切点路径和id -->20 <aop:pointcut expression="execution(* com.wishwzp.service.*.*(..))" id="businessService"/>21 <!-- 前置通知 -->22 <aop:before method="doBefore" pointcut-ref="businessService"/>23 <!-- 后置通知 -->24 <aop:after method="doAfter" pointcut-ref="businessService"/>25 <!-- 环绕通知 -->26 <aop:around method="doAround" pointcut-ref="businessService"/>27 </aop:aspect> 28 </aop:config>29 </beans>
StudentServiceAspect.java:
1 package com.wishwzp.advice; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinPoint; 5 6 public class StudentServiceAspect { 7 8 //前置通知 9 public void doBefore(JoinPoint jp){10 System.out.println("类名:"+jp.getTarget().getClass().getName());11 System.out.println("方法名:"+jp.getSignature().getName());12 System.out.println("开始添加学生:"+jp.getArgs()[0]);13 }14 15 //后置通知16 public void doAfter(JoinPoint jp){17 System.out.println("类名:"+jp.getTarget().getClass().getName());18 System.out.println("方法名:"+jp.getSignature().getName());19 System.out.println("学生添加完成:"+jp.getArgs()[0]);20 }21 22 //环绕通知,这里添加了返回值23 public Object doAround(ProceedingJoinPoint pjp) throws Throwable{24 System.out.println("添加学生前");25 Object retVal=pjp.proceed();26 System.out.println(retVal);27 System.out.println("添加学生后");28 return retVal;29 }30 }
StudentServiceImpl.java:
1 package com.wishwzp.service.impl; 2 3 import com.wishwzp.service.StudentService; 4 5 public class StudentServiceImpl implements StudentService{ 6 7 @Override 8 public String addStudent(String name) { 9 // System.out.println("开始添加学生"+name);10 System.out.println("添加学生"+name);11 // System.out.println("完成学生"+name+"的添加");12 return name;13 }14 15 }
StudentService.java:
1 package com.wishwzp.service;2 3 public interface StudentService {4 5 public String addStudent(String name);6 }
运行结果显示:
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
开始添加学生:张三
添加学生前
添加学生张三
张三
添加学生后
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
学生添加完成:张三
4,返回通知;
T.java:
1 package com.wishwzp.test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import com.wishwzp.service.StudentService; 7 8 9 public class T {10 11 public static void main(String[] args) {12 ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");13 StudentService studentService=(StudentService)ac.getBean("studentService");14 studentService.addStudent("张三");15 16 }17 }
beans.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <!-- 注入bean,StudentServiceAspect -->11 <bean id="studentServiceAspect" class="com.wishwzp.advice.StudentServiceAspect"></bean>12 13 <!-- 注入bean,StudentServiceImpl -->14 <bean id="studentService" class="com.wishwzp.service.impl.StudentServiceImpl"></bean>15 16 <!-- 配置AOP -->17 <aop:config>18 <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">19 <!-- 配置执行切点路径和id -->20 <aop:pointcut expression="execution(* com.wishwzp.service.*.*(..))" id="businessService"/>21 <!-- 前置通知 -->22 <aop:before method="doBefore" pointcut-ref="businessService"/>23 <!-- 后置通知 -->24 <aop:after method="doAfter" pointcut-ref="businessService"/>25 <!-- 环绕通知 -->26 <aop:around method="doAround" pointcut-ref="businessService"/>27 <!-- 返回通知 -->28 <aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/>29 </aop:aspect> 30 </aop:config>31 </beans>
StudentServiceAspect.java:
1 package com.wishwzp.advice; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinPoint; 5 6 public class StudentServiceAspect { 7 8 //前置通知 9 public void doBefore(JoinPoint jp){10 System.out.println("类名:"+jp.getTarget().getClass().getName());11 System.out.println("方法名:"+jp.getSignature().getName());12 System.out.println("开始添加学生:"+jp.getArgs()[0]);13 }14 15 //后置通知16 public void doAfter(JoinPoint jp){17 System.out.println("类名:"+jp.getTarget().getClass().getName());18 System.out.println("方法名:"+jp.getSignature().getName());19 System.out.println("学生添加完成:"+jp.getArgs()[0]);20 }21 22 //环绕通知,这里添加了返回值23 public Object doAround(ProceedingJoinPoint pjp) throws Throwable{24 System.out.println("添加学生前");25 Object retVal=pjp.proceed();26 System.out.println(retVal);27 System.out.println("添加学生后");28 return retVal;29 }30 31 //返回通知32 public void doAfterReturning(JoinPoint jp){33 System.out.println("返回通知");34 }35 }
StudentServiceImpl.java:
1 package com.wishwzp.service.impl; 2 3 import com.wishwzp.service.StudentService; 4 5 public class StudentServiceImpl implements StudentService{ 6 7 @Override 8 public String addStudent(String name) { 9 // System.out.println("开始添加学生"+name);10 System.out.println("添加学生"+name);11 // System.out.println("完成学生"+name+"的添加");12 return name;13 }14 15 }
StudentService.java:
1 package com.wishwzp.service;2 3 public interface StudentService {4 5 public String addStudent(String name);6 }
运行结果显示:
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
开始添加学生:张三
添加学生前
添加学生张三
返回通知
张三
添加学生后
类名:com.wishwzp.service.impl.StudentServiceImpl
方法名:addStudent
学生添加完成:张三
5,异常通知;
T.java:
1 package com.wishwzp.test; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 import com.wishwzp.service.StudentService; 7 8 9 public class T {10 11 public static void main(String[] args) {12 ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");13 StudentService studentService=(StudentService)ac.getBean("studentService");14 studentService.addStudent("张三");15 16 }17 }
beans.xml:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/aop 8 http://www.springframework.org/schema/aop/spring-aop.xsd"> 9 10 <!-- 注入bean,StudentServiceAspect -->11 <bean id="studentServiceAspect" class="com.wishwzp.advice.StudentServiceAspect"></bean>12 13 <!-- 注入bean,StudentServiceImpl -->14 <bean id="studentService" class="com.wishwzp.service.impl.StudentServiceImpl"></bean>15 16 <!-- 配置AOP -->17 <aop:config>18 <aop:aspect id="studentServiceAspect" ref="studentServiceAspect">19 <!-- 配置执行切点路径和id -->20 <aop:pointcut expression="execution(* com.wishwzp.service.*.*(..))" id="businessService"/>21 <!-- 前置通知 -->22 <aop:before method="doBefore" pointcut-ref="businessService"/>23 <!-- 后置通知 -->24 <aop:after method="doAfter" pointcut-ref="businessService"/>25 <!-- 环绕通知 -->26 <aop:around method="doAround" pointcut-ref="businessService"/>27 <!-- 返回通知 -->28 <aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/>29 <!-- 异常通知 -->30 <aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/>31 </aop:aspect> 32 </aop:config>33 </beans>
StudentServiceAspect.java:
1 package com.wishwzp.advice; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.ProceedingJoinPoint; 5 6 public class StudentServiceAspect { 7 8 //前置通知 9 public void doBefore(JoinPoint jp){10 System.out.println("类名:"+jp.getTarget().getClass().getName());11 System.out.println("方法名:"+jp.getSignature().getName());12 System.out.println("开始添加学生:"+jp.getArgs()[0]);13 }14 15 //后置通知16 public void doAfter(JoinPoint jp){17 System.out.println("类名:"+jp.getTarget().getClass().getName());18 System.out.println("方法名:"+jp.getSignature().getName());19 System.out.println("学生添加完成:"+jp.getArgs()[0]);20 }21 22 //环绕通知,这里添加了返回值23 public Object doAround(ProceedingJoinPoint pjp) throws Throwable{24 System.out.println("添加学生前");25 Object retVal=pjp.proceed();26 System.out.println(retVal);27 System.out.println("添加学生后");28 return retVal;29 }30 31 //返回通知32 public void doAfterReturning(JoinPoint jp){33 System.out.println("返回通知");34 }35 36 //异常通知37 public void doAfterThrowing(JoinPoint jp,Throwable ex){38 System.out.println("异常通知");39 System.out.println("异常信息:"+ex.getMessage());40 }41 }
StudentServiceImpl.java:
1 package com.wishwzp.service.impl; 2 3 import com.wishwzp.service.StudentService; 4 5 public class StudentServiceImpl implements StudentService{ 6 7 @Override 8 public String addStudent(String name) { 9 // System.out.println("开始添加学生"+name);10 System.out.println("添加学生"+name);11 System.out.println(1/0);12 // System.out.println("完成学生"+name+"的添加");13 return name;14 }15 16 }
StudentService.java:
1 package com.wishwzp.service;2 3 public interface StudentService {4 5 public String addStudent(String name);6 }
运行结果显示:
(三)Spring 之AOP 详解