- 浏览: 1464511 次
- 性别:
- 来自: 青岛人在北京
文章分类
最新评论
-
yhxf_ie:
azheng270 写道 永远是0知道答案了, inser ...
使用MySQL的LAST_INSERT_ID -
yhxf_ie:
insert了还是0... 可能还要设置些什么?
使用MySQL的LAST_INSERT_ID -
一如年少:
123123
Flex使用ribbit.com的服务给手机发送短信SMS -
pointdew:
poincare 写道您好,请教一个问题,如果我的 swf 文 ...
Flex:使用FlexPaper显示PDF文档 -
pointdew:
swf远程加载问题 : flexpaper无法加载http方式 ...
Flex:使用FlexPaper显示PDF文档
CGLIB (Code Generation Library) 是一个动态字节码生成库, 基于ASM, 使用时需要asm.jar。(Groovy也是使用ASM来生成java的字节码)
使用java的java.lang.reflect.Proxy只能针对接口生成代理; 而使用CGLIB则可以针对类生成代理. CGLIB原理是在运行时动态生成一个被代理类的子类。
下面的例子使用CGLIB, 对服务层对象的方法进行拦截,实现一个类似的AOP.
java 代码
- public class ProductService implements ServiceInterface<ProductDTO> {
- public void doDelete(Integer id) {
- productDAO.delete(id);
- }
- public void doSave(ProductDTO dto) {
- productDAO.saveOrUpdate(dto);
- }
- public void doUpdate(ProductDTO dto) {
- productDAO.saveOrUpdate(dto);
- }
- public ProductDTO getObject(Integer id) {
- return productDAO.getProduct(id);
- }
- }
ProductService是一个简单的服务层类, 在ServiceInterface中定义了DAO对象和一些方法。
如果服务层对象有事物方面的需要, 就使用Interceptor来增强. 需要实现 net.sf.cglib.proxy.MethodInterceptor 接口.
java 代码
- public class ServiceMethodInterceptor implements MethodInterceptor {
- private static final Logger logger = Logger.getLogger(ServiceMethodInterceptor.class);
- public Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {
- if (method == null || StringUtils.isBlank(method.getName())) {
- logger.error("Method is null!");
- return null;
- }
- String methodName = method.getName();
- //所有以do开头的方法,使用updateTransaction
- if (methodName.startsWith("do")) {
- return updateTransaction(o, method, args, proxy);
- }
- //所有以get开头的方法,使用queryTransaction
- if (methodName.startsWith("get")) {
- return queryTransaction(o, method, args, proxy);
- }
- return proxy.invokeSuper(o,args);
- }
- private Object queryTransaction(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {
- Object result = null;
- try{
- result = proxy.invokeSuper(o,args);
- } catch (Exception e) {
- logger.fatal(e);
- } finally {
- TransactionBO.endSession();
- }
- return result;
- }
- private Object updateTransaction(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {
- Object result = null;
- try{
- TransactionBO.beginTransaction();
- result = proxy.invokeSuper(o,args);
- TransactionBO.commit();
- } catch (Exception e) {
- TransactionBO.rollback();
- } finally {
- TransactionBO.endSession();
- }
- return result;
- }
- }
java 代码
- public class ServiceFactory {
- public static <T extends ServiceInterface> T getServiceInstance(Class<T> clazz) {
- Enhancer enhancer = new Enhancer();
- enhancer.setSuperclass(clazz);
- enhancer.setCallback(new ServiceMethodInterceptor());
- return (T) enhancer.create();
- }
- }
使用ProductService时,需要由ServiceFactory创建
java 代码
- public static void main(String[] args) {
- ProductService productService = ServiceFactory.getServiceInstance(ProductService.class);
- productService.doSave(...);
- productService.getObject(...);
- }
实际上这里使用的是CGLIB生成的ProductService的子类. Enhancer生成的子类都实现了net.sf.cglib.proxy.Factory接口, 可以通过Factory.getCallbacks()取回MethodInterceptor
参考
http://www.iteye.com/topic/98178
http://www.blogjava.net/calvin/archive/2005/11/28/21741.html
http://www-128.ibm.com/developerworks/cn/java/j-dyn0414/index.html
发表评论
-
实时监控服务器的工具
2011-06-24 10:37 1548http://newrelic.com/ h ... -
设置Tomcat的JAVA_OPTS参数
2011-06-23 14:17 38965修改 TOMCAT/bin/catalina.bat 添加s ... -
PD4ML将Html导出PDF
2011-04-21 22:34 2299http://pd4ml.com/ 可以通过命令行,或 ... -
Google Data Centers List for SEO
2010-08-18 10:00 1768爬取Google的数据,有时被Block,可以让程序随机跳换I ... -
Google AuthenticationException: 403: Invalid AuthSub token
2010-08-06 23:04 2455给客户的网站做了Google Authentication认证 ... -
JavaMail配置SSL服务器及安装证书
2010-02-26 17:40 25457客户给的邮件服务器要SSL,使用Spring的JavaMail ... -
使用apache-cxf-2.2.5生成WebService客户端时List属性没有Setter方法
2010-01-25 14:14 7460用apache-cxf-2.2.5来生成Google Adwo ... -
使用Gson将Java对象转换为JSON
2009-12-17 19:55 32194Gson是Google的一个开源项目,可以将Java对象转换成 ... -
从Quartz数据库中删除cron trigger
2009-09-22 12:24 3625要删除quartz的cron类型的trigger,从qrtz_ ... -
解决Spring中使用quartz发生NotSerializableException methodInvoker的问题
2009-09-15 21:52 18150Spring2.5 + quartz1.6.5 发生如下异常 ... -
Hibernate的HQL中使用left join
2009-09-02 12:50 8039业务为: 消费者 - 订单 - 所购产品 - 产品评论 ... -
htmlparser在分析RemarkNode注释时的bug
2009-07-29 22:44 2937在使用 htmlparser1.6 分析一段Html时发现 ... -
Java查询获取Google PageRank
2009-06-19 11:44 3646Java代码如下 import java.net.UR ... -
Eclipse快捷键
2009-06-12 15:49 1380Eclipse 快捷键 Ctrl + Shift + ... -
使用TCPMonitor监控WebService SOAP消息
2009-05-11 16:13 10220使用Apache axis的TCPMonitor可以监控Web ... -
在EJB3的WebService方法中获取HttpServletRequest对象
2009-04-16 17:18 3366在EJB3写的WebService中获取HttpServlet ... -
修改server.xml文件从外网访问JBoss
2009-04-15 21:55 6502从外网访问JBoss,可以加启动参数 run -b 0.0.0 ... -
通过IP访问JBoss失败的问题
2008-10-29 16:04 2124用WTP启动JBoss,通过IP访问JBoss Server ... -
禁用Eclipse的Subclipse插件
2008-09-05 12:06 4535要禁用Eclipse的Subclipse插件 Help - ... -
POJO加Annotation做validation验证
2008-08-27 12:22 2156写了一个POJO + Annotation来做validati ...
相关推荐
开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4开发工具 cglib-3.2.4...
赠送jar包:cglib-nodep-3.2.4.jar; 赠送原API文档:cglib-nodep-3.2.4-javadoc.jar; 赠送源代码:cglib-nodep-3.2.4-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.2.4.pom; 包含翻译后的API文档:cglib-...
CGLIB-nodep-2.2.jar是CGLIB的一个无依赖版本,"nodep"即"no dependency"的缩写,意味着这个版本的CGLIB不包含任何外部依赖,只包含了CGLIB自身的核心功能。这对于那些希望减少项目依赖和减小应用体积的开发者来说...
在这个问题中,我们遇到了两个关键的jar包:`spring-cglib-repack-3.2.0.jar`和`spring-objenesis-repack-2.1.jar`。这两个jar包对于理解Spring框架的工作原理以及它们在实际应用中的作用至关重要。 首先,`spring-...
JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源代码 cglib-2.1.3JavaEE源...
"spring-cglib-repack-3.2.5.jar"、"spring-objenesis-repack-2.6.jar"和"spring-objenesis-repack-2.5.1.jar"这三个文件是Spring源码阅读环境中常用的依赖包,它们各自承担着不同的功能。 首先,我们来看"CGLIB"...
cglib-nodep-2.2.3.jar cglig 库文件
赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...
赠送jar包:cglib-nodep-3.1.jar; 赠送原API文档:cglib-nodep-3.1-javadoc.jar; 赠送源代码:cglib-nodep-3.1-sources.jar; 赠送Maven依赖信息文件:cglib-nodep-3.1.pom; 包含翻译后的API文档:cglib-nodep-...
`spring-cglib-repack-3.2.4.jar`包含了CGLIB(Code Generation Library)库的重新打包版本。CGLIB是一个强大的高性能的代码生成库,它在许多AOP框架中被用到,包括Spring。当Spring框架在进行AOP代理时,如果目标类...
在这里,我们有两个版本,即cglib-full-2.0和cglib-full-2.0.2。通常,更新的版本修复了旧版本中的bug,可能提供了新的特性和性能优化。从2.0到2.0.2,可能会包含一些稳定性改进和兼容性调整。 5. **使用步骤** -...
cglib-full-2.0.2.jar cglib-full-2.0.2.jar cglib-full-2.0.2.jar
JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1JavaEE源代码 cglib-2.2_beta1...
`cglib-nodep-2.2.jar` 和 `cglib-2.2.0.jar` 是CGLib的两个不同版本。`nodep` 在这里表示 "no dependencies",即无依赖版,意味着这个版本的CGLib不包含对其他库的依赖,开发者需要自行引入必要的依赖。而`cglib-...
在给定的标题和描述中,提到了两个关键的jar包:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个文件对于理解Spring框架的内部机制以及如何在IDEA中构建Spring源码至关重要。 首先...
CGlib-nodep-2.1_3.jar 是一个与Java编程相关的库,主要用来扩展Java反射功能,特别是在处理面向切面编程(AOP)时。它是一个无依赖(nodep)版本,意味着它包含了所有必需的类,无需额外导入其他库,如ASM库。这个...
在提供的文件中,我们看到了两个与Spring相关的库:`spring-cglib-repack-3.2.6.jar` 和 `spring-objenesis-repack-2.6.jar`。这两个库都是Spring框架的重要组成部分,用于解决特定的编程问题。 首先,让我们来了解...
hibernate-cglib-repack-2.1_3.jar
首先,"spring-cglib-repack-3.1.jar"是一个针对CGLIB(Code Generation Library)的打包版本,用于在运行时动态创建Java类的子类。CGLIB是一个强大的代码生成库,常被用作Java代理机制,尤其在Spring AOP(面向切面...
然而,有时候在导入Spring项目时,可能会遇到一些问题,例如标题中提到的"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个jar包的缺失。这些jar包对于Spring框架的正常运行至关重要,因为...