博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【spring 4】AOP:动态代理
阅读量:4678 次
发布时间:2019-06-09

本文共 2074 字,大约阅读时间需要 6 分钟。

一、动态代理简介

动态代理与普通代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每个方法进行中转。

动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该方法就是调用被代理接口的所有方法时需要调用的,而invoke方法返回的值是被代理接口的一个实现类。

二、实例解析

接口:

package com.angel.spring;public interface IUser {	public void addUser(String strName);	}
实现类:

package com.angel.spring;public class User implements IUser {	@Override	public void addUser(String strName) {		System.out.println("姓名是:"+strName);	}}
动态代理类:

package com.angel.spring;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class IsSuccessHandler implements InvocationHandler {		private Object targetObject;		public Object createProxyInstance(Object targetObject) {		this.targetObject = targetObject;		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), 							   targetObject.getClass().getInterfaces(), 							   this);	}		public Object invoke(Object proxy, Method method, Object[] args)			throws Throwable {		//调用目标方法		Object ret = method.invoke(targetObject, args);		check();		return ret;	}		private void check() {		System.out.println("-------Angel,you are successful-------");	}		}

application配置文件:

测试类:

package com.angel.spring;import org.springframework.beans.factory.BeanFactory;import org.springframework.context.support.ClassPathXmlApplicationContext;import junit.framework.TestCase;public class TestUser extends TestCase {	public void testAdd() {		// 读取配置文件		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");		IsSuccessHandler handler=(IsSuccessHandler)factory.getBean("userProxy");		User user=(User)factory.getBean("user");		IUser iUser=(IUser)handler.createProxyInstance(user);		iUser.addUser("Andy+Angel");	}}

三、总结

在使用静态代理的时候,当我们的接口增加了一个方法,那么实现类和代理类都必须同时增加一个方法的实现,而且在代理类里面,还必须为每个方法加上拦截处理。在少量类的时候,这样子的处理并没有什么不妥。但是一旦系统复杂点,类变得比较多的时候,静态代理的弊端显露无疑。采用动态代理,事先并没有为实现类创建代理,只有当调用方法时才动态的创建一个代理。

把一些外加的事务采用动态代理进行处理,这样子,实现类就可以只关注自己的职责了,分工明确,perfect!

转载于:https://www.cnblogs.com/hhx626/p/6010308.html

你可能感兴趣的文章
Java线程的定义
查看>>
Python-面向对象(组合、封装与多态)
查看>>
Mininet
查看>>
COSC2531 Programming Fundamentals
查看>>
设计模式系列 - 访问者模式
查看>>
20180507小测
查看>>
eclipse左侧不见
查看>>
python会缓存小的整数和短小的字符
查看>>
格网与四叉树索引
查看>>
多张照片拍摄、图片浏览
查看>>
html(5) css
查看>>
Azure Web连接到Azure MySql Db
查看>>
Linux shell 命令判断执行语法 ; , && , ||
查看>>
vim代码格式化插件clang-format
查看>>
What does the dot after dollar sign mean in jQuery when declaring variables?
查看>>
windows registry
查看>>
jquery 动画总结(主要指效果函数)
查看>>
leetcode-17-电话号码的字母组合’
查看>>
Flume 示例
查看>>
Designing for Performance
查看>>