关于spring aop的cglib代理什么时候才起作用

关于spring aop的cglib代理什么时候才起作用,第1张

cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。cglib封装了asm,可以在运行期动态生成新的class。cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换如何强制使用CGLIB实现AOP? 添加CGLIB库,SPRING_HOME/cglib/jar 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>JDK动态代理和CGLIB字节码生成的区别? JDK动态代理只能对实现了接口的类生成代理,而不能针对类 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成finalJava动态代理和CGLIB代理在其他方面没什么区别,只有在Spring配置文件中配置的区别:<bean id="#" class="orgspringframeworkProxyFactoryBean"><property name="proxyTargetClass"><value>true</value></property></bean><bean id="#" class="orgspringframeworkProxyFactoryBean"><property name="proxyInterfaces"><value>comgcimplTimeBookInterface</value></property></bean>

SaUserDAO userdao=(SaUserDAO)contextgetBean("userDAOProxy");

contextgetBean("userDAOProxy"); 是说从spring环境context中拿出id=userDAOProxy对象再把这个对象强制转换成SaUserDAO

你改成

SaUserDAO userdao=(SaUserDAO)contextgetBean("SaUserDAO");

你把userDAOProxy对象强转成SaUserDAO,这样行不

关键是要明白spring做了什么

你的配置文件sessionFactory有没有进行配置

SPRING就是一个IOC容器,简单来讲我们平常一般是NEW一个对象

有了SPRING后,将对象配置在SPRING后,我们就可以从SPRING的容器里面拿出那些对象了直接用也就是所谓的注入

比如说:你在A类中,要调用B类的方法时,通常是new一个B的实例

用SPRING的话,只用在A中加一个属性 B b;然后在配置文件中将A的属性b进行配置就可以了

<bean id="b" class="B">

<bean id="a" class="wghdbA">

<property name="b">

<ref bean="b" />这里的b就是上面的id=b的那个值

</property>

</bean>

关于SPRING的代理

AOP代理

Spring缺省使用J2SE 动态代理(dynamic proxies)来作为AOP的代理。 这样任何接口(或者接口集)都可以被代理。

Spring也可以使用CGLIB代理 对于需要代理类而不是代理接口的时候CGLIB代理是很有必要的。如果一个业务对象并没有实现一个接口,默认就会使用CGLIB。

简单来讲,你的类没有实现接口就得强制使用CGLIB来代理类实现了接口默认采用JDK的动态代理机制实现AOP

强制使用CGLIB生成代理

1在spring配置文件中加入

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

2 加入CGLIB库

spring/lib/cglib/jar

spring对事务的管理也就是AOP了

推荐你一个不错的视频

我复制一个我学习时用到的配置文件

Spring与hibernate的集成

要控制事务,就得要拿到hibernate的session hibernate的session获得方式:sessionfactorysessionfactory的创建configuration,configuration的获得就由配置文件了Spring整合Hibernate主要是对hibernate的Session进行管理,包含Session的创建、提交、关闭的整个生命周期。此处的session可以看作是一个connection

声明式事务的配置

1配置sessionfactory

2配置事务管理器

3配置事务的传播特性

4配置哪些哪些方法使用事务

<!--配置sessionfactory -->

配置sessionFactory,让spring来创建Session。

<bean id="sessionFactory" class="orgspringframeworkormhibernate3LocalSessionFactoryBean">

<property name=" configLocation ">

<value>classpath:hibernatecfgxml</value>hibernate的配置文件

</property>

</bean>

class="orgspringframeworkormhibernate3LocalSessionFactoryBean"//只适合xml方式

class="orgspringframeworkormhibernate3annotationAnnotationSessionFactoryBean//兼容注解

<!-- 配置事务管理器 -->

把sessionFactory拿过来放到事务管理器里 创建了一个id为transactionManager的事务管理器,它匹配一个session工厂,<ref bean="sessionFactory"/>这个sessionFactory是指session工厂的ID。

<bean

id="transactionManager" class="orgspringframeworkormhibernate3HibernateTransactionManager">

<property name="beanFactory" ref=” sessionFactory”/>

</bean>

<!-- 配置事务的传播特性 -->

这里创建了一个advice(通知),对事务管理器进行事务设置,这里意思是指,对于以save、del、update开头的方法应用事务。

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="add" propagation="REQUIRED"/>

<tx:method name="del" propagation="REQUIRED"/>

<tx:method name="modify" propagation="REQUIRED"/>

<tx:method name="" read-only="true"/>

</tx:attributes>

</tx:advice>

<!-- 配置哪些哪些方法使用事务 -->

配置的作用是把我们上面创建的advice应用到具体的类中。以下代码的意思指,给包comspring下的所有类的所有方法应用allManagerMethod()方法

<aop:config>

<aop:pointcut id="allManagerMethod" expression="execution( comspring())"/>comspring包下所有的类所有的方法

<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>advisor可以理解为一个aspect,一个aspect一般有pointcut,advice

</aop:config>

你学习这个最好弄懂SPRING的原理

IOC,AOP这些概念原理什么的

摘要:在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关,

这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识,

答案是:通过spring aop类里面的AopContext类获取当前类的代理对象,

这样就能切换对应的事务管理器了,具体做法如下:

(1)在applicationContextxml文件中配置如下:

[html] view plain copy

<!-- 开启暴露Aop代理到ThreadLocal支持 -->

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

(2)在需要切换的地方获取代理对象,再调用对应的方法,如下:

[java] view plain copy

((类名) AopContextcurrentProxy())方法();

(3)注意,这里需要被代理对象使用的方法必须是public类型的方法,不然获取不到代理对象,会报下面的错误:

[java] view plain copy

javalangIllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available

开启暴露AOP代理即可

因为开启事务和事务回滚,实际这个过程是aop代理帮忙完成的,当调用一个方法时,它会先检查时候有事务,有则开启事务,

当调用本类的方法是,它并没有将其视为proxy调用,而是方法的直接调用,所以也就没有检查该方法是否含有事务这个过程,

那么本地方法调用的事务也就无效了。

以上就是关于关于spring aop的cglib代理什么时候才起作用全部的内容,包括:关于spring aop的cglib代理什么时候才起作用、Spring AOP CGLib annotation方式,懂的进!!!、如何知道使用的对象是spring的代理类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9801427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存