• -W.LI-
    2019-07-18
    之前硬着头皮看过这个源码,中间有一步weakcache印象深刻。弱引用缓存,先从缓存中取,没取到获取字节码,校验魔术版本号之类的,最后反射实现。反射效率不高也是这个原因导致的,要获取源文件校验准备初始化(轻量级累加载一次)。
    
     7
  • neohope
    2019-07-24
    //在Proxy类里中:
    //constructorParams的定义如下:
    private static final Class<?>[] constructorParams = { InvocationHandler.class };

    //newProxyInstance无限精简之后就是:
    public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
            throws IllegalArgumentException {
        //通过ProxyClassFactory调用ProxyGenerator生成了代理类
        Class<?> cl = getProxyClass0(loader, interfaces);
        //找到参数为InvocationHandler.class的构造函数
        final Constructor<?> cons = cl.getConstructor(constructorParams);
        //创建代理类实例
        return cons.newInstance(new Object[]{h});
    }


    //在ProxyGenerator类中:
    public static byte[] generateProxyClass(final String name,Class<?>[] interfaces, int accessFlags)){}
    private byte[] generateClassFile() {}
    //上面两个方法,做的就是
    //将接口全部进行代理
    //并生成其他需要的方法,比如上面用到的构造函数、toString、equals、hashCode等
    //生成对应的字节码
    //其实这也就说明了,为何JDK的动态代理,必须需要至少一个接口
    展开

    作者回复: 👍

    
     6
  • nightmare
    2019-07-19
    老师能讲一下spring这么解决循环依耐的吗

    作者回复: Spring只解决了单例bean通过setXxx或者@Autowired进行循环依赖:https://blog.csdn.net/qq924862077/article/details/73926268

    其他场景可以想办法绕过:https://www.baeldung.com/circular-dependencies-in-spring

    
     3
  • QQ怪
    2019-07-18
    动态代理的思路便是动态生成一个新类,先通过传入的classLoader生成对应Class对象,后通过反射获取构造函数对象并生成代理类实例,jdk动态代理是通过接口实现的,但很多类是没有针对接口设计的,但是我们知道可以通过拼接字节码生成新的类的自由度是十分大的,所以cglib框架就是通过拼接字节码来实现非接口类的代理。
    
     3
  • z.l
    2019-07-18
    老师 ,工厂方法模式没看懂。另外DefaultSingletonBeanRegistry的getBean方法的实现存在线程安全问题吧?虽然用了ConcurrentHashMap,但是if (singletonObject == null) 存在竞态条件, 可能有2个线程同时判断为true,最后产生了2个对象实例。应该用putIfAbsent方法。

    作者回复: 汗颜,代码简化的过程中去掉了线程安全的部分,线程安全的版本应该是这样的:

        //如果没拿到通过反射创建一个对象实例,并添加到HashMap中
        if (singletonObject == null) {
          synchronized(singletonObjects){
        if(singletonObjects.get(beanName) == null){
    singletonObjects.put(beanName,Class.forName(beanName).newInstance());
        }
      }
    }

    
     2
  • QQ怪
    2019-07-18
    老师这次加餐面试必问题
    
     2
  • 靠人品去赢
    2019-11-07
    这个工厂模式,这各其实实例化的出来我觉得还是工厂bean,但是可以通过getObject来获取bean。这里可以看一下Spring的ObjectFactoryCreatingFactoryBean(通过继承AbstractFactoryBean ,然后由AbstractFactoryBean实现BeanFactory的)
    public Object getObject() throws BeansException {
                return this.beanFactory.getBean(this.targetBeanName);
            }
    对应类名字传过来即可,若果是动态那工厂模式就大显神威了。
    展开
    
    
  • 桔子
    2019-09-29
    谢谢,我学会了动态代理~
    
    
  • 草戊
    2019-07-29
    BeanFactory和FactoryBean的代码示例是一样的?
    
    
  • 802.11
    2019-07-29
    文中的工厂模式,有一个疑惑,它确实解决了对象的创建问题,但是对象每一个字段的赋值,工厂模式可以解决吗?或者怎么解决呢,谢谢

    作者回复: 字段赋初始值一般来说由类的构造函数或者初始化函数完成,但是Spring比较特殊,可以通过反射注入字段值

    
    
  • nightmare
    2019-07-19
    如果是基于反射实现的,那增强的业务这么植入的
    
    
  • 许童童
    2019-07-18
    工厂方法模式说的就是抽象工厂模式吧
     2
    
  • 阿青,你学到了吗
    2019-07-18
    基于反射实现的
    
    
我们在线,来聊聊吧