- 浏览: 342665 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
alafqq:
很好的一篇启蒙hashmap的文章;HASHTABLE的93行 ...
使用数组和链表实现hash表存储信息 -
小帅1127:
我擦,我还以为有什么大坑呢,这也写出来。。。
if..else if和if..if的区别 -
fncj:
转下http://www.dodoer.com
hadoop单机版搭建图文详解 -
yueshang520:
Spring注解原理的详细剖析与实现 -
fncj:
转下,谢谢http://www.whohelpme.com/b ...
Spring注解原理的详细剖析与实现
第三方创建代理对象的框架cglib,目标类可以不实现接口
cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制
可以生成目标类的子类,并重写父类非final修饰符的方法
CGLib:http://www.blogjava.net/stone2083/archive/2008/03/16/186615.html
1、 创建被拦截对象,该对象没有实现接口:
package com.wxy.service.impl; public class CopyOfPeopleServiceBean { private String user = null; public CopyOfPeopleServiceBean() { } public CopyOfPeopleServiceBean(String user) { this.setUser(user); } public String getPeopleName(Integer peopleId) { System.out.println("我是getPeopleName()方法"); return "wxy"; } public void save(String name) { System.out.println("我是save()方法,save:" + name); } public void update(String name, Integer peopleId) { System.out.println("我是update()方法"); } /** * @param user the user to set */ public void setUser(String user) { this.user = user; } /** * @return the user */ public String getUser() { return user; } }
2、 编写cglib代理工厂,实现代理功能:
package com.wxy.aop; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import com.wxy.service.impl.CopyOfPeopleServiceBean; /** * 创建代理对象 * * @create-time 2011-8-19 上午09:07:53 * @revision $Id */ public class CGlibProxyFactory implements MethodInterceptor { private Object targetObject; //代理的目标对象 public Object createProxyIntance(Object targetObject) { this.targetObject = targetObject; Enhancer enhancer = new Enhancer();//该类用于生成代理对象 enhancer.setSuperclass(this.targetObject.getClass());//将目标类设置为代理对象的父类,可以覆盖所有非final方法进行覆盖 enhancer.setCallback(this);//设置回调用对象为本身 return enhancer.create(); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { CopyOfPeopleServiceBean bean = (CopyOfPeopleServiceBean) this.targetObject; Object result = null;//环绕通知 if (bean.getUser() != null) { //.....advice()-->前置通知 try { result = methodProxy.invoke(targetObject, args); //.....afteradvice()-->后置通知 } catch (RuntimeException e) { //.....exceptionadvice()-->例外通知 } finally { //.....finallyadvice()-->最终通知 } } return result; } }
3、 测试:
public class AOPTest { public static void main(String[] args) { /* JDKProxyFactory factory = new JDKProxyFactory(); PeopleService service = (PeopleService) factory.createProxyInstance(new PeopleServiceBean( "wxy")); service.save("wxy");*/ CGlibProxyFactory factory = new CGlibProxyFactory(); CopyOfPeopleServiceBean service = (CopyOfPeopleServiceBean) factory .createProxyIntance(new CopyOfPeopleServiceBean("wxy")); service.save("cglib-wxy"); CopyOfPeopleServiceBean service1 = (CopyOfPeopleServiceBean) factory .createProxyIntance(new CopyOfPeopleServiceBean());//没有权限 service1.save("cglib-wxy"); } }
4、 结果:
public class AOPTest { public static void main(String[] args) { /* JDKProxyFactory factory = new JDKProxyFactory(); PeopleService service = (PeopleService) factory.createProxyInstance(new PeopleServiceBean( "wxy")); service.save("wxy");*/ CGlibProxyFactory factory = new CGlibProxyFactory(); CopyOfPeopleServiceBean service = (CopyOfPeopleServiceBean) factory .createProxyIntance(new CopyOfPeopleServiceBean("wxy")); service.save("cglib-wxy"); CopyOfPeopleServiceBean service1 = (CopyOfPeopleServiceBean) factory .createProxyIntance(new CopyOfPeopleServiceBean());//没有权限 service1.save("cglib-wxy"); } }
一些AOP概念:
Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。
joinpoint(连接点):指那些被拦截到得点,在spring中,这些点是指方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器。
Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。
Advice(通知):所谓通知是指拦截到joinpoint之后要做的事情就是通知:异常通知、前置通知、后置通知、环绕通知、最终通知。
Target(目标):代理的目标对象
Weave(织入):把将aspect应用到target对象并导致proxy对象创建的过程称为织入。
Introduction(引入):在不修改类代码的前提下,Introduction可以运行为类动态的添加一些方法或者Field
http://blog.csdn.net/iamtheevil/article/details/6700495
发表评论
-
编码实现用JDK中的Proxy实现springAOP功能
2011-08-18 15:04 791http://blog.csdn.net/iamtheevil ... -
Spring注解原理的详细剖析与实现
2011-08-14 23:09 84349本文主要分为三部分: ... -
Spring装配基本属性的原理分析与代码实现
2011-08-11 15:37 1479首先,做一个配置属性的基本测试。修改beans.xml,使引用 ... -
编码剖析Spring依赖注入的原理
2011-08-10 20:01 1866一、注入依赖对象 基本类型对象注入: <b ... -
Spring的三种实例化Bean的方法
2011-08-10 14:03 1Spring的三种实例化Bean的方法 1、 使用 ... -
Spring管理bean的原理自定义实现
2011-08-10 10:44 62431、Spring通过BeanDefinition管理基于S ... -
spring环境搭建与测试
2011-08-10 08:40 3471Chapter1、搭建与测试spring的环境 1、 ... -
java回调机制实现
2011-08-08 09:06 2106Java的接口支持提供了一种获得回调的等价功能的 ... -
log4j的使用与详细分析
2011-08-05 13:32 2690一、什么是log4j? http://logging.a ... -
log4j使用详解
2011-08-04 23:05 2http://logging.apache.org/log4j ... -
spring入门及Demo
2011-07-29 16:01 0一、Spring是什么? Spring是一个开源框架,它 ... -
ibatis入门及环境搭建
2011-07-23 12:27 1468使用ibatis的理由: 1. 知道怎样操作10种以上 ... -
山寨Hibernate
2011-04-09 23:32 0---------------------------- ... -
首次配置hibernate碰到的各种问题
2011-03-15 21:18 15381、java.lang.NoClassDefFoundErro ... -
div内页面背景图片无法显示解决方法
2011-03-14 21:12 1385用photoshop打开背景图片,在“图像”菜单下将“模式 ... -
web开发之感悟篇
2011-02-27 19:10 1609学而不思则罔,思而不学则殆。 出处:《论语·为政 ... -
CSS学习笔记(1)
2011-02-19 23:35 1256一、CSS基本语法 1、 所有css样式申明都是大小写无关 ... -
web学习记录(一些问题的解决方案)
2011-02-16 11:51 12671、eclipse中the import javax.serv ... -
JSP工作原理浅析
2011-01-19 02:04 1404jsp第一次被请求时,jsp引擎把该jsp文件转换成 ... -
servlet学习笔记
2011-01-19 01:13 10181、servlet和jsp有什么区别? ...
相关推荐
Spring AOP实现方法之一:CGLIB 实现AOP功能
本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...
在本篇Spring学习笔记中,我们将探讨如何使用CGLIB库来实现AOP功能。 CGLIB(Code Generation Library)是一个强大的高性能的代码生成库,它被广泛用于动态代理和运行时织入AOP切面。在Spring中,如果目标类没有...
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.net.sf.cglib-2.2.0.jar
aop的jar包: com.springsource.net.sf.cglib-2.2.0.jar com.springsource.org.aopalliance-1.0.0.jar com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
com.springsource.net.sf.cglib-2.2.0.jar + com.springsource.org.aopalliance-1.0.0.jar + com.springsource.org.aspectj.weaver-1.6.4.RELEASE.jar + spring-aspects-4.3.11.RELEASE.jar
CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要...
静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
3. **AOP支持**:在Spring框架中,CGLIB用于实现切面编程,特别是当目标对象没有实现接口时。它创建被增强的对象实例,然后在方法执行前后插入额外的逻辑,如日志记录、事务管理等。 4. **性能**:尽管JDK的动态...
org.aopalliance.aop.Advice.jar net.springsource.cglib-2.2.0.jar
CGLib的使用通常涉及到以下几个关键概念: 1. **Enhancer**:这是CGLib的主要入口点,用于创建代理对象。你可以向Enhancer传递一个类或者接口,它会生成指定类的子类。 2. **Callback**:回调接口,如...
CGLIB是一个强大的高性能的代码生成库,它在许多AOP的实现中被用到,比如Spring AOP。CGLIB使用字节码技术为一个类创建子类,并在子类中拦截方法调用,从而实现代理。CGLIB生成的子类是动态的,因此在编译时并不存在...
在本篇文章中,我们将深入探讨CGLib的核心概念、用途以及如何使用。 **1. CGLib的基本原理** CGLib通过字节码操作技术来实现其功能。它不是直接修改已有的.class文件,而是基于ASM库在运行时生成新的字节码,从而...
总的来说,CGLIB是Spring AOP的重要组成部分,对于那些没有实现接口的类,CGLIB提供了代理能力,使得我们可以方便地进行面向切面的编程。同时,CGLIB的高性能和广泛的适用性也使其在Java开发中得到了广泛应用。理解...
总的来说,JavaEE CGLIB字节码增强方式提供了一种灵活的手段来实现AOP编程,它通过动态生成字节码创建目标类的子类,实现了对目标方法的拦截和增强,从而在不修改原有代码的基础上,增强了代码的功能和可维护性。...
其中,`cglib.jar` 和 `asm.jar` 是实现Java动态代理的两个关键库,它们在许多框架和库中都有广泛的应用,比如Spring AOP和Hibernate。 `cglib.jar` 是一个强大的代码生成库,全称为Code Generation Library。它...
基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)基于Cglib简单实现Spring体系(Ioc+Aop+Mvc)...
下面我们将深入探讨Spring AOP如何利用CGLIB以及CGLIB的相关概念。 首先,Spring AOP的核心是通过代理来实现切面功能。代理可以分为两种类型:基于接口的JDK动态代理和基于类的CGLIB代理。JDK动态代理要求目标对象...
- **AOP(面向切面编程)**:在Spring框架中,CGLIB被用于创建代理对象,实现方法拦截,从而实现切面逻辑,如事务管理、日志记录等。 - **ORM(对象关系映射)**:在Hibernate中,CGLIB用于创建实体对象的代理,...
总结起来,CGLIB是一个强大的Java代码生成库,借助ASM库,它能够高效地生成和修改字节码,实现动态代理、类增强等功能,广泛应用于AOP、测试和ORM框架等多个领域。了解并掌握CGLIB的使用,对于提升Java开发的灵活性...