Java基础-SSM之Spring的AOP编程

                                    作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

    Spring的本质说白了就是动态代理,接下来我们会体验AOP的用法。它是对OOP的增强,适用于系统级功能。

 一.MethodBeforeAdvice接口的应用

1>.引入新的依赖

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6
 7     <groupId>cn.org.yinzhengjie</groupId>
 8     <artifactId>MySpring</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10
11     <dependencies>
12         <dependency>
13             <groupId>junit</groupId>
14             <artifactId>junit</artifactId>
15             <version>4.11</version>
16         </dependency>
17         <dependency>
18             <groupId>org.springframework</groupId>
19             <artifactId>spring-context-support</artifactId>
20             <version>4.3.5.RELEASE</version>
21         </dependency>
22
23         <dependency>
24             <groupId>aopalliance</groupId>
25             <artifactId>aopalliance</artifactId>
26             <version>1.0</version>
27         </dependency>
28     </dependencies>
29
30 </project>

2>.定义通知类

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.springframework.aop.MethodBeforeAdvice;
 9
10 import java.lang.reflect.Method;
11
12 /**
13  * 前置通知
14  */
15 public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
16     public void before(Method method, Object[] args, Object target) throws Throwable {
17         String mname = method.getName() ;
18         System.out.printf("当前处理的对象 : %s\n调用对象的方法 : %s\n调用参数 : %s\n" , target.toString(),mname.toString(),args.toString());
19         System.out.println("============= MyMethodBeforeAdvice代码执行完毕 =============");
20     }
21 }

3>.编写实现WelcomeService和WelcomeService2两个接口的类

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 public interface WelcomeService {
 9     public abstract void sayHello();
10 }

WelcomeService.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 public interface WelcomeService2 {
 9     public abstract void sayHello2();
10 }

WelcomeService2.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8
 9 public class WelcomeServiceImpl implements WelcomeService,WelcomeService2{
10     private String name ;
11
12     public String getName() {
13         return name;
14     }
15
16     public void setName(String name) {
17         this.name = name;
18     }
19
20     public void sayHello() {
21         System.out.println(name);
22     }
23
24     public void sayHello2() {
25         System.out.println("Hello Wold");
26     }
27 }

4>.编写Spring的配置文件

 1 <?xml version="1.0"?>
 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        xmlns:context="http://www.springframework.org/schema/context"
 6        xmlns:tx="http://www.springframework.org/schema/tx"
 7        xsi:schemaLocation="http://www.springframework.org/schema/beans
 8                                 http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 9                                 http://www.springframework.org/schema/aop
10                                 http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
11                                 http://www.springframework.org/schema/context
12                                 http://www.springframework.org/schema/context/spring-context-4.3.xsd
13                                 http://www.springframework.org/schema/tx
14                                 http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
15     <!-- 前置通知 -->
16     <bean id="beforeAdvice" class="cn.org.yinzhengjie.spring.aop.advice.MyMethodBeforeAdvice" />
17
18     <!-- 目标对象 -->
19     <bean id="wsTarget" class="cn.org.yinzhengjie.spring.aop.advice.WelcomeServiceImpl">
20         <property name="name" value="I'm yinzhengjie !!!" />
21     </bean>
22
23     <!-- 代理对象 -->
24     <bean id="wsProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
25         <!-- 代理接口集 -->
26         <property name="proxyInterfaces">
27             <list>
28                 <value>cn.org.yinzhengjie.spring.aop.advice.WelcomeService</value>
29                 <value>cn.org.yinzhengjie.spring.aop.advice.WelcomeService2</value>
30             </list>
31         </property>
32         <!-- 拦截器名集合 -->
33         <property name="interceptorNames">
34             <list>
35                 <value>beforeAdvice</value>
36             </list>
37         </property>
38
39         <!-- 注意,目标类的名字为"target"关键字,而ref是真正需要被代理的对象连接。一个代理对象一次性只能代理一个类,如果想要代理多个类,需要重新单独定义bean标签哟! -->
40         <property name="target" ref="wsTarget" />
41
42     </bean>
43 </beans>

5>.编写单元测试类代码

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.junit.Test;
 9 import org.springframework.context.ApplicationContext;
10 import org.springframework.context.support.ClassPathXmlApplicationContext;
11
12 public class TestAop {
13     @Test
14     public void testAOP1(){
15         ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml") ;
16         WelcomeService ws = (WelcomeService) ac.getBean("wsProxy");
17         ws.sayHello();
18
19         WelcomeService2 ws2 = (WelcomeService2)ws;
20         ws2.sayHello2();
21
22     }
23 }

  以上代码测试结果如下:

