【源码学习】Guice 学习笔记(一)

    最近在学习Guice的源码,尝试写写blog,做做笔记!

一、先简单介绍下
    使用Google Guice作为IOC容器已有一段时间了,当前感觉良好。整合mybatis、struts2什么的也非常方便,个人感觉它甚至比spring方便,用起来没啥觉得不爽的。

    优点:体积小巧,代码量少,方便我深入学习源码;其次,是Google开源出来的组件,代码质量和性能应该都有保障,值得我使用和深入学习。

    不足:guice更新频率较低,但亦无妨啦,目前就很好用了,当然我也希望它可以更好。目前它的最新版本是3.0,我这次学习源码也是找了3.0,项目地址在 http://code.google.com/p/google-guice


二、目前发现的几个关键类
com.google.inject.TypeLiteral:工具类,对java类型泛型相关的类型提供更精准的定义。
com.google.inject.internal.MoreTypes:工具类,里面有ParameterizedTypeImpl、GenericArrayTypeImpl和WildcardTypeImpl这3个静态类,用于转化为Guice内的规范化的类。
com.google.inject.util.Types:也是一个工具类,有点像个工厂,主要生产MoreTypes里面那3个静态类相关的实例。
com.google.inject.Key:感觉最重要,从Guice中最终都是要通过Key来获取对应Class的Instance。
com.google.inject.internal.BindingImpl:和Key对应,绑定的Key的对应实现。
com.google.inject.spi.InjectionPoint:注入点,用于识别构造方法、普通方法和属性的注入位置。
com.google.inject.spi.Dependency:貌似用于记录有哪些InjectionPoint,后面用来做清理工作的? 

嗯,上面也仅是我一知半解的猜测,后面深入学习后再进一步看看是否猜对了。


三、关于初始化
Guice.createInjector(
    new Module() {
        public void configure(Binder binder) {
             binder.bind(Service.class).to(DemoService.class);
        }
    }
);

我们一般会这样实例化Injector,Guice内部调用Module内的configure方法,接着binder.bind(Service.class).to(DemoService.class)会把Service.class按一定的算法转化为Key,DemoService.class转化为BindingImpl,并把Key和BindingImpl关联起来,后面注入再用。更多的细节在InjectorShell.Builder#build方法,不过我还没具体看完。


四、关于获取Instance
injector.getInstance(Service.class)

一般是用上面这个方式来获取Instance(实际项目中应该不需要我们显示调用的,例如web项目的struts2 + guice + mybatis可以把组件全托管给guice,不需要我们显式获取实例,这里只是做个简介),Service.class会被转化为Key,然后根据Key获得BindingImpl,然后再获得provider,接着provider.get()就获得Instance了。核心在InjectorImpl#getProvider方法。

好,今晚先写这么多了!!!

你可能感兴趣的:(源码学习)