如何进行AOP开发中的Java动态代理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
1.AOP的概念:Aspect Oriented Programming 面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
2.OOP与AOP的区别:如果说面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等来定义彼此的关系的话;那么面向方面编程则是希望能够将通用需求功能从不相关的类当中分离出来。
3.AOP的应用范围:日志记录,性能统计,安全控制,事务处理,异常处理等等。
Spring中的AOP编程的风格主要有基于XML配置文件、基于注解两种,我们这里以注解为例。
(1.)?表示可以不配置,也就是说只有方法的名字name-pattern、方法的参数param-pattern是必须的。对于param-pattern之外的其余部分,可以使用*作为通配符,表示任意,例如:execution (* *.m(..))就是执行任意返回值、任意类中的m方法时进行织入。
(2.)参数的通配配稍微复杂一些,其中(..)表示参数为0个或者多个,且类型任意;(*)表示任意类型的一个参数;(*,String)表示第一个参数为任意类型,第二个参数为String类型;什么都不写表示无参数。
(3.)多个表达式可以使用&&、||、!进行运算,因为表达式返回的是布尔值。
反射机制的概念:在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
及他们对应的set方法,然后你就可以在Action中获取上面的三个字段的值了。可是作为Struts2框架,Apache在开发的时候这个框架的时候,怎么知道我们Action里有这几个字段的呢?因为Struts2里使用了反射看透了你的Action。
代理设计模式:为其他对象提供一种代理以控制对这个对象的访问。说白了就是去掉客户不能看到的内容和服务或者增添客户需要的额外服务。
常用的代理设计模式:
但不管是那种方法,都是在编译期完成的代理,不能像Spring那样在运行期动态的对指定的类完成代理。
JAVA自带的动态代理是基于java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler两个类来完成的,使用JAVA反射机制。
Proxy类中的几个方法都是静态的,通常,你可以使用如下两种模式创建代理对象:
第一种方式更加直接简便,并且隐藏了代理$Proxy0对象的结构,回调InvocationHandler就是拦截处理的地方。
JDK的动态代理会动态的创建一个$Proxy0的类,这个类继承了Proxy并且实现了要代理的目标对象的接口,但你不要试图在JDK中查找这个类,因为它是动态生成的。$Proxy0的结构大致如下所示:
关于回调接口InvocationHandler:
这是因为目标对象的大部分的方法都被代理了,你在invoke()通过代理对象转换之后的接口调用目标对象的方法,依然是走的代理对象,也就是说当mammal.type()方法被激活时会立即导致invoke()的调用,然后再次调用mammal.type()方法,… …从而使方法调用进入死循环,就像无尽的递归调用。
Proxy代理对象的过程如下所示
JDK的动态代理有个缺点,那就是不能对类进行代理,只能对接口进行代理,想象一下我们的Monkey如果没有实现任何接口,那么将无法使用这种方式进行动态代理(实际上是因为$Proxy0这个类继承了Proxy,JAVA的继承不允许出现多个父类)。但准确的说这个问题不应该是缺点,因为良好的系统,每一个类都是应该有一个接口的。
关于如何进行AOP开发中的Java动态代理问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。