轻量级IOC/DI 容量HK2初探(零配置)

原创
2015/01/31 13:05
阅读数 2.6K

     背景知识: 

     SUN公司提出了一个类似于OSGi的模块化系统规范称之为“HK2”。HK2的全称为“Hundred Kilobytes Kernel”,包括Modules Subsytem和Component Model两部分。据称,该内核将在JDK 7中集成,同时,SUN在其开源的GlassFish J2EE应用服务器项目V3版本中将HK2作为其系统内核实现。

协议: https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html


  我今天向大家介绍一个比较spring更加轻量级的IOC/DI容器框架, 只要有一个maven依赖即可,如下所示:

<dependency>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2</artifactId>
    <version>2.3.0</version>
</dependency>

  这样就可以在使用该框架了。

     因为"HK2"框架在国内资料比较紧缺,所以我来做这么个专题来介绍它,希望大家读完这篇文章能够知道它的原理,以及能够马上使用起来,给自已的系统减减肥,大家都知道,spring框架是多么多么的强大啊,但是它的强大之处呢,却更加觉得它的重量了。所以我们可以去掉它的重量,去拥抱"HK2",当然,"HK2"也做了spring,guice等适配。方便开发者可以很快切换过去的。

下面请允许我来介绍它,来自sun 公司 模化化系统将会给我们带来别样的惊喜呢。

为了它demo更加简单,我开始写一个helloworld吧

@Contract
public interface MyService {

  public void helloHK2();

}

 大家会觉得接口也要使用注解,这很奇怪哦。没关系,后面的专题会给你一一道来。

它的实现类,如下所示:

@Service @Singleton
public class MyServiceImpl implements MyService {
  @Override
  public void helloHK2() {
    Log4jUtil.info("hello hk2");
  }
}

 两个注解,好像很酷的赶脚。那接下来要如何去使用它呢。

下面是我写单元测试:

public class TestContext {

  private ServiceLocator locator;

  @Before
  public void doBefore() {
     locator = ServiceLocatorFactory.getInstance().create("CustomResolverTest");
     Populator.populate(locator);
  }

  @Test
  public void testDI(){

    MyService myService = locator.getService(MyService.class);
    myService.helloHK2();

  }

   Populator的类,如下所示:

public class Populator {
    public static void populate(ServiceLocator locator) {
        DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
        DynamicConfiguration config = dcs.createDynamicConfiguration();
        
        // The InjectionResolver we are showcasing
        config.bind(BuilderHelper.link(MyServiceImpl.class).
                to(MyService.class).
                in(Singleton.class.getName()).
                build());
        // And commit
        config.commit();           
    }

}

  下面,可能有童鞋要问, 写一个接口,以及实现类,都要通过

config.bind(BuilderHelper.link(MyServiceImpl.class).
                to(MyService.class).
                in(Singleton.class.getName()).
                build());

 绑定,会不会比较麻烦呢,是的,在实际的运用中,肯定是不能这么使用的。我们可以自定义一个扫包程序,去扫描它。

代码如下:

public class TestContext {

  private ServiceLocator locator;

  @Before
  public void doBefore() {
    try {
      locator = HK2RuntimeInitializer.init("SceneDev-HK-Locator", false, "com.gzisming.hk2.service.impl");

      //full search
      //ServiceLocator foo = HK2RuntimeInitializer.init("OtherName", false);
    } catch (IOException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }

  @Test
  public void testDI(){

    MyService myService = locator.getService(MyService.class);
    myService.helloHK2();

  }

其中HK2RuntimeInitializer是一个自定义类。详细可以查看我的代码附件。

(完), 有机会一起交流“HK2", 这篇文章算一个入门级文章,让大家先用起来。然后再深入学习。

相关学习链接 :

https://hk2.java.net/2.4.0-b09/ (官网)

http://my.oschina.net/pkm2012/blog/96613



展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部