二.AOP的四个通知编程案例

  上面我们已经介绍了Spring的AOP编程中的一个前置通知,其实除了前置通知还有后置通知,循环通知以及异常通知。其实配置文件的方法和上面类似,只不过他们有各自的优点,下面我简单的做个介绍:

    前置通知:主要负责处理调用目标对象之前执行的代码;

    后置通知:主要负责处理调用目标对象之后的执行代码;

    环绕通知:它执行的优先级是在后置通知之前,在前置通知之后的执行的代码,它可以把方法包起来处理,比如在调用方法之前执行一段代码,在调用方法之后,还可以执行一段代码,另外,相比前置通知和通知通知,它还新增了一个返回值的功能;

    异常通知:它执行的优先级暂时没法确定,而且不一定执行,顾名思义,它是在有异常的时候才会触发的代码!因此即使你写了这样的通知,有可能你看不到它的执行结果,除非你故意写一段可能出现异常的代码;

1>.编写测试代码

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 public interface WelcomeService {
 9     public abstract void sayHello();
10 }

WelcomeService.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 public interface WelcomeService2 {
 9     public abstract void sayHello2();
10 }

WelcomeService2.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8
 9 public class WelcomeServiceImpl implements WelcomeService,WelcomeService2{
10     private String name ;
11
12     public String getName() {
13         return name;
14     }
15
16     public void setName(String name) {
17         this.name = name;
18     }
19
20     public void sayHello() {
21         System.out.println(name);
22     }
23
24     public void sayHello2() {
25         System.out.println("Hello Wold");
26     }
27 }

WelcomeServiceImpl.java 文件内容

2>.编写通知类

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.springframework.aop.MethodBeforeAdvice;
 9
10 import java.lang.reflect.Method;
11
12 /**
13  * 前置通知
14  */
15 public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
16     public void before(Method method, Object[] args, Object target) throws Throwable {
17         String mname = method.getName() ;
18         System.out.printf("当前处理的对象 : %s\n调用对象的方法 : %s\n调用参数 : %s\n" , target.toString(),mname.toString(),args.toString());
19         System.out.println("============= MyMethodBeforeAdvice代码执行完毕 =============");
20     }
21 }

MyMethodBeforeAdvice.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.aopalliance.intercept.MethodInterceptor;
 9 import org.aopalliance.intercept.MethodInvocation;
10
11 /**
12  * 环绕通知,可以篡改行为
13  */
14 public class MyMethodInterceptor  implements MethodInterceptor {
15
16     public Object invoke(MethodInvocation invocation) throws Throwable {
17         System.out.println("begin");
18         //调用目标对象方法的返回值
19         Object tis = invocation.getThis();
20         System.out.println(tis);
21         Object ret = invocation.proceed() ;
22         System.out.println("end");
23         return ret;
24     }
25 }

MyMethodInterceptor.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.springframework.aop.AfterReturningAdvice;
 9
10 import java.lang.reflect.Method;
11
12 public class MyAfterReturningAdvice  implements AfterReturningAdvice {
13     public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
14         System.out.println("over");
15     }
16 }

MyAfterReturningAdvice.java 文件内容

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.springframework.aop.ThrowsAdvice;
 9
10 import java.lang.reflect.Method;
11
12 /**
13  * 异常通知
14  */
15 public class MyThrowableAdvice implements ThrowsAdvice {
16     public void afterThrowing(Method method, Object[] args, Object target, Exception ex){
17         System.out.println("出事了!!" + ex.toString());
18     }
19 }

MyThrowableAdvice.java 文件内容

3>.编写Spring的配置文件

 1 <?xml version="1.0"?>
 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        xmlns:context="http://www.springframework.org/schema/context"
 6        xmlns:tx="http://www.springframework.org/schema/tx"
 7        xsi:schemaLocation="http://www.springframework.org/schema/beans
 8                         http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 9                         http://www.springframework.org/schema/aop
