- 浏览: 557418 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (340)
- Spring (4)
- Hibernate (2)
- Linux (34)
- Oracle (145)
- Eclipse (1)
- UML (1)
- HTML&&JAVASCRIPT (11)
- JAVA (33)
- 设计模式 (1)
- 版本控制 (1)
- wrap框架 (3)
- IBATIS (5)
- Ruby (1)
- DWR (1)
- MINA (11)
- JBPM (2)
- 缓存技术 (4)
- 网络 (3)
- 应用服务器 (1)
- GWT (5)
- 杂谈 (2)
- ICE (4)
- XML (2)
- ArcGis (2)
- Flex (8)
- junit单元测试 (1)
- SNMP (1)
- 存储 (1)
- office (1)
- MongoDB (0)
- Greenplum (3)
- 管理点滴 (1)
- C++ (6)
- 网络入门 (3)
- Tomcat (7)
- JMX (0)
- webservice (1)
- Oracle的10046事件 (1)
- Library cache内部机制详解 (1)
- expdp通过dblink来导入 (1)
最新评论
-
yuanliangding:
有没有关于mock的更多知识。
基于mock对象和JUnit框架简化Spring Web组件单元测试 -
saup007:
ssh端口不是22,怎么搞呢?
Greenplum 学习笔记 -
springmvc-freemarker:
java开源项目源码实例下载
Apache上全部JAVA开源项目简介 -
bobbell:
哇塞,你真厉害,整理的非常全面。我是一个java barcod ...
Greenplum 学习笔记 -
wsj55133245513324:
这不是bug,你将日志级别从debug提升到INFO 就好了 ...
Spring,smppapi,apache mina, ssl快速实现安全的smpp(5)
/*
*auth: lanmh
*/
/**
* 基于CGLib(面向Class)的AOP的简单实现.
*/
import java.lang.reflect.*;
import java.util.*;
import net.sf.cglib.proxy.*;
import org.apache.commons.logging.Log;
public abstract class AOPBaseClass
implements MethodInterceptor
{
private static Log logger = org.apache.commons.logging.LogFactory.getLog(
AOPBaseClass.class);
/**用于动态产生被代理类的子类*/
private Enhancer enhancer = new net.sf.cglib.proxy.Enhancer();
/**存放所有的拦截器**/
protected List interceptors = new ArrayList();
/**要拦截方法的名称集合*/
protected List interMethodNames = new ArrayList();
public AOPBaseClass()
{
initInterceptors(); //初始化拦截器
initInterMethodNames(); //初始化拦截方法名称集合
}
/***
* 初始化拦截器
*/
protected abstract void initInterceptors();
/**
* 初始化拦截的方法的名称集合
*/
protected abstract void initInterMethodNames();
/**
*动态产生被代理类的子类的实例..
* @param clz Class被代理类的Class
* @return Object 返回被代理类的子类的实例
*/
public Object bind(Class clz)
{
enhancer.setSuperclass(clz); //设置超类
enhancer.setCallback(this); //设置回调
Object obj = enhancer.create(); //生成被代理类的子类实例
return obj;
}
/**
*对被代理的类的方法进行拦截
* @param proxy Object 动态生成的被代理类的子类
* @param method Method 被代理类被拦截的方法
* @param methodParameters Object[] 被代理类被拦截的方法的参数列表
* @param methodProxy MethodProxy 动态生成的被代理类的子类的方法
* @throws Throwable
* @return Object 返回被代理类被拦截的方法执行的结果
*/
public Object intercept(Object proxy, Method method,
Object[] methodParameters, MethodProxy methodProxy)
throws Throwable
{
Object result = null;
InvocationInfo invInfo = null;
Throwable ex = null;
String methodName = method.getName();
invInfo = new InvocationInfo(proxy,
method,
methodParameters,
methodProxy,
result,
ex);
if (interMethodNames.contains(methodName)) //如果调用的方法名称存在于拦截方法的名称集合
{
try
{
//调用 Before Intercetpors
invokeInterceptorsBefore(invInfo);
result = methodProxy.invokeSuper(proxy, methodParameters);
//调用 After Intercetpors
invInfo.setResult(result);
invokeInterceptorsAfter(invInfo);
}
catch (Throwable tr)
{
//调用 Exception Intercetpors
invInfo.setException(tr);
invokeInterceptorsExceptionThrow(invInfo);
throw tr;
}
finally
{
//调用last Intercetpors
invokeInterceptorsLast(invInfo);
}
}
else //否则如果调用的方法名称存在于拦截方法的名称集合
{
//直接调用被代理类的方法
result = methodProxy.invokeSuper(proxy, methodParameters);
}
return result;
}
/**
* 调用Before Interceptor
* @param invInfo InvocationInfo
*/
private void invokeInterceptorsBefore(InvocationInfo invInfo) throws EduException
{
//递增循环调用所有拦截器(interceptors)的before方法;
for (int i = 0; i < interceptors.size(); i++)
{
Interceptor brt = (Interceptor) interceptors.get(i);
brt.before(invInfo);
}
}
/**
* 调用After Interceptor
* @param invInfo InvocationInfo
*/
private void invokeInterceptorsAfter(InvocationInfo invInfo)throws EduException
{
//递减循环调用所有拦截器(interceptors)的After方法;
for (int i = interceptors.size() - 1; i >= 0; i--)
{
Interceptor brt = (Interceptor) interceptors.get(i);
brt.after(invInfo);
}
}
/**
* 调用Last Interceptor
* @param invInfo InvocationInfo
*/
private void invokeInterceptorsLast(InvocationInfo invInfo)throws EduException
{
//递减循环调用所有拦截器(interceptors)的After方法;
for (int i = interceptors.size() - 1; i >= 0; i--)
{
Interceptor brt = (Interceptor) interceptors.get(i);
brt.last(invInfo);
}
}
/**
* 调用exceptionThrow Interceptor
* @param invInfo InvocationInfo
*/
private void invokeInterceptorsExceptionThrow(InvocationInfo invInfo)throws EduException
{
//递减循环调用所有拦截器(interceptors)的exceptionThrow方法;
for (int i = interceptors.size() - 1; i >= 0; i--)
{
Interceptor brt = (Interceptor) interceptors.get(i);
brt.exceptionThrow(invInfo);
}
}
}
发表评论
-
Apache上全部JAVA开源项目简介
2011-05-12 17:16 1915最近接触Jakarta-Common-BeanU ... -
主题:JAVA NIO 简介
2011-04-15 11:48 9811. 基本 概念 IO 是主存和外部设备 ( 硬盘、终端和 ... -
JNDI在Java EE中的应用
2011-04-01 15:52 1057一、JNDI在Java EE中的应用JNDI技术是Java E ... -
Spring使用Quartz调度器 实现时间点任务(Spring in Action中文版)
2011-03-10 14:08 9977.3.2 使用Quartz调度器 Quartz调度器为调度 ... -
一个分页控件,适合大数据量。可以替换ext的分页控件
2010-11-08 15:44 1116<!doctype html public " ... -
Java的java.nio.Buffer缓冲区基础
2010-10-30 11:02 734缓冲区基础 抽象类Buffer是java.nio包支持缓 ... -
NIO ByteBuffer使用方法
2010-10-30 10:48 1249缓冲区分配和包装 在能够读和写之前,必须有一个缓冲区,用静态方 ... -
What is a Java Thread and How does it work?
2010-10-21 14:27 1017A java thread is an execution c ... -
将标准的java程序封装为Windows下面的服务
2010-10-19 14:02 13261、首先到请下载最新版本的Java Service Wra ... -
HASH表原理
2010-09-19 16:43 874今天由于天气不好 ... -
使用Apache CXF创建Web Service
2009-12-30 09:30 917官方主页:http://cxf.apache.org/ ... -
java.io.File中的绝对路径和相对路径.
2009-11-12 11:26 4990File类是用来构造文件或文件夹的类,在其构造函数中要求传 ... -
JavaScript极速狂飙:大容量字符型数组的快速检索
2009-06-19 20:19 1099JavaScript 在大容量数组 ... -
谈谈JavaScript中的数组、集合及效率
2009-06-19 20:15 1143数组是JavaScript提供的一个内部对象,它是一个标准的集 ... -
log4jxml配置
2009-05-19 14:45 1119<?xml version="1.0 ... -
log4j日志配置
2009-05-19 11:54 931关键字: apache log4j 1、配置根Logg ... -
bat语法的用法
2009-05-15 14:13 1481首先,批处理文件是 ... -
JUnit学习笔记
2009-05-15 10:15 1442这是我在学习的过程中整理记录下来的,其中参考了网上许多文章 ... -
接口和抽象类的区别
2009-04-30 15:15 1412区别一,两者表达的概念不一样。抽象类是一类事物的高 ... -
如何Gwt中使用Session
2008-12-30 13:54 3170在GWT中可以直接使用session信息,只需要用r ...
相关推荐
CGlib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中都有广泛应用,如Spring AOP和dynaop。CGlib是由Evan Schooler创建并维护的,它是一个Java字节码操纵...
CGLib,全称Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛使用,特别是在动态代理和AOP(面向切面编程)领域。这个库允许开发者在运行时动态创建类或者增强已有类的功能。在本篇...
Spring AOP通过spring-aop.jar实现了面向切面编程的强大功能,简化了代码结构,提高了代码复用性。理解和熟练运用Spring AOP,能够使我们的应用程序更加灵活、可维护。无论是日志记录、事务管理还是其他关注点,都...
在Java世界中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种设计模式,它允许程序员定义“切面”,这些切面可以插入到应用程序的多个点,以实现跨切面关注点的模块化,如日志、事务管理、性能度量等...
JavaEE CGLIB字节码增强技术是实现面向切面编程(AOP)的一种常见方法。在JavaEE应用中,AOP允许开发者定义“切面”,这些切面封装了跨越多个对象的横切关注点,如日志、事务管理等。CGLIB(Code Generation Library...
Spring AOP,全称Aspect Oriented Programming,即面向切面编程,是Spring框架的一个重要特性,用于实现横切关注点的模块化。AOP通过在运行时动态地将代码编织到一起,使得我们可以在不修改原有业务代码的情况下,对...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它为开发者提供了声明式事务管理、日志记录、性能监控等跨切面的关注点。在Spring 3.2.0.RELEASE版本中,AOP功能进一步完善,...
在Spring AOP(面向切面编程)中,CGLIB是一个重要的动态代理库,它用于在运行时创建子类以实现对目标对象的代理。CGLIB是针对那些不支持接口代理(例如Java中的final类)的情况而设计的。下面我们将深入探讨Spring ...
静态代理--不适合企业开发,适合初学者理解代理。... 3.cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。 spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
CGlib是一个强大的高性能的代码生成包,它被许多AOP(面向切面编程)框架如Spring AOP和dynaop所使用,以提供方法拦截功能。CGlib不依赖于任何其他库,但自身可以与ASM库结合使用,以实现更底层的字节码操作。 ASM是...
这个库被广泛用于实现AOP(面向切面编程)中的代理机制,特别是当无法通过接口代理时,例如Java标准库中的类。Cglib是Eclipse的Dynamic Proxies的一个补充,它在某些情况下提供了更高的性能。 Cglib的核心是基于ASM...
基于代理的AOP实现主要涉及到两种代理方式:JDK动态代理和CGLIB代理。Spring会根据目标对象是否实现了接口来选择合适的代理方式。 - **JDK动态代理**:如果目标对象实现了至少一个接口,Spring会选择JDK动态代理。...
它广泛用于许多AOP(面向切面编程)框架,如Spring AOP和dynaop,作为JDK动态代理的替代品,当目标类不支持接口时,CGLib能发挥重要作用。 3. CGLib工作原理 CGLib通过继承的方式创建代理对象。它会生成一个目标类的...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从核心业务逻辑中分离出来,例如日志记录、事务管理等。在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB...
本文将深入探讨如何基于AOP(面向切面编程)来实现Spring的事务管理,特别是通过TransactionProxyFactoryBean。让我们一起探索这个主题。 首先,了解什么是AOP。AOP是Spring框架的核心特性,它允许我们在不修改业务...
CGLIB通过字节码操作实现其功能,它可以创建新类而不必直接访问Java反射API,这使得它在性能上比基于接口的Java动态代理更优。 CGLib的工作原理是:当程序调用一个被CGLib代理的方法时,CGLIB会生成一个新的子类,...
Spring的面向切面编程(Aspect-Oriented Programming,简称AOP)功能允许开发者将关注点分离,如日志、事务管理等,从核心业务逻辑中抽离出来,实现代码的模块化和可重用性。本知识点主要围绕"AOP基于注解配置"展开...
CGlib不仅在AOP(面向切面编程)领域有广泛应用,如Spring AOP框架就使用了CGlib来实现针对无接口类的代理,还常用于性能优化、测试模拟对象等方面。在"cglib-2.2-license.txt"文件中,可能包含了关于CGlib 2.2.0...
Spring AOP,即Spring的面向切面编程,是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强或统一处理的方法。本文将围绕Spring AOP的源码分析,探讨其核心概念、工作原理以及在...
在基于框架的Web开发中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种重要的设计模式,它允许开发者将关注点分离,比如日志、事务管理等,从核心业务逻辑中抽离出来。当注解方式无法使用时,我们...