知识点

相关文章

更多

最近更新

更多

【第六章】 AOP 之 6.9 代理机制 ——跟我学spring3

2019-03-01 13:58|来源: 开涛

Spring AOP通过代理模式实现,目前支持两种代理:JDK动态代理、CGLIB代理来创建AOP代理,Spring建议优先使用JDK动态代理。

  • JDK动态代理:使用java.lang.reflect.Proxy动态代理实现,即提取目标对象的接口,然后对接口创建AOP代理。

  • CGLIB代理:CGLIB代理不仅能进行接口代理,也能进行类代理,CGLIB代理需要注意以下问题:

      不能通知final方法,因为final方法不能被覆盖(CGLIB通过生成子类来创建代理)。

      会产生两次构造器调用,第一次是目标类的构造器调用,第二次是CGLIB生成的代理类的构造器调用。如果需要CGLIB代理方法,请确保两次构造器调用不影响应用。

Spring AOP默认首先使用JDK动态代理来代理目标对象,如果目标对象没有实现任何接口将使用CGLIB代理,如果需要强制使用CGLIB代理,请使用如下方式指定:

对于Schema风格配置切面使用如下方式来指定使用CGLIB代理:

<aop:config proxy-target-class="true"></aop:config>

而如果使用@AspectJ风格使用如下方式来指定使用CGLIB代理:

<aop:aspectj-autoproxy proxy-target-class="true"/>


本文链接:领悟书生教程网,转自http://sishuok.com/forum/blogPost/list/2476.html

相关问答

更多
  • SPRING是通过动态代理来实现AOP的,SPRING内部提供了2种实现机制1.如果是有接口声明的类进行AOP,spring调用的是java.lang.reflection.Proxy类来做处理 org.springframework.aop.framework.JdkDynamicAopProxy public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled()) { Class targetClass = this ...
  • 采用JAVA 动态代理设计模式设计的,目前主要应用于 事务,有了 Spring的 声明式事务可以 对程序员编码的代码量减少很多,不用每层的持久化方法都自己控制事务
  • AOP技术就是建立在动态代理的基础上,楼上的说的很对,我也是看马士兵视频自学的,不过需要一定的基础才能看得懂,不然你看了估计也很迷惑,你可以先用着jdk里面的动态代理proxy,等你用熟了在去了解里面的构架,这样感觉会对你的理解会好很多
  • this(AType)意味着this instanceof AType为真的所有连接点。 所以这意味着在你的情况下,一旦呼叫达到AccountService的任何方法, this instanceof AccountService将是真实的。 target(AType)意味着所有的连接点,其中的anObject instanceof AType 。 如果您在对象上调用方法,并且该对象是AccountService的实例,那将是有效的连接点。 总结一种不同的方式 - this(AType)来自接收者的角度, ...
  • 我可以给你两个例子,我们用它: 在JMX中自动注册对象进行远程管理。 如果一个类用@AutoRegister注解注释,我们有一个方面来@AutoRegister该类的新实例,并自动将其注册到JMX中。 审核记录(黄金标准AOP用例)。 它有点粗糙,但一般的方法是注释代表一些可审计的行动的方法。 结合像Spring Security这样的东西,我们可以得到一个很好的想法: 用户是谁 他们调用什么方法 他们提供什么数据 什么时候调用该方法 调用是否成功(即如果抛出异常) I can give you two e ...
  • 代理本质上是客户和对象之间的中介,以便它实现对象的非最终方法。 代理接口相对简单,因为接口只是需要实现的方法列表,方便拦截方法调用。 Java中的Proxy类是一个实现在运行时指定的接口列表的类。 代理然后有一个与它关联的InvocationHandler ,它将代理上的方法调用委托给被代理的对象。 它充当一种间接的级别,这样方法不会在对象本身而是在其代理上被调用。 InvocationHandler只有一个方法需要实现: public Object invoke(Object proxy, Method ...
  • 简单地说,代理对象有两种方式: dynamic:您创建一个新对象,该对象实现与目标对象相同的接口,并使用代理逻辑将此最后封装 static:编译目标类时,将aspect逻辑直接添加到已编译的类中(cglib方式) 动态代理只能应用于实现接口的对象,并且只有在使用接口引用实例时才会使用(这里建议使用),而静态代理可以应用于所有内容 遵循弹簧指南将允许您使用任何方法(您可以使用弹簧配置简单地切换)而不是耦合到cglib。 注意,除了静态代理允许代理逻辑应用,即使从同一个类中的另一个方法调用代理方法,而使用动态代 ...
  • 因此,在我花时间分析问题之后,似乎不是Roo本身从classpath中删除了aspectj jars而是在versin 2.7中删除了eclipse-Plugin(这是由command> roo项目引起的)。 我不知道这是一个错误还是一个功能,但创建一个带有该插件的eclipse项目删除了这个jar。 切换到2.8解决了问题。 所以作为回答: - >使用进一步的运行时编织 - >魔术发生在eclipse-plugin中 So, after I took the time to analyze the pro ...
  • 我认为没有一种简单的方法可以做到这一点。 我看到两个选择: 扩展SecuredAnnotationSecurityMetadataSource并覆盖findAttributes()方法。 然后禁用SecuredAnnotationSecurityMetadataSource secured-annotation并使用metadata-source-ref属性启用您自己的SecuredAnnotationSecurityMetadataSource 。 (更简单但仅适用于弹簧安全) 其他(更通用)方法是覆盖A ...
  • 最后,经过一天的不同尝试,我认为我解决了它。 在我整合AOP的测试中,我使用了一个教程,它定义了一个过于通用的切入点(正则表达式,如。*),这意味着我的托管bean的所有方法都是候选者被代理,包括来自Spring-security和boum :-( 定义更具体的切入点(基本上基于包名称)可以避免启动应用程序时出错。 这是一个愚蠢的错误,但也许这个答案将有助于其他人。 Finally, after one day of different attempts, I think that I solved it. ...