关于面向切面编程Aspect Oriented Programming(AOP)
最近学到spring ,出来了一个新概念,面向切面编程,下面做个笔记,引自百度百科。
Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题。AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了,举个例子,我们现在提供一个查询学生信息的服务,但是我们希望记录有谁进行了这个查询。如果按照传统的OOP的实现的话,那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现 类 (StudentInfoServiceImpl.java),同时为了要进行记录的话,那我们在实现类(StudentInfoServiceImpl.java)中要添加其实现记录的过程。这样的话,假如我们要实现的服务有多个呢?那就要在每个实现的类都添加这些记录过程。这样做的话就会有点繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。那么怎样才能把记录服务的行为与业务处理过程中分离出来呢?看起来好像就是查询学生的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且查询学生的服务不知道存在这些记录过程,这就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。
接口的实现方案:
|
1
2
3
|
public interface StudentInfoService{void findInfo(String studentName);} |
|
1
2
3
4
5
|
public class StudentInfoServiceImpl implements StudentInfoService{public void findInfo(String name){System.out.println("你目前输入的名字是:"+name);}} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import org.apache.log4j.Logger;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.lang.reflect.Method;public class MyHandler implements InvocationHandler{private Object proxyObj;private static Logger log=Logger.getLogger(MyHandler.class);public Object bind(Object obj){this.proxyObj=obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);}public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{Object result=null;try{//请在这里插入代码,在方法前调用("调用log日志方法"+method.getName());result=method.invoke(proxyObj,args); //原方法//请在这里插入代码,方法后调用}catch(Exception e){e.printStackTrace();}return result;}} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public class AOPFactory{private static Object getClassInstance(String clzName){Object obj=null;try{Class cls=Class.forName(clzName);obj=(Object)cls.newInstance();}catch(ClassNotFoundException cnfe){System.out.println("ClassNotFoundException:"+cnfe.getMessage());}catch(Exception e){e.printStackTrace();}return obj;}public static Object getAOPProxyedObject(String clzName){Object proxy=null;MyHandler handler=new MyHandler();Object obj=getClassInstance(clzName);if(obj!=null) {proxy=handler.bind(obj);}else{System.out.println("Can't get the proxyobj");//throw}return proxy;}} |
|
1
2
3
4
5
6
|
public class ClientTest{public static void main(String[] args){StudentInfoService studentInfo= (StudentInfoService)AOPFactory.getAOPProxyedObject("StudentInfoServiceImpl");studentInfo.findInfo("阿飞");}} |
|
1
|
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this); |
子类的实现方案。
|
1
2
3
4
5
|
public class StudentInfoServiceImpl{public void findInfo(String name){System.out.println("你目前输入的名字是:"+name);}} |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;import org.apache.log4j.Logger;public class AOPInstrumenter implements MethodInterceptor{private Logger log=Logger.getLogger(AOPInstrumenter.class);private Enhancer enhancer=new Enhancer();public Object getInstrumentedClass(Class clz){enhancer.setSuperclass(clz);enhancer.setCallback(this);return enhancer.create();}public Object intercept(Object o,Method method,Object[] args,MethodProxy proxy) throws Throwable{("调用日志方法"+method.getName());Object result=proxy.invokeSuper(o,args);return result;}} |
|
1
2
3
4
5
6
7
|
public class AOPTest{public static void main(String[] args){AOPInstrumenter instrumenter=new AOPInstrumenter();StudentInfoServiceImpl studentInfo=(StudentInfoServiceImpl)instrumenter.getInstrumentedClass(StudentInfoServiceImpl.class);studentInfo.findInfo("阿飞");}} |
关于面向切面编程Aspect Oriented Programming(AOP)的更多相关文章
- javascript 高阶函数 实现 AOP 面向切面编程 Aspect Oriented Programming
AOP的主要作用是吧一些跟核心业务逻辑模块无关的功能 -日志统计, 安全控制, 异常处理- 抽离出来, 再通过"动态织入"的方式掺入业务逻辑模块中. 这里通过扩展Function. ...
- 面向切面编程 ( Aspect Oriented Programming with Spring )
Aspect Oriented Programming with Spring 1. 简介 AOP是与OOP不同的一种程序结构.在OOP编程中,模块的单位是class(类):然而,在AOP编程中模块的 ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-简介
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 简介 Aspect-Orie ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-使用工厂创建代理(Using the ProxyFactoryObject to create AOP proxies)
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 如果你正在为你的业务模型使用 ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-通知(Advice)API
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...
- 关于spring.net的面向切面编程 (Aspect Oriented Programming with Spring.NET)-切入点(pointcut)API
本文翻译自Spring.NET官方文档Version 1.3.2. 受限于个人知识水平,有些地方翻译可能不准确,但是我还是希望我的这些微薄的努力能为他人提供帮助. 侵删. 让我们看看 Spring.N ...
- Aspect Oriented Programming (AOP)
切面”指的是那些在你写的代码中在项目的不同部分且有相同共性的东西.它可能是你代码中处理异常.记录方法调用.时间处理.重新执行一些方法等等的一些特殊方式.如果你没有使用任何面向切面编程的类库来做这些事情 ...
- 面向切面编程--AOP(转)
add by zhj:面向切面编程就是在不修改函数A的前提下,在函数A前后插入业务逻辑B, C, D...这其实算是功能分解,将大模块S=A+B+C+D+……分解为独立的小功能A,B,C,D……,模块 ...
- Spring 面向切面编程(AOP)
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...
随机推荐
- 内存的crash记录分析
服务器上线之后,发生了3次crash,感觉是一次比较典型的内存bug的排错经历,所以特地记录下来供以后借鉴.下面描述一下3次crash时候的coredump的当前堆栈信息. 第一次crash的core ...
- 《一个 Go 程序系统线程暴涨的问题》结论
原文地址:https://zhuanlan.zhihu.com/p/22474724 作者的结论没写好,我来说两句.. 结论: Docker swarm自己有个函数,叫setTcpUserTimeou ...
- Java的Package和Classpath
Package 在Java中,Package是用来包含一系相关实例的集合.这些相关联的实例包括:类.接口.异常.错误以及枚举. Package主要有一些的几点作用: Package可以处理名字冲突,在 ...
- Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目 新建一个maven工程,这里不赘述如何新建maven工程. 添加Neo4j jar到你的工程 有两种方 ...
- 根据内存布局定位的一个fastdfs坑
在使用fastdfs时,编写数据上传代码时,遇到一个坑.最终根据指针对应的内存布局定位到一个其client API的一个坑,值得记录一下.具体是在 tracker_connect_server() 这 ...
- Apache 的ab测试
<!-- 博主所有文章仅是作为自己的笔记 如有不足 请见谅--> Apache的ab测试 和 ab测试 不是一个东西(百度 ab测试可以了解) 网站性能压力测试是服务器网站性能调优过程 ...
- TOJ1334
1334: Oil Deposits 时间限制(普通/Java):1000 ...
- 安装系统时出现“windows无法安装到这个磁盘。选中的的磁盘采用GPT分区形式”
安装系统到提示你不能安装在那个磁盘的一步,然后按住shift+F10呼出diskpart命令符,然后依次输入 diskpart list disk select disk 0 clean conver ...
- HTML5获取地理位置
包含了以下功能:(1)通过IP地址获取城市地址(并不完全准确,存在代理IP或IP中转时定位与实际位置不一致的情况)(2)通过移动端浏览器及GPS定位位置坐标(3)根据位置坐标转换百度地图坐标(4)根据 ...
- ubuntu 14.04 下通过apt-get 安装jdk
Installing default JRE/JDK sudo apt-get update sudo apt-get install default-jre sudo apt-get install ...