2. IntelliJ IDEA的的IoC介绍介绍
当你看到这一章节时,你估计会骂我鸡婆。IoC,这个还要你来告诉我,我用
SpringFramework已经很久啦。但我还是要说一下。IDEA整个组件结构是基于
PicoContainer(http://www.picocontainer.org)的,PicoContainer是一个高效的嵌入
式的DI容器。如果你有时间的话,我建议你花5分钟浏览一下PicoContainer,然后回到这篇
文档来。
PicoContainer是有层次结构的,就是一个container可以包含子container,子容器可以
访问父容器中的组件,而各个子容器直接是独立的。在IDEA中,主要有三种container:
Application, Project和Module,分别包含不同的组件。application container包含多个
project container,project container可以包含多个module container,如下图:
这样各个project container是独立的,都可以访问application container中的组件;
module container也是独立的,可以访问所属project container和application container
中的组件。这个图是我们后面理解application component, project component, module
component和extension point等等的基础。
PicoContainer的组件注入主要有两种方式:构造注入和Setter注入,但是在IDEA中,目
前Setter注入还不支持,全部是构造注入,关于构造注入,PicoContainer推荐最好使用一个
构造函数,这点也在IDEA中需要明确。如果你的组件需要引用其他的组件或资源,你最好在
组件的构造函数中指定,PicoContainer会帮助你完成资源引用和初始化。
IDEA的这些容器中包含些什么? 当然首先是各种component,还有就是一些服务,容器
中不仅仅是component,还有相关为组件服务的资源,在后面我们也会涉及到对容器中服务
资源的讲述。
如果访问这些容器中的组件?在IDEA中,访问application container中的组件可以通过
ApplicationManager.getInstance().getComponent(Class T)来进行。通用获得project
对象后,你可以访问project容器中的组件;获取module对象后,你可以访问module容器的
组件。有了容器后,如何能获取指定的组件?有以下几种方式: 1. 组件ID,组件提供的组件
标识符号,可以通过标识符来访问。如果组件没有标识符号,我们称之为匿名组件。 2. 组件
的interface类。如果一个组件的是通过interface向外服务的,那么我们可以通过interface