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();
}
}