Spring-代理模式

171 阅读2分钟

说明

eg:A叫B帮他带一份盒饭,A是委托人,B是代理人 代理模式:为了不再改变源代码的情况下增加功能,装饰器模式也是

分类

  1. 静态代理:指定某个类为代理类,必须要程序员写出这个类
  2. 动态代理:根据实际的情况在内存中自动生成代理类,代理对象,不需要自己写类

静态代理

规范:必须要有一个接口

示例:

interface Show{
	public void sing();
}
class Singer implements Show{

	@Override
	public void sing() {
		System.out.println("...忘情水");
	}
}
//经纪人
class SingerProxy implements Show{
	private Singer singer;
	public SingerProxy(Singer singer) {
		super();
		this.singer = singer;
	}
	@Override
	public void sing() {
		System.out.println("先谈价格,谈妥之后");
		singer.sing();
		System.out.println("收钱");
	}
}

动态代理-jdk代理

jdk中提供了动态代理的实现类,可以直接利用在内存生成代理对象

模拟数据库操作:

JDK代理: 1. 必须要有接口 2. 被代理类必须要实现接口 3.必须要创建一个代理工厂,用来动态的创建代理对象

```
interface IUser{
public void delete();

}

//被代理类(委托)dao class UserDao implements IUser{

@Override
public void delete() {
	System.out.println("到数据库中删除指定的用户");
}

} //工厂类 class ProxyFactory{ //添加一个被代理对象的属性 private Object target; //委托目标 指向一个委托人

public ProxyFactory(Object target) {
	super();
	this.target = target;
}
//添加一个创建代理对象的方法
public Object getProxyInstance() {
	//参数1:类加载器,写本类的就行
	//参数2:接口的数组,写被代理类的实现的接口
	//参数3:handler,写进增加的功能
	return Proxy.newProxyInstance(
			ProxyFactory.class.getClassLoader(), 
			target.getClass().getInterfaces(),
			new InvocationHandler() {
				@Override
				public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
					//参数1:自动生成的代理对象
					//参数2:要执行的方法
					//参数3:要指向方法的参数
					System.out.println("开启一个事务");
					//参数1:要写被代理对象
					Object result = method.invoke(target, args);
					//
					System.out.println("提交事务");
					return result;
				}
			});
}

}

public class jdkProxy {
	public static void main(String[] args) {
		UserDao dao = new UserDao();//委托人
		ProxyFactory factory = new ProxyFactory(dao);
		//生成代理对象
		IUser proxy = (IUser)factory.getProxyInstance();
		proxy.delete();
		System.out.println(proxy);
	}
}
    
    ```
    
程序运行结果:
    开启一个事务
    到数据库中删除指定的用户
    提交事务
    开启一个事务
    提交事务
    com.dyr.jdk.UserDao@28d93b30