Spring小结3

Spring小结3

代理模式

1.静态代理
2.动态代理

代理模式是为现有的功能类提供一个代理类,外部使用时,
使用的是代理类。主要的目的为了不修改原有类的代码,我们扩展功能时,
在代理类上扩展;使用方和功能的提供方解耦合。

1静态代理
提前为目标定义好要用的代理类,一个目标类可以有多个代理类
当我们提前定义好的多个代理类,如果没有使用的话,就造成了资源的浪费。
组成部分:
1.功能接口
2.实现了该接口的目标类
3.实现了该接口的代理类

package com.kang.proxy;

public interface PersonDao {
  public int add();
  public int remove();
  
}

package com.kang.proxy;

public class Target implements PersonDao{

	@Override
	public int add() {
		
		return 0;
	}

	@Override
	public int remove() {
		
		return 0;
	}

}

代理类

package com.kang.proxy;

//代理类
public class Proxy implements PersonDao{
//目标类对象
//	private Target target = new Target();
	
	private PersonDao target;
	public void  setTarget(PersonDao target) {
		this.target = target;
	}
	@Override
	public int add() {
	 MyLog.logInfo("添加了一个person");
		//核心功能
		this.target.add();
		return 0;
	}

	@Override
	public int remove() {
		MyLog.logInfo("移除了一个person");
		this.target.remove();
		return 0;
	}

}

Main方法

package com.kang;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.kang.proxy.PersonDao;
import com.kang.proxy.Proxy;
import com.kang.proxy.Target;

public class Main1 {
	public static void main(String[] args) {
		//1.获取spring上下文对象,获取到容器了
    ApplicationContext ctx = new ClassPathXmlApplicationContext("Spring.xml");
    PersonDao personDao = ctx.getBean("personDao",PersonDao.class);
    personDao.add();
    }
    }

日志类

package com.kang.proxy;

//日志类
public class MyLog {
	
public static  void logInfo(Object msg) {
	System.out.println("添加日志内容");
}
}

动态代理

Main方法

public class Main1 {
	public static void main(String[] args) {
//JDK的动态代理
		//newProxyInstance的返回值结果就是生成的代理对象
		/*
		 * 1.类加载器:创建代理类
		 * 2.接口列表:获取目标类的接口,以供代理类实现
		 * 3.执行控制器:通过代理对象调用的方法,都会调度给invoke方法来执行
		 * 我们要在代理方法中实现的功能,都在Invoke方法中实现
		 */
	PersonDao personDao = (PersonDao)Proxy.newProxyInstance(
			Target.class.getClassLoader(),//类加载器 
			Target.class.getInterfaces(), //目标类实现的接口
			
			new InvocationHandler() {
		private Target target = new Target();
		
		/*
		 * 通过动态生成的代理对象调用方法时,都是执行
		 * invoke方法
		 * 
		 * 1.动态生成的代理对象
		 * 2.method就是拦截到的目标类中对应的方法
		 * 3.method的参数列表  实参
		 * 
		 * 返回值就是method方法的返回值
		 */
				
				@Override
				public Object invoke(Object proxy,
						Method method,
						Object[] args) throws Throwable {
					//System.out.println(proxy.getClass());
					//要添加的額外的功能
					MyLog.logInfo("JDK的動態代理");
					//要執行的核心功能
					return method.invoke(target,args);
				}
			});
	System.out.println(personDao.getClass());
	personDao.add();
	
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值