CGLib用法详解

CGLib用法详解,第1张

statement:本篇内容只是建立在我目前经验的基础之上,必然有不完善甚至是不正确的地方,请谨慎阅读,如果能指出错误与不足之处,更是不甚感激

附:本篇内容旨在基本探究一下CGLib提供了哪些功能,并提供基础示例和使用方法,本文主要内容来自于Rafael Winterhalter的文章《CGLib: The Missing Manual》,并在此基础上进行一些添加与修正。本篇内容将可能会被多次更新(如果有更深的理解,或者是需要添加的说明之处)

CGLib是一个基于ASM字节码 *** 纵框架之上的类生成工具,相比于底层的ASM,CGLib不需要你理解那么多必需的和字节码相关底层知识,你可以很轻松的就在运行时动态生成一个类或者一个接口。CGLib广泛应用于AOP方面和代理方面,比如Spring、Hibernate,甚至也可以用于Mock测试方面。

CGLib有些地方需要提前引起注意,至于原因为何,我将会在最后一节说明。

参考文档:

[1] CGLib: The Missing Manual

[2] https://github.com/cglib/cglib/wiki/How-To

cglib用来继承类或实现接口以产生对象。

源自cglib官网http://cglib.sourceforge.net/的summary。

hibernate用到了注解技术,它是从元数据如何在早期java版本中使用属性文件的原理逐渐发展为今日的注解。

处理注解的三种方式:生成器、字节码转换、运行时反射。

字节码转换:注解处理器对带有注解的类字节码文件进行解析,对其做一些适当的修改,再重新编译并生成新的对象,也能生成其他类型文件(如xml)。字节码转换器在编译期(离线状态)、装载期都能运行,还能在运行时动态转换,且在字节码文件或runtime这样的保持策略下也可运行。

利用cglib产生新对象会提高字节码转换的效率,二者有一定的依存关系。

我也是查了有关资料,仅能说到这个程度了,再细想想我也不懂了,呵呵。至于hibernate的工作原理,网上好多啦,我就不ctrl + v了。

SaUserDAO userdao=(SaUserDAO)context.getBean("userDAOProxy")

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

你改成

SaUserDAO userdao=(SaUserDAO)context.getBean("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="wgh.db.A">

<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获得方式:sessionfactory.sessionfactory的创建configuration,configuration的获得就由配置文件了.Spring整合Hibernate主要是对hibernate的Session进行管理,包含Session的创建、提交、关闭的整个生命周期。此处的session可以看作是一个connection.

声明式事务的配置

1配置sessionfactory

2配置事务管理器

3配置事务的传播特性

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

<!--配置sessionfactory -->

配置sessionFactory,让spring来创建Session。

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name=" configLocation ">

<value>classpath:hibernate.cfg.xml</value>hibernate的配置文件

</property>

</bean>

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"//只适合xml方式

class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean//兼容注解

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

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

<bean

id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<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应用到具体的类中。以下代码的意思指,给包com.spring下的所有类的所有方法应用allManagerMethod()方法.

<aop:config>

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

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

</aop:config>

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

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


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

原文地址: http://outofmemory.cn/bake/11607891.html

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

发表评论

登录后才能评论

评论列表(0条)

保存