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

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

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

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

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


二、目前发现的几个关键类
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方法。

好,今晚先写这么多了!!! :lol:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值