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 stub
System.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 stub
Object 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装饰器的功能大同小异。
java aop面向切面编程的更多相关文章
- JAVA AOP面向切面编程与动态代理
1.静态代理和动态代理的概念: 在我的另一篇博文:Java 静态代理和动态代理 中有讲到,这里就不做赘述了. JDK动态代理它的好处理是可以为我们生成任何一个接口的代理类,并将需要增强的方法织入到 ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- [转] AOP面向切面编程
AOP面向切面编程 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
- 【原创】Android AOP面向切面编程AspectJ
一.背景: 在项目开发中,对 App 客户端重构后,发现用于统计用户行为的友盟统计代码和用户行为日志记录代码分散在各业务模块中,比如在视频模块,要想实现对用户对监控点的实时预览和远程回放行为进行统计, ...
- Spring:AOP面向切面编程
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...
- Spring Boot2(六):使用Spring Boot整合AOP面向切面编程
一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop aop全称Aspec ...
- 浅谈Spring AOP 面向切面编程 最通俗易懂的画图理解AOP、AOP通知执行顺序~
简介 我们都知道,Spring 框架作为后端主流框架之一,最有特点的三部分就是IOC控制反转.依赖注入.以及AOP切面.当然AOP作为一个Spring 的重要组成模块,当然IOC是不依赖于Spring ...
- Spring 08: AOP面向切面编程 + 手写AOP框架
核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
随机推荐
- Unicode不可见字符的显示
Unicode的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS 不可见字符”/u200b”为 Unicode Character ‘Z ...
- LCT教程
lct是一种动态树,用来维护一些动态加边删边的操作的东西.他主要用到几个操作,其实这个算法和树链刨分有点像,但是不能用线段树简单维护,所以我们要用多棵平衡树来维护树上的一个个子树,然后就进行一些很秀的 ...
- bzoj 2044 三维导弹拦截 —— 最小路径覆盖
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2044 第一问暴力 n^2 即可: 注意这道题对位置没要求!所以先按第一维排序一下即可: 然后 ...
- 57.部门职位管理 ExtJs 展示
1.jobInfo.jsp <%@ page language="java" pageEncoding="UTF-8"%> <script t ...
- jsp jquery js 的基本路径获取
引子:js中需要当前页面的基础路径,获取不到request,可以通过如下方法来解决! 1.jsp基础路径,在jsp头部加上,获取基础路径http://localhost:8080/project/ ...
- windows2003下svn的安装
Windows2003下svn平台搭建 编辑:dnawo 日期:2010-08-03 转自http://www.mzwu.com/article.asp?id=2557 字体大小: 小 中 大 ...
- P1462 通往奥格瑞玛的道路(二分答案+最短路)
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- [Swift通天遁地]五、高级扩展-(10)整形、浮点、数组、字典、字符串、点、颜色、图像类的实用扩展
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Android json 数据解析
1.json格式 2.json解析 3.gson解析 4.fastjson解析 一.Json格式 json一种轻量级的数据交换格式.在网络上传输交换数据一般用xml, json. 两种结构: 1)对象 ...
- Jquery和Ajax的关系!
Jquery是一种JavaScript框架,而Ajax(Asynchronous JavaScript and XML)是异步JavaScript和XML. Jquery是JavaScript的框架, ...