用Guice+Peaberry实现OSGi环境下的JIT注入

Guice是一个Java下非常强大的依赖注入框架,相比其它同类框架,我更喜欢Guice这种“配置亦代码”的风格。除了开发友好 性之外,Guice的过人之处还体现在它灵活的JIT(Just-in-time)注入上。利用@ProvidedBy()注解可以方便的为接口绑定定制 的Provider,从而实现结合了动态逻辑的Lazy注入。

当Guice和OSGi框架碰撞到一起时,就会遇到一些观念上的矛盾:OSGi的动态生命周期在Guice本身的静态绑定下无法发挥其应有的作用, 而Dynamic Service也无法方便的与Guice对接。好在开源社区已经有人意识到这些问题,并为两者搭起了一座鹊桥,这个项目就是“Peaberry”。

这两天在捣腾Peaberry时,发现它的设计主要是针对静态绑定,在与Guice的JIT注入一起用时,却还差那么一两块砖,于是自己把它给砌上了,顺便分享出来与大家交流一下。

按照Peaberry的用户手册,静态绑定一个DS服务的写法是在Module.configure()中使用:(以LogService接口为例)
[java]bind(LogService.class).toProvider(Peaberry.service(LogService.class).single());[/java]
如果转为JIT注入,则必须提供一个相应的Provider类。虽然Peaberry.service(…).single()返回的正是一个 Provider,但鉴于Java注解只能用字面类(Literal Class),所以这里需要包装一下。我的办法是定义一个抽象的公共Provider,用反射去识别派生类的具体泛型类型:
[java]
public abstract class JitProvider implements Provider {
protected JitProvider() {
@SuppressWarnings("unchecked")
final Class clazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
provider = Peaberry.service(clazz).single().direct();
}

 @Override
 public T get() {
  return provider.get();
 }

 @Inject
 protected void setInjector(final Injector injector) {
  injector.injectMembers(provider);
 }

 private final Provider provider;
}

[/java]
具体使用JitProvider的接口以如下形式声明:

[java]
@ProvidedBy(Foo.Provider.class)
public interface Foo {

static class Provider extends JitProvider {}
}
[/java]

这样,所有使用Foo服务的Bundle都完全实现了即需即用,不必再像过去那样在每一个用到该服务的Bundle的Activator中事先进行 一遍Peaberry繁琐的bind配置。经此精简优化,Peaberry的易用性得到了明显的提升,使用起来也更加直觉化了。

本文来自于"阿里中间件团队播客",原文发布时间 2010-07-14

时间: 2024-09-03 12:19:35

用Guice+Peaberry实现OSGi环境下的JIT注入的相关文章

Spring+iBATIS在tomcat环境下连接weblogic数据源报错,Failed to Generate Wrapper Class

问题描述 情况是这样的,我再tomcat环境下开发Spring+iBATIS整合的DAO层应用,配置数据源时是这样配置的:<beanid="dataSource"class="com.inspur.osgi.datasource.JNDIDataSource"destroy-method="close"><propertyname="providerUrl"value="t3://127.0.0.1

link环境下制作一款《订餐软件》,定时配送的功能怎么实现?使用定时器还是什么?

问题描述 link环境下制作一款<订餐软件>,定时配送的功能怎么实现?使用定时器还是什么? link环境下制作一款<订餐软件>,定时配送的功能怎么实现?使用定时器还是什么? 解决方案 这个可以使用quartz.net http://blog.csdn.net/gavin_luo/article/details/12758973

web service-axis2处理webServices在was环境下报错,tomcat下正常

问题描述 axis2处理webServices在was环境下报错,tomcat下正常 关键代码如下 /** * 申诉请求 */ public static String appealRequest(String requestXML, ImageFileData[] file) { String result = ""; try { // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(

Win7环境下Excel文档乱码如何修护

  Win7环境下Excel文档损坏修复策略. 损坏的Excel文档 借用WPS软件打开Excel文档依然是不行 Excel文档乱码 一.自动修缮: Excel乱码修复工具 下载 ExcelFIX(Excel损坏修复) 下载 自动修复法: 此法适用于Excel XP程序运行出现故障关闭程序或断电导致的文件受损.重新运行Excel XP,它会自动弹出"文档恢复"窗口,并在该窗口中列出已自动恢复的所有文件.用鼠标选择要保留的文件,并单击指定文件名旁的箭头,根据需要选择"打开&qu

link环境下制作一款《订餐软件》,请问延迟发货的定时器和定时发货的定时器的区隔怎么实现?

问题描述 link环境下制作一款<订餐软件>,请问延迟发货的定时器和定时发货的定时器的区隔怎么实现? link环境下制作一款<订餐软件>,请问延迟发货的定时器和定时发货的定时器的区隔怎么实现? 解决方案 这个可以使用quartz.net http://blog.csdn.net/gavin_luo/article/details/12758973

link环境下制作一款《订餐软件》,请问定时发货的实现,如何多个定时器编程?

问题描述 link环境下制作一款<订餐软件>,请问定时发货的实现,如何多个定时器编程? link环境下制作一款<订餐软件>,请问定时发货的实现,如何多个定时器编程? 解决方案 这个可以使用quartz.net http://blog.csdn.net/gavin_luo/article/details/12758973

link环境下制作一款《订餐软件》,会员菜肴配送,实现对接通讯录短信通知怎么实现?

问题描述 link环境下制作一款<订餐软件>,会员菜肴配送,实现对接通讯录短信通知怎么实现? link环境下制作一款<订餐软件>,会员菜肴配送,实现对接通讯录短信通知怎么实现? 解决方案 买个短信猫.自己通过短信猫来发短信什么的.要不就买第三方的短信接口或者运营商的短信接口,需要一定的费用 解决方案二: 要发短信的话,是要跟运营商申请短信接口的,还挺贵的得上万,节省成本的话建议可以用飞信或者是微信来发信息.

link环境下制作一款《订餐软件》,请问如何对定时发货做定时器归零?

问题描述 link环境下制作一款<订餐软件>,请问如何对定时发货做定时器归零? link环境下制作一款<订餐软件>,请问如何对定时发货做定时器归零? 解决方案 在你的数据库中记录下发货时间,使用触发器,到了时间就对数据清零处理.

link环境下制作一款《订餐软件》,请问如何设置自动并库自动导库的功能组合?

问题描述 link环境下制作一款<订餐软件>,请问如何设置自动并库自动导库的功能组合? link环境下制作一款<订餐软件>,请问如何设置自动并库自动导库的功能组合? 解决方案 这些可以用一个windows服务程序来实现定时的操作.