jdk动态代理和cglib动态代理

Spring AOP 中底层以代理模式实现,主要为JDK动态代理和cglib动态代理

JDK动态代理(目标类实现了接口,spring中默认采用jdk动态代理):

           ①定义接口Person

public interface Person {
    public void sing();
    public void dance();
}

           ②定义目标类实现接口PersonImpl

public class PersonImpl implements Person {

	@Override
	public void sing() {
		System.out.println("开始唱歌...");
	}
	@Override
	public void dance() {
        System.out.println("开始跳舞...");
	}

}

            ③定义handler类,实现InvocationHandler接口,重写invoke方法

public class PersonHandler implements InvocationHandler{
	//目标对象
	private Object targetobject;
	public PersonHandler(Object targetobject){
		this.targetobject = targetobject;
	}
	//增强目标类方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object re = null;
		System.out.println("动态代理执行...");
		re = method.invoke(targetobject, args);
		System.out.println("动态代理执行完毕...");
		return re;
	}
}

             ④创建Person接口的代理类,执行代理类后的方法

public static void main(String[] args) {
		//1.创建handler类
		PersonHandler pH = new PersonHandler(new PersonImpl());
		//2.创建Person的代理类
		Person proxy = (Person)Proxy.newProxyInstance(PersonImpl.class.getClassLoader(), 
				PersonImpl.class.getInterfaces(),pH);
		//3.执行代理类的方法
		proxy.dance();
	}

             ⑤代码展示

动态代理执行...
开始跳舞...
动态代理执行完毕...

 

cglib动态代理(没有接口,只有目标类):

            ①定义目标类

public class User {
	public void sing(){
		System.out.println("开始唱歌...");
	}
}

             ②定义类实现MethodInterceptor接口,重写intercept方法,定义创建代理类方法

public class MyMethodInterceptor implements MethodInterceptor{

	private User user;
	public MyMethodInterceptor(User user){
		this.user = user;
	}
	@Override
	public Object intercept(Object arg0, Method method, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		System.out.println("cglib动态代理前向通知...");
		Object userProxy = method.invoke(user, arg2);
		System.out.println("cglib动态代理后向通知...");
		return userProxy;
	}
      
    //创建代理类方法
	public Object createProxy(){
		Enhancer enhancer = new Enhancer();//核心类
		enhancer.setSuperclass(user.getClass());//确定代理类的父类
		enhancer.setCallback(this);//设置回调函数,相当于调用重写的intercept方法
		Object proxy = enhancer.create();//创建代理类
		return proxy;
	}

}

            ③创建代理对象,执行代理方法

public static void main(String[] args){
   User user = new User();
   MyMethodInterceptor myMethodInterceptor = new MyMethodInterceptor(user);
   User proxy = (User)myMethodInterceptor.createProxy();
   proxy.sing();
}

            ④代码展示

cglib动态代理前向通知...
开始唱歌...
cglib动态代理后向通知...

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值