在我们学习Spring框架的时候我们是否思考过,Spring是如何实现bean实列注入到IOC容器中呢?我们如何去
代理是基本的设计模式之一,他是为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色。 Java的动态代理比代理的思想更迈进了一步,因为他可以动态地创建代理并动态的处理对所代理的方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,他的工作是揭示调用的类型并确定相应的对策。 -------《ThinKing in Java》
package dynamicproxy;
import java.lang.reflect.*;
/**
* @Author:yuanxindong
* @Date:2020/5/90:53
*/
public class Client {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//实例化一个对象
//分别分为两种方事实现的,一个是直接new 关键字创建一个对象,
// 第二种是通过反射机制穿件一个对象
//UserServiceImpl userServiceLmpl = new UserServiceImpl();
//1。 读取加载"dynamicproxy.UserServiceImpl"路径下的class对象
Class aClass = Class.forName("dynamicproxy.UserServiceImpl");
//使用class对象中的方法获取父类加载器
//ClassLoader classLoader = userServiceLmpl.getClass().getClassLoader();
ClassLoader classLoader = aClass.getClassLoader();
//Class [] interfaces = userServiceLmpl.getClass().getInterfaces();
//获取实现class实现的接口
Class[] interfaces = aClass.getInterfaces();
//获取这个类的、构造方法
Constructor constructors = aClass.getConstructor();
//通过构造方法 去实例化这个对象
UserServiceImpl userServiceLmpl = (UserServiceImpl) constructors.newInstance();
//将获取到的对象传入对应的处理器上,通过反射的方式拿到对应的方法切织入
InvocationHandler logHandler = new LogHandler(userServiceLmpl);
//创建动态代理对象的接口
UserService proxy = (UserService) Proxy.newProxyInstance(classLoader, interfaces, logHandler);
proxy.select();
proxy.update();
ProxyUtils.generateClassFile(userServiceLmpl.getClass(), "UserServiceProxy");
}
}
被代理的对象
/**
* @Author:yuanxindong
* @Date:2020/5/90:56
*/
public interface UserService {
public void select();
public void update();
}
package dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* @Author:yuanxindong
* @Date:2020/5/90:47
*/
public class LogHandler implements InvocationHandler {
private Object target;
//使用构造方法将代理对象传入代理对象
public LogHandler(Object target){
this.target = target;
}
//通过反射的方式执行并织入(不知道用的是否合理)代理方法,这个接口实现方法会被newProxyInstance()方法使用
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
//
Object result = method.invoke(target,args);
after();
return result;
}
private void before(){
System.out.println("log start"+ System.currentTimeMillis());
}
private void after(){
System.out.println("log end" + System.currentTimeMillis());
}
}
执行结果:
jdk的动态代理通过Java反射机制实现 主要的方法是:
InvocationHandler logHandler = new LogHandler(userServiceLmpl);
UserService proxy = (UserService) Proxy.newProxyInstance(classLoader, interfaces, logHandler);