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使用详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. 【python】字符排序

    一.摘要 最近在做一个排序的东西,被python的字符串编码格式折腾了一会儿,总结下 二.排序 英文排序不用说,sort sorted 比较好,内部已经实现 主要是中文,方法是查表获取拼音再进行排序. ...

  2. margin属性的正负值确定

    margin属性用来使用设置外边距,大多数情况使用正值,但是一些稍复杂的定位就会使用到负值,所以对margin属性的正负值理解是有必要的,本文同时解释了margin-right和margin-bott ...

  3. spring入门之环境搭建

    本人刚刚接触spring,看了一些教程,但是很多概念都不懂(以前没接触过,看着很抽象),所以我觉得通过动手可能会更好的理解并且掌握.看了一些小实例,但是都没有成功,终于在各种尝试之后搭建成功了,现在我 ...

  4. python cookbook第三版学习笔记十三:类和对象(三)描述器

    __get__以及__set__:假设T是一个类,t是他的实例,d是它的一个描述器属性.读取属性的时候T.d返回的是d.__get__(None,T),t.d返回的是d.__get__(t,T).说法 ...

  5. 如何把我的Java程序变成exe文件?

    JAVA是一种“跨平台”的语言,拥有“一次编写,处处运行”的特点,让它成为当今IT行业,必不可少的一门编程语言.每一个软件开发完成之后,应该大家都需要打包程序并发送给客户,常见的方式:java程序打成 ...

  6. Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定&管道

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 数据绑定 数据绑定允许你将组件控制器的属性和方法与组件的模板连接起来,大大降低了开发时的编码量. ...

  7. [POI2008]枪战Maf

    [POI2008]枪战Maf 题目 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的 ...

  8. SMS Error code: +CMS

    Error  Description CMS ERROR: 1 Unassigned number CMS ERROR: 8 Operator determined barring CMS ERROR ...

  9. ubuntu 手动安装openssh-server

    先用能上网的机器下载:zlib-1.2.5.tar.openssh-5.6p1.tar.gz.openssl-0.9.8o.tar.tar,接下来,准备安装. 步骤如下: 1.首先解压安装zlib:t ...

  10. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...