HK2使用详解
HK2介绍
HK2是一个轻量级动态依赖注入框架,它是JSR-330的实现。
组件
在HK2组件模型中,一个组件的功能是通过服务接口-服务实现的模式声明的。一个HK2服务接口 标识并描述了一个构建模块或者应用程序扩展点。HK2服务实现实现了HK2服务接口。
#### 组件模型
(HK2)提供了一个模块系统和组件模型来建立复杂的软件系统。该模块系统负责实例化构成应用程序功能的类。HK2运行时通过创建对象来填充该模块系统。模块系统通过以下方式装配对象:
- 实例化一个新的对象注入到需要这个对象的对象中。
- 为这个对象注入所需的配置信息。
- 使新建的对象可用,这样这些对象就可以注入到其他需要这些对象的对象中。
服务
一个HK2服务(服务接口)标识并描述了一个构建模块或者应用程序扩展点。服务是一个普通的Java对象(POJO)具有以下特点:
- 该对象(类)实现了一个接口
 - 对象(类)应该在JAR的META-INF/services文件中声明
 
作用范围
@Singleton
生命周期
组件可以在初始化和销毁事件发生过程中,添加切面逻辑,实现接口:org.jvnet.hk2.component.PostConstruct 和 org.jvnet.hk2.component.PreDestroy。
> 实现接口还是使用注解,可以根据性能决定。
PostConstruct.postConstruct() :这个方法在组件初始化并且组件的依赖被注入后调用。 PreDestroy.preDestroy() :这个方法在组件从系统移除前调用。
@Service(name="")
public class MyContainer implements Container, PostConstruct, PreDestroy {
    @Inject
    Logger logger;
    ...
    public void postConstruct() {
        logger.info("Starting up.");
    }
    public void preDestroy() {
        logger.info("Shutting down.");
    }
}
定义服务
#### 默认实现
```java
//默认只有一种实现的情况,接口定义:
@Contract
public interface Foo {
}
//具体业务在实现类中
@Service
public class FooImpl implements Foo {
}
```
服务命名
//为了区分相同的接口的不同实现,你可以给你的服务命名。如下例子:
@Contract
public interface Book {
}
@Service @Named
public class Moby implements Book {
}
@Service @Named
public class ParadiseLost implements Book {
}
限定服务
//服务也可以被注解限定调用。这个注解需要标注@Qualifier注解,看例子:
@Contract
public interface Color {
}
@Service @Blue
public class BlueColor implements Color {
}
@Service @Red
public class RedColor implements Color {
}
//Blue注解的实现
@Qualifier
@Retention(RUNTIME)
@Target( { TYPE, METHOD, FIELD, PARAMETER })
public @interface Blue {
}
注入服务
#### 基础注入
```java
//作为成员变量注入:
@Inject
ConfigService config;
//setter上注入
@Inject
public void set(ConfigService config) {...}
//也可通过构造函数注入
@Service
public class FooImpl implements Foo {
  private final Book book;
@Inject
public FooImpl(Book book) {
// constructor injected!
this.book = book;
}
}
#### 名称注入(Injection by name)
```java
//需要给服务命名,然后通过名称才能注入,看例子:
@Service
public class FooImpl implements Foo {
  @Inject @Named("Moby")
  private Book mobyDick;
  @Inject @Named("ParadiseLost")
  private Book paradiseLost;
}
限定注入(Injection by qualifier)
//限定服务,按照以下方式注入,看例子:
@Service
public class ColorMixer {
    private Color red;
    private Color blue;
    @Inject
    private void addPrimaries(@Red Color red, @Blue Color blue) {
      this.red = red;
      this.blue = blue;
   }
}
Provider注入
很多情况下,注入一个服务的Provider要比注入服务本身要好,因为系统可能延时创建服务,直到Provider的get方法被调用。
@Service
public class ColorMixer {
    @Inject @Red
    private Provider<Color> redProvider;
    @Inject @Blue
    private Provider<Color> blueProvider;
}
//服务中可以在需要时再调用
@Service
public class ColorMixer {
    ...
    public Color makePurple() {
      return mix(redProvider.get(), blueProvider.get());
    }
}
IterableProvider注入
通常情况下,一个contract会有多个实现,如果要访问所有的实现,就需要使用IterableProvider。
@Service
public class Library {
    @Inject
    private IterableProvider<Book> allBooks;
    public LinkedList<Book> getAllBooks() {
        LinkedList<Book> retVal = new LinkedList<Book>();
        for (Book book : allBooks) {
            retVal.add(book);
        }
        return retVal;
    }
}
//另外一个特性,我们可以使用named获取一个特定的实现。
@Service
public class Library {
    @Inject
    private IterableProvider<Book> allBooks;
    public Book findBook(String name) {
        return allBooks.named(name).get();
    }
}
Iterable注入
Iterable can be used as an injection point rather than IterableProvider.
@Service
public class Library {
    @Inject
    private Iterable<Book> allBooks;
    public LinkedList<Book> getAllBooks() {
        LinkedList<Book> retVal = new LinkedList<Book>();
        for (Book book : allBooks) {
            retVal.add(book);
        }
        return retVal;
    }
}
总结
如果对底层实现感兴趣,不如去看看这个kunJ,当然,给个star也是极好的。
HK2使用详解的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
		
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
 - 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
		
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
 - EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
		
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
 - Java 字符串格式化详解
		
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
 - Android Notification 详解(一)——基本操作
		
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
 - Android Notification 详解——基本操作
		
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
 - Git初探--笔记整理和Git命令详解
		
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
 - Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
		
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
 - Node.js npm 详解
		
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
 
