`

spring2.5学习笔记(六):AOP(1)用JDK中的Proxy实现与用CGlib实现的比较

阅读更多
这里我们就需要用到cglib-nodep-2.1_3.jar这个包

下面代码是演示的是一个用户权限判断,并赋予这个用户相应的操作。这里我做的是这样的用户权限设置:只要用户名不为空,那么就赋予它操作目标类中的所有方法的权利

代码一:
package cn.itcast.service;
public interface IPersonService {
	public void save(String name);
}


代码二 CGlibProxyFactory.java和JDKProxyFactory.java
package cn.itcast.service.aop;
import java.lang.reflect.Method;
import cn.itcast.service.impl.personServiceBean;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
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());//CGlib是集成目标类,然后覆盖目标类中的非final方法,这样达到代理的效果
		enhancer.setCallback(this);
		return enhancer.create();
	}
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		personServiceBean bean =(personServiceBean) this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
			//advice -->AOP术语:前置通知
			 try {
				result = methodProxy.invoke(targetObject, args);
				//afteradvice-->AOP术语:后置通知
			} catch (Exception e) {
				//Exceptionadvice-->AOP术语:例外通知
			}finally{
				//finallyadvice-->AOP术语:最终通知
			}
		}
		return result;
	}
}

package cn.itcast.service.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.itcast.service.impl.personServiceBean2;
public class JDKProxyFactory implements InvocationHandler{
	private Object targetObject;
	public Object createProxyIntance(Object targetObject){
		this.targetObject =targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader()
					, this.targetObject.getClass().getInterfaces(), this);
	}
	public Object invoke(Object arg0, Method arg1, Object[] arg2)
			throws Throwable {
		personServiceBean2 bean =(personServiceBean2) this.targetObject;
		Object result = null;
		if(bean.getUser()!=null){
			 result = arg1.invoke(targetObject, arg2);
		}
		return result;
	}
}


代码三:personServiceBean.java和personServiceBean2.java
package cn.itcast.service.impl;
import cn.itcast.service.IPersonService;
public class personServiceBean  {
	private String user ;

	public String getUser() {
		return user;
	}
	public personServiceBean() {
	}

	public personServiceBean(String user) {
		this.user = user;
	}

	public String getPersonName(Integer personId) {
		return "postino";
	}

	public void save(String name) {
		System.out.println("这是save方法");
	}
}

package cn.itcast.service.impl;
import cn.itcast.service.IPersonService;
public class personServiceBean2 implements IPersonService {
	private String user ;
	public String getUser() {
		return user;
	}
	public personServiceBean2() {
	}
	public personServiceBean2(String user) {
		this.user = user;
	}
	public String getPersonName(Integer personId) {
		return "postino";
	}
	public void save(String name) {
		System.out.println("这是save方法");
	}
	public void update(String name, Integer personId) {
		System.out.println("这是update方法");
	}
}



测试类:AOPTest.java
package junit.test;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.itcast.service.aop.CGlibProxyFactory;
import cn.itcast.service.aop.JDKProxyFactory;
import cn.itcast.service.impl.personServiceBean;
import cn.itcast.service.impl.personServiceBean2;
import cn.itcast.service.IPersonService;
public class AOPTest {
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}
	@Test public void proxyTest(){
		JDKProxyFactory jdkpf = new JDKProxyFactory();
		IPersonService ipersonService = (IPersonService)jdkpf.createProxyIntance(new personServiceBean2(""));
		ipersonService.save("");
	}
	@Test public void proxyTest2(){
		CGlibProxyFactory jdkpf = new CGlibProxyFactory();
		personServiceBean service = (personServiceBean)jdkpf.createProxyIntance(new personServiceBean(""));
		service.save("");
	}
}


学习总结:
1:JDKProxy拦截是,通过新建一个Proxy对象来实现的,里面传入三个参数,一个目标类的类加载器,一个目标类实现了的接口,一个目标类对象Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader() , this.targetObject.getClass().getInterfaces(), this);

2:CGlib是通过定义Enhancer类的对象,然后覆盖目标类的非final方法实现的集成,在通过回调

3:如果是用JDKProxy实现拦截,那么目标类必须是面向接口编程。而CGlib则不需要



分享到:
评论

相关推荐

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    spring2.5学习PPT 传智博客

    使用JDK中的Proxy技术实现AOP功能 16.使用CGLIB实现AOP功能与AOP概念解释 17.使用Spring的注解方式实现AOP入门 18.使用Spring的注解方式实现AOP的细节 19.使用Spring配置文件实现AOP 20.aspectj的切入点语法...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib

    spring之AOP(动态代理)

    spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理

    spring_aop4.rar_Home Home_jar 转换_spring AOP jar

    1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间...

    Spring框架+SpringAOP动态代理

    Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的...

    AOP编程示例

    CGlib的Proxy实现AOP的示例、JDK的Proxy实现AOP的示例、通过spring注解方式实现AOP

    基于java的企业级应用开发:JDK动态代理.ppt

    CGLIB代理 通过前面的学习可知,JDK的动态代理用起来非常简单,但它是有局限性的,使用动态代理的对象必须实现一个或多个接口。 那么,如何代理没有实现接口的类? CGLIB代理 CGLIB(Code Generation Library)是一...

    JAVA动态代理

    使用JDK中的Proxy技术实现AOP 使用CGLib实现AOP功能

    Spring.html

    概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...

    《剑指offer》Java代理.pdf

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比 动态代理的实际应用 Spring AOP

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想购买法国某个牌子的香水送给女朋友,但是在国内没有货源售卖,亲自去法国又大费周章了,而小红现在正在法国玩耍,她和小明是...

    JAVA的反射机制与动态代理.pdf

    本文档先讲解了JDK的反射机制,然后是Proxy的动态代理、CGLIB的动态代理,因为这些是Spring AOP的底层技术,清楚了它们,你就更能够理解Spring AOP是如何工作的。在文档的最后简要写了Spring AOP的使用,因为这不是...

    AOP面向切面编程.docx

    1.jdk动态代理:使用jdk中的Proxy,Method,InvocaitonHanderl创建代理对象,jdk动态代理要求目标类必须实现接口 2.cglib动态代理:第三方的工具库,创建代理对象,原理是继承。 通过继承目标类,创建子类,子类就是...

    《MyEclipse 6 Java 开发中文教程》前10章

    第一章 安装配置开发环境 18 1.1系统需求 18 1.2 JDK 的下载,安装和配置(可...10.7.2 MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法2 - 用 CGLIB 来实现事务管理 258 10.7.3 Spring相关的参考资料 261

    Java 基础核心总结 +经典算法大全.rar

    静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比动态代理的实际应用 Spring AOP 变量 变量汇总实例变量 实例变量的特点全局变量 静态变量 静态变量的特点类变量 局部变量

    broccoli:模仿实现注解式springMVC

    1.通过动态代理实现注解方式的spring AOP,以及简单的IOC 支持Jdk原生代理和Cglib代理 支持多个代理的叠加效果 通过spi实现代理的扩展 目前实现了Before,After,Aroud 三种通知方式. 2.基于netty实现http连接,接受get,...

    J2EE开发全程实录(JAVA项目开发)

    3.4.2 JDK Proxy. 42 第4章 Java平台下的Web开发.... 48 4.1 标记语言... 48 4.2 自定义标记库的开发... 48 4.2.1 Tag接口的生命周期... 49 4.2.2 hello标记的开发... 50 4.2.3 flash标记的开发... 52 第5章 案例...

Global site tag (gtag.js) - Google Analytics