<div class="blogpost-body" id="cnblogs_post_body">
<p>前言</p>
<hr>
<p>Google Guice 是一个轻量级的依赖注入框架,它支持Java 5或者更高版本的JDK,得利于Java 5中提供的泛型 (Generics) 和注释 (Annotations) ,它可以使得代码类型安全 (type-safe) 。那么何时使用在代码中使用 Guice 进行注入呢?一般来说,如果在你的应用代码中业务对象 (Business Objects) 之间的关系或者依赖需要手动维护的话,你就可以使用Guice 进行注入。</p>
<p>该文章中,首先我将通过一些例子来初步的认识一下 Guice 框架,然后我将介绍下 依赖注入框架的理论知识 以及在应用程序中使用依赖注入的好处,同样我也会和大家探讨一下 Guice 提供的用于简化代码的 API (包括Annotations) 。最后通过大量使用 Guice API的例子来使大家更好地理解这些API。</p>
<p>依赖注入(Dependency Injection)</p>
<hr>
<p>由于Gucie 是一个依赖注入框架 (Dependency Injection Framework) ,因此我们首先要很清楚依赖注入 (Dependency Injection) 是什么概念。这些年来,依赖注入变得越来越流行,变得越来越重要,在很多典型的应用中它甚至变成了一个必需的机制,比如 J2EE 5.0, Spring, JBoss Seam就是使用依赖注入的很好的例子。现在我们来使用一个简单的例子来说明使用依赖注入框架的必要性。</p>
<p>请看以下代码:</p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="color:#0000ff;">interface</span><span style="color:#000000;"> Storage{
</span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> store(String uniqueId, Data data);
</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Data retrieve(String uniqueId);
}</span></pre>
</div>
<p>上面的接口 Storage 提供了存储 (store) 和获取 (retrieve) 数据的机制,由于数据可以存储在数据库中也可以存储在一个文件中,因此上面接口 Storage 的实现可以如下。</p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="color:#0000ff;">class</span> FileStorage <span style="color:#0000ff;">implements</span><span style="color:#000000;"> Storage{
</span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> store(String uniqueId, Data data){
</span><span style="color:#008000;">//</span><span style="color:#008000;"> Store the object in a file using Java Serialization mechanism.</span>
<span style="color:#000000;"> }
</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Data retrieve(String uniqueId){
</span><span style="color:#008000;">//</span><span style="color:#008000;"> Code to retrieve the object.</span>
<span style="color:#000000;"> }
}</span></pre>
</div>
<p>实现类 FileStorage 可以将数据存储到硬盘文件中,同样也可以从硬盘文件中获取存储数据。接下来是 Storage 接口的另一种实现,它用于将数据存储到数据库中。</p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="color:#0000ff;">class</span> DatabaseStorage <span style="color:#0000ff;">implements</span><span style="color:#000000;"> Storage{
</span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> store(String uniqueId, Data data){
</span><span style="color:#008000;">//</span><span style="color:#008000;"> Open a connection and store the data.</span>
<span style="color:#000000;"> }
</span><span style="color:#0000ff;">public</span><span style="color:#000000;"> Data retrieve(String uniqueId){
</span><span style="color:#008000;">//</span><span style="color:#008000;"> Get the data from the Database.</span>
<span style="color:#000000;"> }
}</span></pre>
</div>
<p>现在,我们来看一个 Storage 应用客户端的例子。下面的 StorageClient 代码片段中,首先初始化一个 FileSorage,然后在转向 DatabaseStorage 实现。</p>
<div class="cnblogs_code">
<pre class="blockcode"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> StorageClient {
</span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> main(String[] args) {
</span><span style="color:#008000;">//</span><span style="color:#008000;"> Making use of file storage. </span>
Storage storage = <span style="color:#0000ff;">new</span><span style="color:#000000;"> FileStorage();
storage.store(</span>"123", <span style="color:#0000ff;">new</span><span style="color:#000000;"> Data());
</span><span style="color:#008000;">//</span><span style="color:#008000;"> Making use of the database.</span>
storage = <span style="color:#0000ff;">new</span><span style="color:#000000;"> DatabaseStorage();
storage.store(</span>"456", <span style="color:#0000ff;">new</span><span style="color:#000000;"> Data());
} |
|