随机推荐
- 《MVC实现用户权限》
			
用树形的结构显示权限的结构,树形结构的用的是jquery的控件 1. 赋给用户一个userid,在用户角色表将用户和角色关联起来,在角色权限表中将角色和权限对应起来,权限表中存储的是菜单栏的名称. 2 ...
 - java利用接口和适配器进行完全解耦--参考《thinking in java》
			
一.当使用父子类来实现以下东西时,其实是用了向上转型,这段代码的确简单了很多,复用性也很好,但是我们会发现Apply.process()和Processor类耦合过紧,其实apply.process( ...
 - ES2017中的async函数
			
前面的话 ES2017标准引入了 async 函数,使得异步操作变得更加方便.本文将详细介绍async函数 概述 async 函数是 Generator 函数的语法糖 使用Generator 函数,依 ...
 - 消息队列NetMQ 原理分析5-StreamEngine、Encord和Decord
			
消息队列NetMQ 原理分析5-StreamEngine,Encord和Decord 前言 介绍 目的 StreamEngine 发送数据 接收数据 流程分析 Encoder V2Encoder V1 ...
 - MongoDB数据库的数据类型和$type操作符
			
前面的话 本文将详细介绍MongoDB数据库的数据类型和$type操作符 数据类型 MongoDB支持以下数据类型 类型 数字 备注 Double 1 双精度浮点数 - 此类型用于存储浮点值 Stri ...
 - 如何让Oracle释放undo表空间
			
如何让Oracle释放undo表空间 最佳答案 在日常的数据库维护和数据库编程中经常会遇到犹豫对大数据量做DML操作后是得ORACLE的undo表空间扩展到十几个G或者几十个G 但是这些表空间 ...
 - 利用python发送邮件
			
找了很多使用python发送邮件的文章, 发现写的并不是太全, 导致坑特别多, 刚把这个坑跨过去, 在此记录下来 本代码使用163作为发送客户端, 接收邮箱随意 首先登录163邮箱, 开启POP3/S ...
 - java解析xml汇总(转自倾城幻影-Java解析xml汇总,链接:http://www.cnblogs.com/jiugehuanying/archive/2012/01/12/2320058.html)
			
[引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文主要介绍这4种解析XML文档技术的使用.优缺点及性能测试. [一.基础知识--扫盲] sax.do ...
 - 字符串常用-----atof()函数,atoi()函数
			
头文件:#include <stdlib.h>函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:double atof (const char* str);at ...
 - MySQL、Oracle数据库之操作系统版本选择
			
玩了快五年的Oracle,期间接触的操作系统大都是linux和aix,其中linux大部分为5.8的红帽子以及centos,oracle可以在上边运行稳定且需要安装其他与oracle相关的rpm包都是 ...