设计模式课程 设计模式精讲 16-5 代理模式源码解析

1    源码解析

1.1    源码解析1(jdk中的应用)

1.2    源码解析2(spring中的应用)

1.3    源码解析3(mybaties中的应用)

1    源码解析
1.1    源码解析1(jdk中的应用)

java.lang.reflect.Proxy

public class Proxy implements java.io.Serializable {
    protected Proxy(InvocationHandler h) {
        doNewInstanceCheck();
        this.h = h;
    }
//此处产生一个新的实例(目标对象)
public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException
    {
        if (h == null) {
            throw new NullPointerException();
        }

        final Class<?>[] intfs = interfaces.clone();
        final SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            checkProxyAccess(Reflection.getCallerClass(), loader, intfs);
        }

        /*
         * Look up or generate the designated proxy class.
         */
        Class<?> cl = getProxyClass0(loader, intfs);

        /*
         * Invoke its constructor with the designated invocation handler.
         */
        try {
            final Constructor<?> cons = cl.getConstructor(constructorParams);
            final InvocationHandler ih = h;
            if (sm != null && ProxyAccessHelper.needsNewInstanceCheck(cl)) {
                // create proxy instance with doPrivilege as the proxy class may
                // implement non-public interfaces that requires a special permission
                return AccessController.doPrivileged(new PrivilegedAction<Object>() {
                    public Object run() {
                        return newInstance(cons, ih);
                    }
                });
            } else {
                return newInstance(cons, ih);
            }
        } catch (NoSuchMethodException e) {
            throw new InternalError(e.toString());
        }
    }
}
1.2    源码解析2(spring中的应用)

ProxyFactoryBean

public class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean<Object>, BeanClassLoaderAware, BeanFactoryAware {
       //如果不声明,默认单例对象,注解声明多例,则声明多例对象  public Object getObject() throws BeansException {
        this.initializeAdvisorChain();
        if (this.isSingleton()) {
            return this.getSingletonInstance();
        } else {
            if (this.targetName == null) {
                this.logger.warn("Using non-singleton proxies with singleton targets is often undesirable. Enable prototype proxies by setting the ‘targetName‘ property.");
            }

            return this.newPrototypeInstance();
        }
    }
}
1.3    源码解析3(mybaties中的应用)

MapperProxyFactory

public class MapperProxyFactory<T> {
  public T newInstance(SqlSession sqlSession) {
        MapperProxy<T> mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);
        return this.newInstance(mapperProxy);
    }
}

原文地址:https://www.cnblogs.com/1446358788-qq/p/11563497.html

时间: 2024-10-06 21:28:40

设计模式课程 设计模式精讲 16-5 代理模式源码解析的相关文章

动态代理模式--源码分析

Proxy源码 1,成员变量 ?代理类的构造函数参数.默认每个代理类都具有一个invocationHandler的构造方法.(本文代码主要基于jdk 1.7) /** parameter types of a proxy class constructor */ private static final Class<?>[] constructorParams = { InvocationHandler.class }; ?缓存代理对象. private static final WeakCa

设计模式课程 设计模式精讲 10-2 外观模式源码解析

1 源码解析 1.1 源码解析1(jdk中的JDBCUtils工具类) 1.2 源码解析2 1.3 源码解析3 1.4 源码解析4 1 源码解析 1.1 源码解析1(jdk中的JDBCUtils工具类) jdbc在springJDBC中的封装 /** * Close the given JDBC Connection and ignore any thrown exception. * This is useful for typical finally blocks in manual JDB

设计模式课程 设计模式精讲 15-3 桥接模式源码解析

1 桥接模式源码解析 1.1 源码解析1 jdk中的应用(驱动类) 1 桥接模式源码解析 1.1 源码解析1 jdk中的应用(驱动类) 步骤: class.forName 调取驱动接口的静态块,触发驱动管理类DriverManager 的注册驱动方法,从而将该驱动放到CopyOnWriteArrayList中. getConnect方法是通过传入url用户名密码. 针对不同的数据库,通过driverManager中的不同方法,获取的都是相同的接口,jdbc在最初的时候设计了一套接口,再由各个数据

设计模式课程 设计模式精讲 17-3 模板方法模式源码解析

1 源码解析 1.1 源码解析1(在jdk中的使用) 1.2 源码解析2(在servlet中的应用) 1.3 源码解析3(在mybaties中的应用) 1 源码解析 1.1 源码解析1(在jdk中的使用) AbstractList(父类) public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { //get方法为抽象方法,完全交给子类去实现 abstr

设计模式课程 设计模式精讲 18-3 迭代器模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用) 1.2 源码解析2(mybaties中的应用)   1 源码解析 1.1 源码解析1(jdk中的应用) java.util.Iterator(接口) public interface Iterator<E> { /** * Returns {@code true} if the iteration has more elements. * (In other words, returns {@code true} if {@link #nex

设计模式课程 设计模式精讲 19-3 策略模式源码解析

1 源码解析 1.1 源码解析1(jdk中的应用1) 1.2 源码解析2(jdk中的应用2) 1.3 源码解析3(Spring中的应用1) 1.4 源码解析4(Spring中的应用2) 1 源码解析 1.1 源码解析1(jdk中的应用1) java.util.Comparator(策略类)作为比较器的应用 package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Obj

2017.4.16 StringBuilder &amp; StringBuffer关键源码解析

String.StringBuilder.StringBuffer的异同点 结合之前写的博文,我们对这三个常用的类的异同点进行分析: 异: 1>String的对象是不可变的:而StringBuilder和StringBuffer是可变的. 2>StringBuilder不是线程安全的:而StringBuffer是线程安全的 3>String中的offset,value,count都是被final修饰的不可修改的:而StringBuffer和StringBuilder中的value,cou

设计模式课程 设计模式精讲 8-11 单例模式源码解析(jdk+spring+mybaties)

1 源码解析 1.1 单例解析1 1.2 单例解析2(容器单例) 1.3 单例解析3 1.4 单例解析4 1 源码解析 1.1 单例解析1 java.lang.Runtime /** * 饿汉式加载,初始化的时候,就已经new出了对象 */ private static Runtime currentRuntime = new Runtime(); /** * Returns the runtime object associated with the current Java applicat

设计模式课程 设计模式精讲 12-3 适配器模式源码解析

1 源码解析 1.1 源码解析1(在jdk中的应用) 1.2 源码解析2(Spring中的通知管理) 1.3 源码解析3(SpringMVC中的应用) 1 源码解析 1.1 源码解析1(在jdk中的应用) xmlAdapter(此类是用于适配xml的一个类,是处理xml序列化和反序列化的一个类) public abstract class XmlAdapter<ValueType,BoundType> { /** * Do-nothing constructor for the derived