10                         http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
11                         http://www.springframework.org/schema/context
12                         http://www.springframework.org/schema/context/spring-context-4.3.xsd
13                         http://www.springframework.org/schema/tx
14                         http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
15     <!-- 通知 -->
16     <bean id="beforeAdvice" class="cn.org.yinzhengjie.spring.aop.advice.MyMethodBeforeAdvice" />
17     <bean id="afterAdvice" class="cn.org.yinzhengjie.spring.aop.advice.MyAfterReturningAdvice" />
18     <bean id="aroundAdvice" class="cn.org.yinzhengjie.spring.aop.advice.MyMethodInterceptor" />
19     <bean id="throwableAdvice" class="cn.org.yinzhengjie.spring.aop.advice.MyThrowableAdvice" />
20
21
22     <!-- 目标对象 -->
23     <bean id="wsTarget" class="cn.org.yinzhengjie.spring.aop.advice.WelcomeServiceImpl">
24         <property name="name" value="tom" />
25     </bean>
26
27     <!-- 代理对象 -->
28     <bean id="wsProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
29         <!-- 代理接口集 -->
30         <property name="proxyInterfaces">
31             <list>
32                 <value>cn.org.yinzhengjie.spring.aop.advice.WelcomeService</value>
33                 <value>cn.org.yinzhengjie.spring.aop.advice.WelcomeService2</value>
34             </list>
35         </property>
36         <!-- 拦截器名集合 -->
37         <property name="interceptorNames">
38             <list>
39                 <value>beforeAdvice</value>
40                 <value>afterAdvice</value>
41                 <value>aroundAdvice</value>
42                 <value>throwableAdvice</value>
43             </list>
44         </property>
45         <property name="target" ref="wsTarget" />
46     </bean>
47 </beans>

4>.编写测试代码

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.spring.aop.advice;
 7
 8 import org.junit.Test;
 9 import org.springframework.context.ApplicationContext;
10 import org.springframework.context.support.ClassPathXmlApplicationContext;
11
12 public class TestAop {
13     @Test
14     public void testAOP1(){
15         ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml") ;
16         WelcomeService ws = (WelcomeService) ac.getBean("wsProxy");
17         ws.sayHello();
18
19         WelcomeService2 ws2 = (WelcomeService2)ws;
20         ws2.sayHello2();
21
22     }
23 }

5>.运行以上代码执行结果如下:

转载于:https://www.cnblogs.com/yinzhengjie/p/9288904.html

Java基础-SSM之Spring的AOP编程相关推荐

  1. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的&q ...

  4. Java基础-SSM之mybatis一对一关联

    Java基础-SSM之mybatis一对一关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建husbands和wifes表并建 ...

  5. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  6. 【SSM】Spring系列——AOP面向切面编程

    文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...

  7. Java动态代理模拟spring的AOP

    广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者咨询. spri ...

  8. java基础学习——Swing图形化用户界面编程

    GUI概述 早期计算机系统中,电脑向用户提供的是单调.枯燥.纯字符状态的"命令行界面(CLI)".就是到现在,我们还可以依稀看到它们的身影:在Windows中开个DOS窗口,就可看 ...

  9. 【Java基础系列教程】第一章 编程入门

    一.计算机概述 1.1 计算机简介 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处 ...

  10. Java基础15-java进阶(6)【网络编程】

    Java进阶06 网络编程 1 网络编程概述 计算机网络: 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规 模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息.共享硬 ...

最新文章

  1. Python链接MySQL
  2. python系统提供构造函数传入参数_[ Python入门教程 ] Python函数定义和使用
  3. peleenet v2不好
  4. CentOS 7.2 时间同步与时区设置
  5. 解决用navicate远程连接数据库出现1045 access denied for user 'root'@'localhost' using password yes...
  6. docker配置数据默认存储路径:--graph已过时,新版本中使用--data-root代替
  7. SpringAOP编程-传统基于JDK代理的AOP开发
  8. Boost:移动容器的测试程序
  9. html语言怎么那么难用,css语言难学吗?
  10. 成都东万计算机学校,东兴区东方科技职业技术学校
  11. 成熟就是深谙世故却不世故
  12. 反射应用二:利用反射加配置文件实现多数据库的访问
  13. Knative Serving 之路由管理和 Ingress
  14. Spring入门系列之Spring概述
  15. python画大对勾_python+selenium个人学习笔记8-获取信息和勾选框
  16. Hibernate--Criteria Query and DetachedCriteria
  17. 我的代码库-Java8实现FTP与SFTP文件上传下载
  18. 设置控件输入的输入方式
  19. UE4入门序列06(Unreal源码编译及打包专用服务器)
  20. 关于“该计算机已安装更高版本的Google Chrome浏览器“问题解决方法

热门文章

  1. 2017马哥python高级实战班 培训推荐
  2. 阿里面试算法题(一)
  3. 海思3559万能平台搭建:YUV422的踩坑记录
  4. 使用duet或spacedesk实现iPad作为电脑扩展屏幕
  5. 教你快速填充Excel中不同的数据,别再一个个向下拉动啦
  6. 华为手机root过程
  7. Linux libaio 实例,linux libaio安装
  8. c语言天数转换成周数,如何将周数转换为日期?
  9. 谷歌浏览器的笔记在哪里_推荐七款谷歌浏览器chrome在线网页阅读模式插件
  10. 开源可视化bi工具有哪些,干货推荐