利用JAVA的动态属性之反射原理实现一个简单AOP容器 - AOP的实现原理分析
2012-02-17 23:09
1341 查看
AOP:Aspect Oriented Programming,意为面向切面/局部的程序设计。它是面向对象的程序设计的一种延伸。 本文试图通过使用Java本身的动态属性,来实现一个具有简单的AOP功能的容器。 开始理解起来可能比较费劲,但我们可以通过一个通俗说明来这样理解AOP的概念,就是使用AOP可以不用修改原有的代码,而可以追加新的功能。 比如,我们用AOP实现了用户登陆(判断ID与密码是否正确)功能,现在我们要求在用户登陆时用LOG记录用户登陆的情况。一般的做法是直接修改已有的登陆逻辑代码,但使用AOP,可以不用修改原有的代码而完成此功能。 本文试图通过使用Java本身的动态代理功能,来实现一个具有简单的AOP功能的容器。从而帮助大家对AOP有个大概的认识。 Java动态代理功能首 先,我们简单介绍一下Java动态代理功能。JAVA的动态代理功能主要通过java.lang.reflect.Proxy类与 java.lang.reflect.InvocationHandler接口完成,这里正是通过它们实现一个简单的AOP容器的。其实,像JBoss AOP等其他动态AOP框架也都是通过Proxy和InvocationHandler来实现的。Java从JDK1.3开始提供动态代理(Java Proxy)功能。 所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联。 AOP(Aspect Oriented Programming):面向切面编程,其中的一种实现方法便是用Proxy来实现的。 Java Proxy只能代理接口,不能代理类。 Java Proxy功能主要通过java.lang.reflect.Proxy类与java.lang.reflect.InvocationHandler接口实现。 java.lang.reflect.Proxy (代理类) > ProxyInterface(被代理的接口) > InvocationHandler(关联类)> Class(可以在InvocationHandler中被调用)。它们之间的关系可以用下面的流程图来表示:
可以通过Proxy. newProxyInstance方法得到被代理的接口的一个实例(instance),该实例由newProxyInstance方法动态生成,并实现了该接口。 当程序显示调用接口的方法时,其时是调用该实例的方法,此方法又会调用与该实例相关联InvocationHandler的invoke方法。 这样我们可以在InvocationHandler.invoke方法里调用某些处理逻辑或真正的逻辑处理实现类。 用Java Proxy实现AOP容器面我们使用Java Proxy来实现一个简单的AOP容器。文件列表:
AopContainer.java
第二个getBean方法只有一个参数,就是类的实例。该类必须实现1个以上的接口。本文的例子并没有使用到该方法,所以这里顺便介绍一下它的使用方法。比如有一个类HelloWorld实现了接口IHelloWorld1和IHelloWorld2,那么可以通过
实现InvocationHandler接口的中间类: AopInvocationHandlerImpl.java
我们通过在AopInvocationHandlerImpl.invoke方法里的method.invoke(bizPojo, args)来调用bizPojo类的与被代理接口的同名方法。这里,bizPojo必须实现了被代理的接口。 在我们的例子里,我们在实际上被调用的业务逻辑方法的前后输出了日志信息。 实际上的逻辑处理类。该类实现了被代理的接口:IDoBusiness。 DoBusiness.java
IDoBusiness.java
TestAop.java
本文通过Java Proxy实现了一个简单地AOP容器。也简单地展示了AOP的基本实现原理,实际上可以以此为基础实现一个功能完善的AOP容器。 |
相关文章推荐
- Java JDK 动态代理(AOP)使用及实现原理分析
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
- 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- 利用Java Reflection(反射)原理,在hibernate里面实现对单表、视图的动态组合查询
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java反射之JDK动态代理实现简单AOP
- IoC原理-使用反射/Emit来实现一个最简单的IoC容器
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java反射之JDK动态代理实现简单AOP
- 利用java反射原理写了一个简单赋值和取值通用类【改】
- Java反射之JDK动态代理实现简单AOP
- Java JDK 动态代理(AOP)使用及实现原理分析
- Java反射之JDK动态代理实现简单AOP
- 分析动态代理Java JDK 动态代理(AOP)使用及实现原理分析
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- 菜鸟学SSH(十四)——Spring容器AOP的实现原理——动态代理