java aop面向切面编程
最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思。看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果。http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html
具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。
AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。
AOP 主要是利用代理模式的技术来实现的。
静态代理(代码如下):
package com.practice.proxypattern;public interface ITalk {public void talk(String msg); }
package com.practice.proxypattern;public class PeopleTalk implements ITalk {private String username;private String age;public PeopleTalk(String username,String age) {this.username=username;this.age=age;}public void talk(String msg) {// TODO Auto-generated method stubSystem.out.println(msg+"你好,我是"+username+",我年龄是"+age);}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
package com.practice.proxypattern;import java.security.PublicKey;public class TalkProxy implements ITalk{private ITalk talker;public TalkProxy(ITalk talker) {this.talker=talker;}public void talk(String msg) {// TODO Auto-generated method stub talker.talk(msg);}public void talk(String msg,String singname) {talker.talk(msg);sing(singname);}private void sing(String singname) {System.out.println("唱歌:"+singname);}}
package com.practice.proxypattern;public class ProxyPattern {public static void main(String[] args) {ITalk people=new PeopleTalk("AOP", "18");people.talk("No ProXY Test");System.out.println("-----------------------");TalkProxy talker=new TalkProxy(people);talker.talk("ProXY Test","代理");} }
运行结果如下:
No ProXY Test你好,我是AOP,我年龄是18
-----------------------
ProXY Test你好,我是AOP,我年龄是18
唱歌:代理
添加了一个新功能
以下是动态代理的代码:
package com.practice.dynamicproxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler {//需要代理的目标类private Object target;public Object bind(Object target) {this.target=target;return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// TODO Auto-generated method stubObject result=null;System.out.println("切面之前执行");result=method.invoke(target, args);System.out.println("切面之后执行");return result;}}
package com.practice.dynamicproxy;import com.practice.proxypattern.ITalk; import com.practice.proxypattern.PeopleTalk;public class Test {public static void main(String[] args) {ITalk iTalk=(ITalk) new DynamicProxy().bind(new PeopleTalk("DynamicProxy","18"));iTalk.talk("业务说明"); } }
运行结果如下:
切面之前执行
业务说明你好,我是DynamicProxy,我年龄是18
切面之后执行
同样也添加了新功能 ,与python装饰器的功能大同小异。
转载于:https://www.cnblogs.com/linwenbin/p/11083463.html
java aop面向切面编程相关推荐
- python aop编程_学习笔记: AOP面向切面编程和C#多种实现
AOP:面向切面编程 编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统 类--砖头 系统--房子 类--细胞 系统--人 面向对象是非常适合做大型 ...
- Java绝地求生—Spring AOP面向切面编程
Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...
- 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析
文章目录 一.查看使用 AspectJ 后生成的 Class 字节码类 二.AspectJ 的本质 一.查看使用 AspectJ 后生成的 Class 字节码类 在 Android Studio 中查 ...
- 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )
文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...
- spring中AOP(面向切面编程)
spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...
- 【SSM】Spring系列——AOP面向切面编程
文章目录 03 AOP面向切面编程 3.1 AOP概述 3.2 面向切面编程对有什么好处 3.3 模拟AOP框架实现 3.3.1 代码实现版本一 3.3.2 代码实现版本二 3.3.3 代码实现版本三 ...
- AOP面向切面编程之全局日志打印/统计接口耗时
目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...
- SpringBoot之AOP面向切面编程实例
目录 1.引入pom依赖 2.切入点表达式 --组成 --逻辑运算符 --通配符 --范例 3. 启动类配置 4.通知类型 4.1 @Before : 标注当前方法作为前置通知 4.1.1 创建自定义 ...
- 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )
文章目录 一.AspectJ 下载 二.拷贝 aspectjrt.jar 到 Android Studio 三.配置 Gradle 和 Gradle 插件版本 四.配置 Gradle 构建脚本 一.A ...
最新文章
- python程序实例教程基础-编程小案例
- 腾讯V265编码器:给用户以完备的265体验
- Android中常见的MVC/MVP/MVVM模式
- 某云商城发卡网源码 带视频教程
- kettle 调用存储过程_Mysql存储过程
- JAVA基础系列:反射
- 《西游记》中九尾狐狸为什么有太上老君的幌金绳?
- 学习的四重境界,给上初中侄女,如何学习,如何定义社会人才
- 梯度下降优化器小结(RMSProp,Momentum,Adam)
- 111端口rpcbind漏洞
- His系统数据库服务器关系,his系统数据库服务器
- 双目相机:基于双目视觉的目标测距
- igraph基本使用方法示例
- 循序渐进ActiveMQ(6)----使用zookeeper实现activemq的主从环境搭建
- 如何处理计算机显示器故障,电脑显示器常见的故障及解决办法
- Ubuntu设置PPPoE拨号上网
- 入门图形学:Texture3D
- 云原生|kubernetes|etcd集群详细介绍+安装部署+调优
- 央视 315 晚会曝光数据泄露
- 央视CCTV摄制组进驻领存深入报道
热门文章
- Python 进阶_OOP 面向对象编程_静态方法和类方法
- thinkphp去掉index.php
- 访客门禁系统供应商 首选钱林厂家
- HTML的base href = “” /
- 数据结构和算法:递归和迭代算法示例
- HLG 1349 Graph [floyed]
- 号外:Mapinfo被Pitney Bowes公司收购
- Ajax 完整教程(转载)
- Android深度探索(卷1)HAL与驱动开发--读书笔记(第一章)
- jsonp请求url长度过长的替代(ajaxcdr的使用)