Spring学习2--JDK动态代理的底层实现

Spring的AOP,底层原理是动态代理。

动态代理的实现一般有两种:JDK的动态代理和Cglib的动态代理。

下面我们先介绍Jdk动态代理的实现。

Jdk动态代理,是基于接口的开发的,如果没有接口,不能使用JDK动态代理生成代理对象。

JDK动态代理,不需要引入如何jar文件,只需要写接口和实现类,还需要创建一个代理类,该类可以生成需要代理的类的代理类对象。

1.创建web项目ch03

项目结构如下:

在该项目中设计一个接口UserDao和其代理类UserDaoImpl,代码如下。

(1)UserDao接口

package com.zdxh.jdk;

public interface UserDao {
	public void add();
	public void delete();
	public void update();
	public void find();
}

(2)UserDaoImpl实现类代码

package com.zdxh.jdk;

public class UserDaoImpl implements UserDao {
	@Override
	public void add() {
		System.out.println("add...");
	}
	@Override
	public void delete() {
		System.out.println("delete...");
	}
	@Override
	public void update() {
		System.out.println("update...");
	}
	@Override
	public void find() {
		System.out.println("find...");
	}
}

2.创建代理类JdkProxy

    为了通用性,我们设置代理类返回类型为Object。假设我们要求在原有基础上,如果调用add方法,需要增强功能,例如,为了简单起见,我们只是增强一句话。但是平时开发肯定要使用切面类,在切面类中设计很多增强方法。

package com.zdxh.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy {
	private Object obj;
	
	public JdkProxy(Object obj) {
		super();
		this.obj = obj;
	}

	//生成代理的方法
	public Object createProxy(Object obj) {
		return (Object) Proxy.newProxyInstance(obj.getClass().getClassLoader(), 
				obj.getClass().getInterfaces(), 
				new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] arg2) throws Throwable {
				if("add".equals(method.getName())) {
					System.out.println("检查权限.....增强");
					return method.invoke(obj, arg2);
				}
				return method.invoke(obj, arg2);
			}
		});
	}
}

3.编写测试类:

package com.zdxh.jdk;

import org.junit.jupiter.api.Test;

public class JdkTest {
	@Test
	public void ptTest() {
		UserDao userDao =new UserDaoImpl();
		UserDao proxy=(UserDao) new JdkProxy(userDao).createProxy(userDao);
		proxy.delete();
		proxy.add();
		proxy.update();
		proxy.find();
	}
}

4.运行测试方法,结果如下:

总结:本案例介绍了使用JDK方法生成代理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值