| « | November 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | | 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 | 27 | 28 | 29 | 30 | | | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
| Blog信息 |
|
blog名称:邢红瑞的blog 日志总数:523 评论数量:1142 留言数量:0 访问次数:9737539 建立时间:2004年12月20日 |

| |
|
[java语言]深入浅出 spring AOP (七) 网上资源, 软件技术
邢红瑞 发表于 2006/1/15 18:18:28 |
| 与ajoo聊天时,提到BeanNameAutoProxyCreator,使用BeanNameAutoProxyCreator必须使用接口,不是类。否则出现org.springframework.beans.TypeMismatchException。使用BeanNameAutoProxyCreator 进行事务控制<bean id="transactionAutoProxyCreator" class="org.springframework.aop.framework.autoproxy .BeanNameAutoProxyCreator"><property name="interceptorNames"><list><value>transactionInterceptor</value></list></property><property name="beanNames"><list><value>trans*</value></list></property></bean>当代理被创建时,如果target class没有实现接口,autoproxy framework直接使用ProxyFactoryBean动态产生代理对象。
编程方式使用ProxyFactory代理一个类时,CGLIB会生成一个新类。CGLIB会保持一个生成类的cache,因此它不会一直生成新类。spring使用ProxyCallbackFilter对象把其它对象放进map进行管理。如果没有管理好cache,将会产生大量的java对象,直至出现OutOfMemoryErrors。因此使用spring的aop时,一定要正确实现equals and hashCode。确保advisors使用相同的实例,因为一些advisors没有实现equals or hashCode。详见 org.springframework.aop.framework.Cglib2AopProxy的ProxyCallbackFilter内部类的equals方法 public boolean equals(Object other) { if (other == null) { return false; } if (other == this) { return true; }
ProxyCallbackFilter otherCallbackFilter = null; if (other instanceof ProxyCallbackFilter) { otherCallbackFilter = (ProxyCallbackFilter) other; } else { // not a valid comparison return false; }
if (this.advised.isFrozen() != otherCallbackFilter.advised.isFrozen()) { return false; }
if (this.advised.isExposeProxy() != otherCallbackFilter.advised.isExposeProxy()) { return false; }
if (this.advised.getTargetSource().isStatic() != otherCallbackFilter.advised.getTargetSource().isStatic()) { return false; }
return (AopProxyUtils.equalsProxiedInterfaces(this.advised, otherCallbackFilter.advised) && AopProxyUtils.equalsAdvisors(advised, otherCallbackFilter.advised)); }
|
|
|