﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-EricGu's Java-Record-Space-随笔分类-Spring</title><link>http://www.blogjava.net/EricGu/category/38209.html</link><description>专注 学习 实践 创新</description><language>zh-cn</language><lastBuildDate>Wed, 15 Dec 2010 17:53:10 GMT</lastBuildDate><pubDate>Wed, 15 Dec 2010 17:53:10 GMT</pubDate><ttl>60</ttl><item><title>使用 spring 2.5 注释驱动的 ioc 功能 </title><link>http://www.blogjava.net/EricGu/archive/2010/12/15/340791.html</link><dc:creator>Eric Gu</dc:creator><author>Eric Gu</author><pubDate>Wed, 15 Dec 2010 06:40:00 GMT</pubDate><guid>http://www.blogjava.net/EricGu/archive/2010/12/15/340791.html</guid><wfw:comment>http://www.blogjava.net/EricGu/comments/340791.html</wfw:comment><comments>http://www.blogjava.net/EricGu/archive/2010/12/15/340791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EricGu/comments/commentRss/340791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EricGu/services/trackbacks/340791.html</trackback:ping><description><![CDATA[<div class="blog_content">
<blockquote>
<p>在项目中使用Spring的注解，关于spring的注解，由两种注解方式，</p>
<p>基于注释（Annotation）的配置有越来越流行的趋势，Spring 2.5 顺应这种趋势，提供了完全基于注释配置 Bean、装配 Bean 的功能，您可以使用基于注释的 Spring IoC 替换原来基于 XML 的配置。本文通过实例详细讲述了 Spring 2.5 基于注释 IoC 功能的使用。</p>
</blockquote>&lt;!--START RESERVED FOR FUTURE USE INCLUDE FILES--&gt;&lt;!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --&gt;&lt;!--END RESERVED FOR FUTURE USE INCLUDE FILES--&gt;
<p><a name="N1004A"><span class="atitle"><strong><span style="font-size: large">概述</span></strong></span></a></p>
<p>注释配置相对于 XML 配置具有很多的优势：</p>
<ul>
    <li>它可以充分利用 Java 的反射机制获取类结构信息，这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时，我们就不需要指定 PO 的属性名、类型等信息，如果关系表字段和 PO 属性名、类型都一致，您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。 </li>
    <li>注释和 Java 代码位于一个文件中，而 XML 配置采用独立的配置文件，大多数配置信息在程序开发完成后都不会调整，如果配置信息和 Java 代码放在一起，有助于增强程序的内聚性。而采用独立的 XML 配置文件，程序员在编写一个功能时，往往需要在程序文件和配置文件中不停切换，这种思维上的不连贯会降低开发效率。 </li>
</ul>
<p>因此在很多情况下，注释配置比 XML 配置更受欢迎，注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类，现在您已经可以使用注释配置完成大部分 XML 配置的功能。在这篇文章里，我们将向您讲述使用注释进行 Bean 定义和依赖注入的内容。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><a name="N100A7"><span class="atitle"><strong><span style="font-size: large">使用 @Autowired 注释</span></strong></span></a></p>
<p>Spring 2.5 引入了 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 注释，它可以对类成员变量、方法及构造函数进行标注，完成自动装配的工作。</p>
<p>Spring 通过一个 <code><span style="font-family: Courier; font-size: x-small">BeanPostProcessor</span></code> 对 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 进行解析，所以要让 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 起作用必须事先在 Spring 容器中声明 <code><span style="font-family: Courier; font-size: x-small">AutowiredAnnotationBeanPostProcessor</span></code> Bean。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在Spring中配置如下：</p>
<p>&lt;!-- 该 BeanPostProcessor 将自动起作用，对标注 @Autowired 的 Bean 进行自动注入 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean class="org.springframework.beans.factory.annotation.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AutowiredAnnotationBeanPostProcessor"/&gt;<br />
当 Spring 容器启动时，<code><span style="font-family: Courier; font-size: x-small">AutowiredAnnotationBeanPostProcessor</span></code> 将扫描 Spring 容器中所有 Bean，当发现 Bean 中拥有 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 注释时就找到和其匹配（默认按类型匹配）的 Bean，并注入到对应的地方中去。</p>
<p>按照上面的配置，Spring 将直接采用 Java 反射机制对 Boss 中的 <code><span style="font-family: Courier; font-size: x-small">car</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">office</span></code> 这两个私有成员变量进行自动注入。所以对成员变量使用 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 后，您大可将它们的 setter 方法（<code><span style="font-family: Courier; font-size: x-small">setCar()</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">setOffice()</span></code>）从 Boss 中删除。</p>
<p>当然，您也可以通过 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 对方法或构造函数进行标注，</p>
<p>&nbsp;</p>
<p><a name="N10139"><span class="atitle"><strong><span style="font-size: large">当候选 Bean 数目不为 1 时的应对方法</span></strong></span></a></p>
<p>在默认情况下使用 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 注释进行自动注入时，Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时，Spring 容器将抛出 <code><span style="font-family: Courier; font-size: x-small">BeanCreationException</span></code> 异常，并指出必须至少拥有一个匹配的 Bean。</p>
<p>&nbsp;</p>
<p>当不能确定 Spring 容器中一定拥有某个类的 Bean 时，可以在需要自动注入该类 Bean 的地方可以使用 <code><span style="font-family: Courier; font-size: x-small">@Autowired(required = false)</span></code>，这等于告诉 Spring：在找不到匹配 Bean 时也不报错。</p>
<p>&nbsp;</p>
<p>一般情况下，使用 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 的地方都是需要注入 Bean 的，使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到（如为了快速启动 Spring 容器，仅引入一些模块的 Spring 配置文件），所以 <code><span style="font-family: Courier; font-size: x-small">@Autowired(required = false)</span></code> 会很少用到。</p>
<p>和找不到一个类型匹配 Bean 相反的一个错误是：如果 Spring 容器中拥有多个候选 Bean，Spring 容器在启动时也会抛出 <code><span style="font-family: Courier; font-size: x-small">BeanCreationException</span></code> 异常。</p>
<p>&nbsp;</p>
<p>Spring 允许我们通过 <code><span style="font-family: Courier; font-size: x-small">@Qualifier</span></code> 注释指定注入 Bean 的名称，这样歧义就消除了，可以通过下面的方法解决异常：</p>
<p><br />
<a name="N101A5"><strong>清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            @Autowired
            public void setOffice(@Qualifier("office")Office office) {
            this.office = office;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p><code><span style="font-family: Courier; font-size: x-small">@Qualifier("office")</span></code> 中的 <code><span style="font-family: Courier; font-size: x-small">office</span></code> 是 Bean 的名称，所以 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">@Qualifier</span></code> 结合使用时，自动注入的策略就从 byType 转变成 byName 了。<code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 可以对成员变量、方法以及构造函数进行注释，而 <code><span style="font-family: Courier; font-size: x-small">@Qualifier</span></code> 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同，所以 Spring 不将 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">@Qualifier</span></code> 统一成一个注释类。下面是对成员变量和构造函数入参进行注释的代码：</p>
<p>对成员变量进行注释：</p>
<p>&nbsp;</p>
<p><strong>对成员变量使用 @Qualifier 注释<br />
</strong></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public class Boss {
            @Autowired
            private Car car;
            @Autowired
            @Qualifier("office")
            private Office office;
            &#8230;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>对构造函数入参进行注释：</p>
<p><br />
<a name="N101E0"><strong>清单 15. 对构造函数变量使用 @Qualifier 注释</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            public class Boss {
            private Car car;
            private Office office;
            @Autowired
            public Boss(Car car , @Qualifier("office")Office office){
            this.car = car;
            this.office = office ;
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p><code><span style="font-family: Courier; font-size: x-small">@Qualifier</span></code> 只能和 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 结合使用，是对 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 有益的补充。一般来讲，<code><span style="font-family: Courier; font-size: x-small">@Qualifier</span></code> 对方法签名中入参进行注释会降低代码的可读性，而对成员变量注释则相对好一些。</p>
<p>&nbsp;</p>
<p><a name="N101F9"><span class="atitle"><strong><span style="font-size: large">使用 JSR-250 的注释</span></strong></span></a></p>
<p>Spring 不但支持自己定义的 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 的注释，还支持几个由 JSR-250 规范定义的注释，它们分别是 <code><span style="font-family: Courier; font-size: x-small">@Resource</span></code>、<code><span style="font-family: Courier; font-size: x-small">@PostConstruct</span></code> 以及 <code><span style="font-family: Courier; font-size: x-small">@PreDestroy</span></code>。</p>
<p><a name="N10211"><span class="smalltitle"><strong><span style="font-size: small">@Resource</span></strong></span></a></p>
<p><code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 的作用相当于 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code>，只不过 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 按 byType 自动注入，面 <code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 默认按 byName 自动注入罢了。<code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 有两个属性是比较重要的，分别是 name 和 type，Spring 将 <code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 注释的 name 属性解析为 Bean 的名字，而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性，则使用 byName 的自动注入策略，而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性，这时将通过反射机制使用 byName 自动注入策略。</p>
<p>Resource 注释类位于 Spring 发布包的 lib/j2ee/common-annotations.jar 类包中，因此在使用之前必须将其加入到项目的类库中。来看一个使用 <code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 的例子：</p>
<p><br />
<a name="N1023B"><strong>清单 16. 使用 @Resource 注释的 Boss.java</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import javax.annotation.Resource;
            public class Boss {
            // 自动注入类型为 Car 的 Bean
            @Resource
            private Car car;
            // 自动注入 bean 名称为 office 的 Bean
            @Resource(name = "office")
            private Office office;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>一般情况下，我们无需使用类似于 <code><span style="font-family: Courier; font-size: x-small">@Resource(type=Car.class)</span></code> 的注释方式，因为 Bean 的类型信息可以通过 Java 反射从代码中获取。</p>
<p>要让 JSR-250 的注释生效，除了在 Bean 类中标注这些注释外，还需要在 Spring 容器中注册一个负责处理这些注释的 <code><span style="font-family: Courier; font-size: x-small">BeanPostProcessor</span></code>：</p>
<p>&nbsp;</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;bean
            class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p><code><span style="font-family: Courier; font-size: x-small">CommonAnnotationBeanPostProcessor</span></code> 实现了 <code><span style="font-family: Courier; font-size: x-small">BeanPostProcessor</span></code> 接口，它负责扫描使用了 JSR-250 注释的 Bean，并对它们进行相应的操作。</p>
<p><a name="N1025E"><span class="smalltitle"><strong><span style="font-size: small">@PostConstruct 和 @PreDestroy</span></strong></span></a></p>
<p>Spring 容器中的 Bean 是有生命周期的，Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作，您既可以通过实现 InitializingBean/DisposableBean 接口来定制初始化之后 / 销毁之前的操作方法，也可以通过 &lt;bean&gt; 元素的 init-method/destroy-method 属性指定初始化之后 / 销毁之前调用的操作方法。关于 Spring 的生命周期，笔者在《精通 Spring 2.x—企业应用开发精解》第 3 章进行了详细的描述，有兴趣的读者可以查阅。</p>
<p>JSR-250 为初始化之后/销毁之前方法的指定定义了两个注释类，分别是 @PostConstruct 和 @PreDestroy，这两个注释只能应用于方法上。标注了 @PostConstruct 注释的方法将在类实例化后调用，而标注了 @PreDestroy 的方法将在类销毁之前调用。</p>
<p><br />
<a name="N1026C"><strong>清单 17. 使用 @PostConstruct 和 @PreDestroy 注释的 Boss.java</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import javax.annotation.Resource;
            import javax.annotation.PostConstruct;
            import javax.annotation.PreDestroy;
            public class Boss {
            @Resource
            private Car car;
            @Resource(name = "office")
            private Office office;
            @PostConstruct
            public void postConstruct1(){
            System.out.println("postConstruct1");
            }
            @PreDestroy
            public void preDestroy1(){
            System.out.println("preDestroy1");
            }
            &#8230;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>您只需要在方法前标注 <code><span style="font-family: Courier; font-size: x-small">@PostConstruct</span></code> 或 <code><span style="font-family: Courier; font-size: x-small">@PreDestroy</span></code>，这些方法就会在 Bean 初始化后或销毁之前被 Spring 容器执行了。</p>
<p>我们知道，不管是通过实现 <code><span style="font-family: Courier; font-size: x-small">InitializingBean</span></code>/<code><span style="font-family: Courier; font-size: x-small">DisposableBean</span></code> 接口，还是通过 &lt;bean&gt; 元素的 <code><span style="font-family: Courier; font-size: x-small">init-method/destroy-method</span></code> 属性进行配置，都只能为 Bean 指定一个初始化 / 销毁的方法。但是使用 <code><span style="font-family: Courier; font-size: x-small">@PostConstruct</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">@PreDestroy</span></code> 注释却可以指定多个初始化 / 销毁方法，那些被标注 <code><span style="font-family: Courier; font-size: x-small">@PostConstruct</span></code> 或 <code><span style="font-family: Courier; font-size: x-small">@PreDestroy</span></code> 注释的方法都会在初始化 / 销毁时被执行。</p>
<p>通过以下的测试代码，您将可以看到 Bean 的初始化 / 销毁方法是如何被执行的：</p>
<p><br />
<a name="N102A2"><strong>清单 18. 测试类代码</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import org.springframework.context.support.ClassPathXmlApplicationContext;
            public class AnnoIoCTest {
            public static void main(String[] args) {
            String[] locations = {"beans.xml"};
            ClassPathXmlApplicationContext ctx =
            new ClassPathXmlApplicationContext(locations);
            Boss boss = (Boss) ctx.getBean("boss");
            System.out.println(boss);
            ctx.destroy();// 关闭 Spring 容器，以触发 Bean 销毁方法的执行
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>这时，您将看到标注了 <code><span style="font-family: Courier; font-size: x-small">@PostConstruct</span></code> 的 <code><span style="font-family: Courier; font-size: x-small">postConstruct1()</span></code> 方法将在 Spring 容器启动时，创建 <code><span style="font-family: Courier; font-size: x-small">Boss</span></code> Bean 的时候被触发执行，而标注了 <code><span style="font-family: Courier; font-size: x-small">@PreDestroy</span></code> 注释的 <code><span style="font-family: Courier; font-size: x-small">preDestroy1()</span></code> 方法将在 Spring 容器关闭前销毁 <code><span style="font-family: Courier; font-size: x-small">Boss</span></code> Bean 的时候被触发执行。</p>
<p><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img class="magplus" title="点击查看原始大小图片" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="700" height="0" /><br />
            <img border="0" alt="" src="http://www.ibm.com/i/c.gif" width="8" height="6" /> </td>
        </tr>
    </tbody>
</table>
<table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img border="0" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" height="16" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://topmanopensource.javaeye.com/admin/blogs/#main"><strong><span style="color: #996699">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N102C3"><span class="atitle"><strong><span style="font-size: large">使用 &lt;context:annotation-config/&gt; 简化配置</span></strong></span></a></p>
<p>Spring 2.1 添加了一个新的 context 的 Schema 命名空间，该命名空间对注释驱动、属性文件引入、加载期织入等功能提供了便捷的配置。我们知道注释本身是不会做任何事情的，它仅提供元数据信息。要使元数据信息真正起作用，必须让负责处理这些元数据的处理器工作起来。 </p>
<p>而我们前面所介绍的 <code><span style="font-family: Courier; font-size: x-small">AutowiredAnnotationBeanPostProcessor</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">CommonAnnotationBeanPostProcessor</span></code> 就是处理这些注释元数据的处理器。但是直接在 Spring 配置文件中定义这些 Bean 显得比较笨拙。Spring 为我们提供了一种方便的注册这些 <code><span style="font-family: Courier; font-size: x-small">BeanPostProcessor</span></code> 的方式，这就是 &lt;context:annotation-config/&gt;。请看下面的配置：</p>
<p><br />
<a name="N102DE"><strong>清单 19. 调整 beans.xml 配置文件</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;?xml version="1.0" encoding="UTF-8" ?&gt;
            &lt;beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;
            &lt;context:annotation-config/&gt;
            &lt;bean id="boss" class="com.baobaotao.Boss"/&gt;
            &lt;bean id="office" class="com.baobaotao.Office"&gt;
            &lt;property name="officeNo" value="001"/&gt;
            &lt;/bean&gt;
            &lt;bean id="car" class="com.baobaotao.Car" scope="singleton"&gt;
            &lt;property name="brand" value=" 红旗 CA72"/&gt;
            &lt;property name="price" value="2000"/&gt;
            &lt;/bean&gt;
            &lt;/beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>&lt;context:annotationconfig/&gt; 将隐式地向 Spring 容器注册 <code><span style="font-family: Courier; font-size: x-small">AutowiredAnnotationBeanPostProcessor</span></code>、<code><span style="font-family: Courier; font-size: x-small">CommonAnnotationBeanPostProcessor</span></code>、<code><span style="font-family: Courier; font-size: x-small">PersistenceAnnotationBeanPostProcessor</span></code> 以及 <code><span style="font-family: Courier; font-size: x-small">equiredAnnotationBeanPostProcessor</span></code> 这 4 个 BeanPostProcessor。</p>
<p>在配置文件中使用 context 命名空间之前，必须在 &lt;beans&gt; 元素中声明 context 命名空间。</p>
<p><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img class="magplus" title="点击查看原始大小图片" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="700" height="0" /><br />
            <img border="0" alt="" src="http://www.ibm.com/i/c.gif" width="8" height="6" /> </td>
        </tr>
    </tbody>
</table>
<table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img border="0" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" height="16" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://topmanopensource.javaeye.com/admin/blogs/#main"><strong><span style="color: #996699">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N102FA"><span class="atitle"><strong><span style="font-size: large">使用 @Component</span></strong></span></a></p>
<p>虽然我们可以通过 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 或 <code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 在 Bean 类中使用自动注入功能，但是 Bean 还是在 XML 文件中通过 &lt;bean&gt; 进行定义 —— 也就是说，在 XML 配置文件中定义 Bean，通过 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 或 <code><span style="font-family: Courier; font-size: x-small">@Resource</span></code> 为 Bean 的成员变量、方法入参或构造函数入参提供自动注入的功能。能否也通过注释定义 Bean，从 XML 配置文件中完全移除 Bean 定义的配置呢？答案是肯定的，我们通过 Spring 2.5 提供的 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 注释就可以达到这个目标了。</p>
<p>下面，我们完全使用注释定义 Bean 并完成 Bean 之间装配：</p>
<p><br />
<a name="N1031C"><strong>清单 20. 使用 @Component 注释的 Car.java</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import org.springframework.stereotype.Component;
            @Component
            public class Car {
            &#8230;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>仅需要在类定义处，使用 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 注释就可以将一个类定义了 Spring 容器中的 Bean。下面的代码将 <code><span style="font-family: Courier; font-size: x-small">Office</span></code> 定义为一个 Bean：</p>
<p><br />
<a name="N10330"><strong>清单 21. 使用 @Component 注释的 Office.java</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import org.springframework.stereotype.Component;
            @Component
            public class Office {
            private String officeNo = "001";
            &#8230;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>这样，我们就可以在 Boss 类中通过 <code><span style="font-family: Courier; font-size: x-small">@Autowired</span></code> 注入前面定义的 <code><span style="font-family: Courier; font-size: x-small">Car</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">Office Bean</span></code> 了。</p>
<p><br />
<a name="N10348"><strong>清单 22. 使用 @Component 注释的 Boss.java</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.beans.factory.annotation.Required;
            import org.springframework.beans.factory.annotation.Qualifier;
            import org.springframework.stereotype.Component;
            @Component("boss")
            public class Boss {
            @Autowired
            private Car car;
            @Autowired
            private Office office;
            &#8230;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p><code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 有一个可选的入参，用于指定 Bean 的名称，在 Boss 中，我们就将 Bean 名称定义为&#8220;<code><span style="font-family: Courier; font-size: x-small">boss</span></code>&#8221;。一般情况下，Bean 都是 singleton 的，需要注入 Bean 的地方仅需要通过 byType 策略就可以自动注入了，所以大可不必指定 Bean 的名称。</p>
<p>在使用 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 注释后，Spring 容器必须启用类扫描机制以启用注释驱动 Bean 定义和注释驱动 Bean 自动注入的策略。Spring 2.5 对 context 命名空间进行了扩展，提供了这一功能，请看下面的配置：</p>
<p><br />
<a name="N10363"><strong>清单 23. 简化版的 beans.xml</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            &lt;?xml version="1.0" encoding="UTF-8" ?&gt;
            &lt;beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:context="http://www.springframework.org/schema/context"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-2.5.xsd"&gt;
            &lt;context:component-scan base-package="com.baobaotao"/&gt;
            &lt;/beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>这里，所有通过 &lt;bean&gt; 元素定义 Bean 的配置内容已经被移除，仅需要添加一行 &lt;context:component-scan/&gt; 配置就解决所有问题了——Spring XML 配置文件得到了极致的简化（当然配置元数据还是需要的，只不过以注释形式存在罢了）。&lt;context:component-scan/&gt; 的 base-package 属性指定了需要扫描的类包，类包及其递归子包中所有的类都会被处理。</p>
<p>&lt;context:component-scan/&gt; 还允许定义过滤器将基包下的某些类纳入或排除。Spring 支持以下 4 种类型的过滤方式，通过下表说明：</p>
<p><br />
<a name="N1036F"><strong>表 1. 扫描过滤方式</strong></a><br />
</p>
<table class="data-table-1" border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <th width="20%">过滤器类型</th>
            <th width="80%">说明</th>
        </tr>
        <tr>
            <td>注释</td>
            <td>假如 com.baobaotao.SomeAnnotation 是一个注释类，我们可以将使用该注释的类过滤出来。</td>
        </tr>
        <tr>
            <td>类名指定</td>
            <td>通过全限定类名进行过滤，如您可以指定将 com.baobaotao.Boss 纳入扫描，而将 com.baobaotao.Car 排除在外。</td>
        </tr>
        <tr>
            <td>正则表达式</td>
            <td>通过正则表达式定义过滤的类，如下所示： com\.baobaotao\.Default.*</td>
        </tr>
        <tr>
            <td>AspectJ 表达式</td>
            <td>通过 AspectJ 表达式定义过滤的类，如下所示： com. baobaotao..*Service+</td>
        </tr>
    </tbody>
</table>
<p>下面是一个简单的例子：</p>
<p>&nbsp;</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;context:component-scan base-package="com.baobaotao"&gt;
            &lt;context:include-filter type="regex"
            expression="com\.baobaotao\.service\..*"/&gt;
            &lt;context:exclude-filter type="aspectj"
            expression="com.baobaotao.util..*"/&gt;
            &lt;/context:component-scan&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>值得注意的是 &lt;context:component-scan/&gt; 配置项不但启用了对类包进行扫描以实施注释驱动 Bean 定义的功能，同时还启用了注释驱动自动注入的功能（即还隐式地在内部注册了 <code><span style="font-family: Courier; font-size: x-small">AutowiredAnnotationBeanPostProcessor</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">CommonAnnotationBeanPostProcessor</span></code>），因此当使用 &lt;context:component-scan/&gt; 后，就可以将 &lt;context:annotation-config/&gt; 移除了。</p>
<p>默认情况下通过 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 定义的 Bean 都是 singleton 的，如果需要使用其它作用范围的 Bean，可以通过 <code><span style="font-family: Courier; font-size: x-small">@Scope</span></code> 注释来达到目标，如以下代码所示：</p>
<p><br />
<a name="N103CC"><strong>清单 24. 通过 @Scope 指定 Bean 的作用范围</strong></a><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">
            package com.baobaotao;
            import org.springframework.context.annotation.Scope;
            &#8230;
            @Scope("prototype")
            @Component("boss")
            public class Boss {
            &#8230;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>这样，当从 Spring 容器中获取 <code><span style="font-family: Courier; font-size: x-small">boss</span></code> Bean 时，每次返回的都是新的实例了。</p>
<p><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img class="magplus" title="点击查看原始大小图片" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="700" height="0" /><br />
            <img border="0" alt="" src="http://www.ibm.com/i/c.gif" width="8" height="6" /> </td>
        </tr>
    </tbody>
</table>
<table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img border="0" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" height="16" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://topmanopensource.javaeye.com/admin/blogs/#main"><strong><span style="color: #996699">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N103D9"><span class="atitle"><strong><span style="font-size: large">采用具有特殊语义的注释</span></strong></span></a></p>
<p>Spring 2.5 中除了提供 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 注释外，还定义了几个拥有特殊语义的注释，它们分别是：<code><span style="font-family: Courier; font-size: x-small">@Repository</span></code>、<code><span style="font-family: Courier; font-size: x-small">@Service</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">@Controller</span></code>。在目前的 Spring 版本中，这 3 个注释和 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 是等效的，但是从注释类的命名上，很容易看出这 3 个注释分别和持久层、业务层和控制层（Web 层）相对应。虽然目前这 3 个注释和 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 相比没有什么新意，但 Spring 将在以后的版本中为它们添加特殊的功能。所以，如果 Web 应用程序采用了经典的三层分层结构的话，最好在持久层、业务层和控制层分别采用 <code><span style="font-family: Courier; font-size: x-small">@Repository</span></code>、<code><span style="font-family: Courier; font-size: x-small">@Service</span></code> 和 <code><span style="font-family: Courier; font-size: x-small">@Controller</span></code> 对分层中的类进行注释，而用 <code><span style="font-family: Courier; font-size: x-small">@Component</span></code> 对那些比较中立的类进行注释。</p>
<p><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img class="magplus" title="点击查看原始大小图片" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="700" height="0" /><br />
            <img border="0" alt="" src="http://www.ibm.com/i/c.gif" width="8" height="6" /> </td>
        </tr>
    </tbody>
</table>
<table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img border="0" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" height="16" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://topmanopensource.javaeye.com/admin/blogs/#main"><strong><span style="color: #996699">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N10409"><span class="atitle"><strong><span style="font-size: large">注释配置和 XML 配置的适用场合</span></strong></span></a></p>
<p>是否有了这些 IOC 注释，我们就可以完全摒除原来 XML 配置的方式呢？答案是否定的。有以下几点原因：</p>
<ul>
    <li>注释配置不一定在先天上优于 XML 配置。如果 Bean 的依赖关系是固定的，（如 Service 使用了哪几个 DAO 类），这种配置信息不会在部署时发生调整，那么注释配置优于 XML 配置；反之如果这种依赖关系会在部署时发生调整，XML 配置显然又优于注释配置，因为注释是对 Java 源代码的调整，您需要重新改写源代码并重新编译才可以实施调整。 </li>
    <li>如果 Bean 不是自己编写的类（如 <code><span style="font-family: Courier; font-size: x-small">JdbcTemplate</span></code>、<code><span style="font-family: Courier; font-size: x-small">SessionFactoryBean</span></code> 等），注释配置将无法实施，此时 XML 配置是唯一可用的方式。 </li>
    <li>注释配置往往是类级别的，而 XML 配置则可以表现得更加灵活。比如相比于 <code><span style="font-family: Courier; font-size: x-small">@Transaction</span></code> 事务注释，使用 aop/tx 命名空间的事务配置更加灵活和简单。 </li>
</ul>
<p>所以在实现应用中，我们往往需要同时使用注释配置和 XML 配置，对于类级别且不会发生变动的配置可以优先考虑注释配置；而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 XML 配置。Spring 会在具体实施 Bean 创建和 Bean 注入之前将这两种配置方式的元信息融合在一起。</p>
<p><br />
</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img class="magplus" title="点击查看原始大小图片" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="700" height="0" /><br />
            <img border="0" alt="" src="http://www.ibm.com/i/c.gif" width="8" height="6" /> </td>
        </tr>
    </tbody>
</table>
<table class="no-print" border="0" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellspacing="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img border="0" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" height="16" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://topmanopensource.javaeye.com/admin/blogs/#main"><strong><span style="color: #996699">回页首</span></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N1042C"><span class="atitle"><strong><span style="font-size: large">小结</span></strong></span></a></p>
<p>Spring 在 2.1 以后对注释配置提供了强力的支持，注释配置功能成为 Spring 2.5 的最大的亮点之一。合理地使用 Spring 2.5 的注释配置，可以有效减少配置的工作量，提高程序的内聚性。但是这并不意味着传统 XML 配置将走向消亡，在第三方类 Bean 的配置，以及那些诸如数据源、缓存池、持久层操作模板类、事务管理等内容的配置上，XML 配置依然拥有不可替代的地位。</p>
</div>
<img src ="http://www.blogjava.net/EricGu/aggbug/340791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EricGu/" target="_blank">Eric Gu</a> 2010-12-15 14:40 <a href="http://www.blogjava.net/EricGu/archive/2010/12/15/340791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring控制反转的通俗解释【转】</title><link>http://www.blogjava.net/EricGu/archive/2010/12/15/340757.html</link><dc:creator>Eric Gu</dc:creator><author>Eric Gu</author><pubDate>Wed, 15 Dec 2010 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/EricGu/archive/2010/12/15/340757.html</guid><wfw:comment>http://www.blogjava.net/EricGu/comments/340757.html</wfw:comment><comments>http://www.blogjava.net/EricGu/archive/2010/12/15/340757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EricGu/comments/commentRss/340757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EricGu/services/trackbacks/340757.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<p><font size="2" face="宋体">什么叫控制反转呢？套用好莱坞的一句名言就是：你呆着别动，到时我会找你。 <br />
什么意思呢？就好比一个皇帝和太监 <br />
</font><font size="2"><font face="宋体"><font color="#3366ff">有一天皇帝想宠幸某个美女，于是跟太监说，今夜我要宠幸美女 <br />
皇帝往往不会告诉太监，今晚几点会回宫，会回哪张龙床，他只会告诉太监他要哪位美女</font> <br />
</font></font><font size="2"><font face="宋体"><font color="#ff6600">其它一切都交由太监去安排，到了晚上皇帝回宫时，自然会有美女出现在皇帝的龙床上 <br />
这就是控制反转，而把美女送到皇帝的寝宫里面去就是注射</font> <br />
<font color="#ff0000">太监就是是框架里面的注射控制器类</font>BeanFactory，负责找到美女并送到龙床上去 <br />
<font color="#ff0000">整个后宫可以看成是Spring框架</font>，美女就是Spring控制下的JavaBean <br />
</font></font><font color="#339966" size="2" face="宋体">而传统的模式就是一个饥渴男去找小姐出台 <br />
</font><font size="2"><font face="宋体"><font color="#3366ff">找领班，帮助给介绍一个云云，于是领班就开始给他张罗<br />
介绍一个合适的给他，完事后，再把小姐还给领班，下次再来</font> <br />
</font></font><font size="2"><font face="宋体"><font color="#ff6600">这个过程中，领班就是查询上下文Context，领班的一个职能就是给客户找到他们所要的小姐 <br />
这就是lookup()方法，领班手中的小姐名录就是JNDI//Java Naming and Directory Interface <br />
</font><font color="#ff0000">小姐就是EJB</font>，<font color="#0000ff">饥渴男是客户端</font>，<font color="#ff0000">青楼是EJB容器</font> <br />
看到区别了么？</font></font></p>
<p><font size="2"><font color="#993366" face="宋体">饥渴男去找小姐出台很麻烦，不仅得找，用完后还得把小姐给还回去</font></font></p>
<p><font color="#ff00ff"><font face="宋体"><font size="2">而皇帝爽翻了，什么都不用管，交给太监去处理，控制权转移到太监手中去了</font><font size="2">而不是皇帝，</font></font></font></p>
<p><font color="#ff00ff"><font size="2" face="宋体">必要时候由太监给注射进去就可以了</font></font></p>
</div>
<br />
<img src ="http://www.blogjava.net/EricGu/aggbug/340757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EricGu/" target="_blank">Eric Gu</a> 2010-12-15 11:39 <a href="http://www.blogjava.net/EricGu/archive/2010/12/15/340757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring JSR-250注解 </title><link>http://www.blogjava.net/EricGu/archive/2009/03/11/259165.html</link><dc:creator>Eric Gu</dc:creator><author>Eric Gu</author><pubDate>Wed, 11 Mar 2009 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/EricGu/archive/2009/03/11/259165.html</guid><wfw:comment>http://www.blogjava.net/EricGu/comments/259165.html</wfw:comment><comments>http://www.blogjava.net/EricGu/archive/2009/03/11/259165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EricGu/comments/commentRss/259165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EricGu/services/trackbacks/259165.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 注释配置相对于 XML 配置具有很多的优势：    它可以充分利用 Java 的反射机制获取类结构信息，这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时，我们就不需要指定 PO 的属性名、类型等信息，如果关系表字段和 PO 属性名、类型都一致，您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。    注释和 Java 代码位于一个...&nbsp;&nbsp;<a href='http://www.blogjava.net/EricGu/archive/2009/03/11/259165.html'>阅读全文</a><img src ="http://www.blogjava.net/EricGu/aggbug/259165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EricGu/" target="_blank">Eric Gu</a> 2009-03-11 17:12 <a href="http://www.blogjava.net/EricGu/archive/2009/03/11/259165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.5 标注开发的简单例子 </title><link>http://www.blogjava.net/EricGu/archive/2009/03/11/259157.html</link><dc:creator>Eric Gu</dc:creator><author>Eric Gu</author><pubDate>Wed, 11 Mar 2009 08:56:00 GMT</pubDate><guid>http://www.blogjava.net/EricGu/archive/2009/03/11/259157.html</guid><wfw:comment>http://www.blogjava.net/EricGu/comments/259157.html</wfw:comment><comments>http://www.blogjava.net/EricGu/archive/2009/03/11/259157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EricGu/comments/commentRss/259157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EricGu/services/trackbacks/259157.html</trackback:ping><description><![CDATA[<p>研究了很久新出的 Spring 2.5, 总算大致明白了如何用标注定义 Bean, 但是如何定义和注入类型为 java.lang.String 的 bean 仍然未解决, 希望得到高人帮助.</p>
<p>总的来看 Java EE 5 的标注开发方式开来是得到了大家的认可了.</p>
<p>@Service 相当于定义 bean, 自动根据 bean 的类名生成一个首字母小写的 bean</p>
<p>@Autowired 则是自动注入依赖的类, 它会在类路径中找成员对应的类/接口的实现类, 如果找到多个, 需要用 @Qualifier("chineseMan") 来指定对应的 bean 的 ID.<br />
</p>
<p>一定程度上大大简化了代码的编写, 例如一对一的 bean 映射现在完全不需要写任何额外的 bean 定义了.<br />
</p>
<p>下面是代码的运行结果:</p>
<p>man.sayHello()=你好<br />
SimpleMan said: Hi<br />
org.example.EnglishMan@12bcd4b said: Hello
<p>&nbsp;</p>
<p>代码:</p>
<p>beans.xml</p>
<div>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">="UTF-8"</span>?<span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span>
<span style="color: #ff0000">xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span>
<span style="color: #ff0000">xmlns:context</span><span style="color: #0000ff">="http://www.springframework.org/schema/context"</span>
<span style="color: #ff0000">xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">context:annotation-config</span><span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">context:component-scan</span> <span style="color: #ff0000">base-package</span><span style="color: #0000ff">="org.example"</span><span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></pre>
</div>
<p>测试类:</p>
<p>import org.example.IMan;<br />
import org.example.SimpleMan;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext;
<p>public class SpringTest {<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleMan dao = (SimpleMan) ctx.getBean("simpleMan");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(dao.hello());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IMan man = (IMan) ctx.getBean("usMan");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(man.sayHello());<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>自动探测和注入bean的类:</p>
<p>package org.example;
<p>import org.springframework.beans.factory.annotation.Autowired;<br />
import org.springframework.beans.factory.annotation.Qualifier;<br />
import org.springframework.stereotype.Service;
<p>@Service<br />
public class SimpleMan {<br />
&nbsp;&nbsp;&nbsp; // 自动注入名称为 Man 的 Bean<br />
&nbsp;&nbsp;&nbsp; @Autowired(required = false)<br />
&nbsp;&nbsp;&nbsp; @Qualifier("chineseMan")<br />
&nbsp;&nbsp;&nbsp; //@Qualifier("usMan")<br />
&nbsp;&nbsp;&nbsp; private IMan man;&nbsp;&nbsp;&nbsp;
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the man<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public IMan getMan() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return man;<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param man the man to set<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void setMan(IMan man) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.man = man;<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; public String hello() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("man.sayHello()=" + man.sayHello());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "SimpleMan said: Hi";<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>&nbsp;</p>
<p>一个接口和两个实现类:</p>
<p>package org.example;
<p>/**<br />
* 抽象的人接口.<br />
* @author BeanSoft<br />
* @version 1.0<br />
*/<br />
public interface IMan {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 打招呼的抽象定义.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 招呼的内容字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String sayHello();<br />
}
<p>&nbsp;</p>
<p>package org.example;
<p>import org.springframework.stereotype.Service;
<p>/**<br />
* 中国人的实现.<br />
* @author BeanSoft<br />
*/<br />
@Service<br />
public class ChineseMan implements IMan {
<p>&nbsp;&nbsp;&nbsp; public String sayHello() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "你好";<br />
&nbsp;&nbsp;&nbsp; }
<p>}
<p>&nbsp;
<p>package org.example;
<p>import org.springframework.stereotype.Service;
<p>/**<br />
* @author BeanSoft<br />
* <br />
*/<br />
@Service("usMan")<br />
// 这里定义了一个 id 为 usMan 的 Bean, 标注里面的属性是 bean 的 id<br />
public class EnglishMan implements IMan {
<p>&nbsp;&nbsp;&nbsp; public String sayHello() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this + " said: Hello!";<br />
&nbsp;&nbsp;&nbsp; }
<p>} </p>
<img src ="http://www.blogjava.net/EricGu/aggbug/259157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EricGu/" target="_blank">Eric Gu</a> 2009-03-11 16:56 <a href="http://www.blogjava.net/EricGu/archive/2009/03/11/259157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring&lt;一&gt; IoC容器和Dependency Injection模式 </title><link>http://www.blogjava.net/EricGu/archive/2009/03/11/259042.html</link><dc:creator>Eric Gu</dc:creator><author>Eric Gu</author><pubDate>Wed, 11 Mar 2009 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/EricGu/archive/2009/03/11/259042.html</guid><wfw:comment>http://www.blogjava.net/EricGu/comments/259042.html</wfw:comment><comments>http://www.blogjava.net/EricGu/archive/2009/03/11/259042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/EricGu/comments/commentRss/259042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/EricGu/services/trackbacks/259042.html</trackback:ping><description><![CDATA[<p><font color="#006400"><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">与</span><span style="font-family: 'Lucida Bright'">DI</span></font></p>
<p><font color="#006400"><span style="font-family: 宋体">　　</span><span style="font-family: 宋体">首先想说说</span><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">（</span><span style="font-family: 'Lucida Bright'">Inversion of Control</span><span style="font-family: 宋体">，控制倒转）。这是</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">的核心，贯穿始终。所谓</span><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">，对于</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">框架来说，就是由</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">来负责控制对象的生命周期和</span><span style="font-family: 宋体">对象间的关系。这是什么意思呢，举个简单的例子，我们是如何找女朋友的？常见的情况是，我们到处去看哪里有长得漂亮身材又好的</span><span style="font-family: 'Lucida Bright'">mm</span><span style="font-family: 宋体">，然后打听她们的兴趣爱</span><span style="font-family: 宋体">好、</span><span style="font-family: 'Lucida Bright'">qq</span><span style="font-family: 宋体">号、电话号、</span><span style="font-family: 'Lucida Bright'">ip</span><span style="font-family: 宋体">号、</span><span style="font-family: 'Lucida Bright'">iq</span><span style="font-family: 宋体">号</span><span style="font-family: 'Lucida Bright'">&#8230;&#8230;&#8230;</span><span style="font-family: 宋体">，想办法认识她们，投其所好送其所要，然后嘿嘿</span><span style="font-family: 'Lucida Bright'">&#8230;&#8230;</span><span style="font-family: 宋体">这个过程是复杂深奥的，我们必须自己设计和面对每个环节。传</span><span style="font-family: 宋体">统的程序开发也是如此，在一个对象中，如果要使用另外的对象，就必须得到它（自己</span><span style="font-family: 'Lucida Bright'">new</span><span style="font-family: 宋体">一个，或者从</span><span style="font-family: 'Lucida Bright'">JNDI</span><span style="font-family: 宋体">中查询一个），使用完之后还要将对象销毁（比</span><span style="font-family: 宋体">如</span><span style="font-family: 'Lucida Bright'">Connection</span><span style="font-family: 宋体">等），对象始终会和其他的接口或类藕合起来。</span></font></p>
<p><font color="#006400"><span style="font-family: 宋体">　　那么</span><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">是如何做的呢？有点像通过婚介找女朋友，在我和女朋友之间引入了一个第三者：婚姻介绍所。婚介管理了很多男男女女的资料，我可以向婚</span><span style="font-family: 宋体">介提出一个列表，告诉它我想找个什么样的女朋友，比如长得像李嘉欣，身材像林熙雷，唱歌像周杰伦，速度像卡洛斯，技术像齐达内之类的，然后婚介就会按照我</span><span style="font-family: 宋体">们的要求，提供一个</span><span style="font-family: 'Lucida Bright'">mm</span><span style="font-family: 宋体">，我们只需要去和她谈恋爱、结婚就行了。简单明了，如果婚介给我们的人选不符合要求，我们就会抛出异常。整个过程不再由我自己控</span><span style="font-family: 宋体">制，而是有婚介这样一个类似容器的机构来控制。</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">所倡导的开发方式就是如此，所有的类都会在</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">容器中登记，告诉</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">你是个什</span><span style="font-family: 宋体">么东西，你需要什么东西，然后</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">会在系统运行到适当的时候，把你要的东西主动给你，同时也把你交给其他需要你的东西。所有的类的创建、销毁都由</span><span style="font-family: 'Lucida Bright'"> spring</span><span style="font-family: 宋体">来控制，也就是说控制对象生存周期的不再是引用它的对象，而是</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">。对于某个具体的对象而言，以前是它控制其他对象，现在是所有对象</span><span style="font-family: 宋体">都被</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">控制，所以这叫控制反转。如果你还不明白的话，我决定放弃。</span></font></p>
<p style="text-indent: 21pt"><font color="#006400"><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">的一个重点是在系统运行中，动态的向某个对象提供它所需要的其他对象。这一点是通过</span><span style="font-family: 'Lucida Bright'">DI</span><span style="font-family: 宋体">（</span><span style="font-family: 'Lucida Bright'">Dependency Injection</span><span style="font-family: 宋体">，依赖注入）来实现的。比如对象</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">需要操作数据库，以前我们总是要在</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">中自己编写代码来获得一个</span><span style="font-family: 'Lucida Bright'">Connection</span><span style="font-family: 宋体">对象，有了</span><span style="font-family: 'Lucida Bright'"> spring</span><span style="font-family: 宋体">我们就只需要告诉</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">，</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">中需要一个</span><span style="font-family: 'Lucida Bright'">Connection</span><span style="font-family: 宋体">，至于这个</span><span style="font-family: 'Lucida Bright'">Connection</span><span style="font-family: 宋体">怎么构造，何时构造，</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">不需要知道。在系统</span><span style="font-family: 宋体">运行时，</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">会在适当的时候制造一个</span><span style="font-family: 'Lucida Bright'">Connection</span><span style="font-family: 宋体">，然后像打针一样，注射到</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">当中，这样就完成了对各个对象之间关系的控制。</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">需要依赖</span><span style="font-family: 'Lucida Bright'"> Connection</span><span style="font-family: 宋体">才能正常运行，而这个</span><span style="font-family: 'Lucida Bright'">Connection</span><span style="font-family: 宋体">是由</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">注入到</span><span style="font-family: 'Lucida Bright'">A</span><span style="font-family: 宋体">中的，依赖注入的名字就这么来的。那么</span><span style="font-family: 'Lucida Bright'">DI</span><span style="font-family: 宋体">是如何实现的呢？</span><span style="font-family: 'Lucida Bright'"> Java 1.3</span><span style="font-family: 宋体">之后一个重要特征是反射（</span><span style="font-family: 'Lucida Bright'">reflection</span><span style="font-family: 宋体">），它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性，</span><span style="font-family: 'Lucida Bright'">spring</span><span style="font-family: 宋体">就是通过反射来实现注入的。关于反射的相关资料请查阅</span><span style="font-family: 'Lucida Bright'">java doc</span><span style="font-family: 宋体">。</span></font></p>
<hr width="100%" size="2" />
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 我想通过</span><span style="font-family: 'Lucida Bright'">Bromon</span><span style="font-family: 宋体">的介绍，大家对</span><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">和</span><span style="font-family: 'Lucida Bright'">DI</span><span style="font-family: 宋体">都有了比较生动的理解了。再来看看《</span><span style="font-family: 'Lucida Bright'">expert one-on-one J2EE Development without EJB</span><span style="font-family: 宋体">中文版》是怎么解释这两个概念的。书上是这么说的：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">是一个很大的概念，可以用不同的方式来实现。主要的实现形式有两种</span><span style="font-family: 'Lucida Bright'">:</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">依赖查找：容器提供回调接口和上下文环境给组件。</span><span style="font-family: 'Lucida Bright'">EJB</span><span style="font-family: 宋体">和</span><span style="font-family: 'Lucida Bright'">Apache Avalon</span><span style="font-family: 宋体">都是使用这种方式。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">依赖注入：组件不做定位查询，只是提供普通的</span><span style="font-family: 'Lucida Bright'">Java</span><span style="font-family: 宋体">方法让容器去决定依赖关系。容器全权负责组件的装配，它会把符合依赖关系的对象通过</span><span style="font-family: 'Lucida Bright'">JavaBean</span><span style="font-family: 宋体">属性或者构造子传递给需要的对象。通过</span><span style="font-family: 'Lucida Bright'">JavaBean</span><span style="font-family: 宋体">属性注射依赖关系的做法称为设值方法注入（</span><span style="font-family: 'Lucida Bright'">Setter Injection</span><span style="font-family: 宋体">）；将依赖关系作为构造子参数传入的做法称为构造子注入（</span><span style="font-family: 'Lucida Bright'">Constructor Injection</span><span style="font-family: 宋体">）。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">附图说明：</span></p>
<br />
<p style="text-indent: 21pt"><img height="269" alt="spring_2.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/easyspring/spring_2.jpg" width="555" border="0" /></p>
&nbsp;&nbsp;&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">到这里，大家应该对</span><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">与</span><span style="font-family: 'Lucida Bright'">DI</span><span style="font-family: 宋体">都有了初步的认识了。其实就</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">来说，就是</span><span style="font-family: 'Lucida Bright'">JavaBean</span><span style="font-family: 宋体">由</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">来管理组装，表面上看就少了几个</span><span style="font-family: 'Lucida Bright'">new</span><span style="font-family: 宋体">字，其实就是为了降低耦合度，这也是我们做软件的目标之一。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">至于</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">是怎样实现</span><span style="font-family: 'Lucida Bright'">IoC</span><span style="font-family: 宋体">的，</span><span style="font-family: 宋体">《</span><span style="font-family: 'Lucida Bright'">expert one-on-one J2EE Development without EJB</span><span style="font-family: 宋体">中文版》第七章&#8220;</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">框架介绍&#8221;很详细的列举了多种方法。说实在，一下子看这么多，我真有点糊涂了。我还是自己写个</span><span style="font-family: 'Lucida Bright'">Demo</span><span style="font-family: 宋体">熟悉一下大名鼎鼎的</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">吧。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">首先得下载</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">。</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">网上有两种</span><span style="font-family: 'Lucida Bright'">Spring </span><span style="font-family: 宋体">包一种是</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6-with-dependencies.zip</span><span style="font-family: 宋体">，另一种是</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6.zip</span><span style="font-family: 宋体">。当然最好是下载</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6-with-dependencies.zip</span><span style="font-family: 宋体">形式的，因为里面包括了更多的东东。</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6-with-dependencies.zip</span><span style="font-family: 宋体">的下载地址是：</span><span style="font-family: 'Lucida Bright'"><a href="http://prdownloads.sourceforge.net/springframework/spring-framework-1.2.6-with-dependencies.zip">http://prdownloads.sourceforge.net/springframework/spring-framework-1.2.6-with-dependencies.zip</a></span><span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">下载下来，解压后，你会发现里面有很多</span><span style="font-family: 'Lucida Bright'">jar</span><span style="font-family: 宋体">文件。因为刚刚接触</span><span style="font-family: 'Lucida Bright'">Spring</span><span style="font-family: 宋体">，因此我只需要</span><span style="font-family: 'Lucida Bright'">spring-core.jar</span><span style="font-family: 宋体">（</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6"dist</span><span style="font-family: 宋体">），将其导入</span><span style="font-family: 'Lucida Bright'">eclipse</span><span style="font-family: 宋体">的构建路径中。另外，</span><span style="font-family: 'Lucida Bright'">log</span><span style="font-family: 宋体">日志是需要的，这也是为了养成良好的编程习惯。将</span><span style="font-family: 'Lucida Bright'">log4j-1.2.9.jar</span><span style="font-family: 宋体">（</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6"lib"log4j</span><span style="font-family: 宋体">）和</span><span style="font-family: 'Lucida Bright'">commons-logging.jar</span><span style="font-family: 宋体">（</span><span style="font-family: 'Lucida Bright'">spring-framework-1.2.6"lib"jakarta-commons</span><span style="font-family: 宋体">）导入到构建路径中。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">准备就绪，开始写</span><span style="font-family: 'Lucida Bright'">Demo</span><span style="font-family: 宋体">了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">我的工程的结构是：</span></p>
&nbsp;&nbsp; <img height="226" alt="spring_1.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/easyspring/spring_1.jpg" width="251" border="0" /><br />
<p style="margin-left: 39pt; text-indent: -18pt">&lt;!--[if !supportLists]--&gt;<span style="font-family: 'Lucida Bright'">1、</span>&lt;!--[endif]--&gt;<span style="font-family: 'Lucida Bright'">log4j.properties</span><span style="font-family: 宋体">代码：</span></p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">log4j.rootLogger</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">Debug,&nbsp;stdout<br />
log4j.appender.stdout</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">org.apache.log4j.ConsoleAppender<br />
log4j.appender.stdout.layout</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">org.apache.log4j.PatternLayout<br />
log4j.appender.stdout.layout.ConversionPattern</span><span style="color: rgb(0,0,0)">=%</span><span style="color: rgb(0,0,0)">c{</span><span style="color: rgb(0,0,0)">1</span><span style="color: rgb(0,0,0)">}&nbsp;</span><span style="color: rgb(0,0,0)">-</span>&nbsp;<span style="color: rgb(0,0,0)">%</span><span style="color: rgb(0,0,0)">m</span><span style="color: rgb(0,0,0)">%</span><span style="color: rgb(0,0,0)">n<br />
</span></div>
<p style="margin-left: 21pt"><span style="color: rgb(97,77,179); font-family: 宋体">如何使用</span><span style="color: rgb(97,77,179); font-family: 'Lucida Bright'">Log4j</span><span style="color: rgb(97,77,179); font-family: 宋体">，请看我的另一篇转贴的文章：</span><a href="http://www.blogjava.net/rickhunter/articles/28133.html"><span style="font-family: 宋体">如何使用</span><span style="font-family: 'Lucida Bright'">Log4J</span></a><span style="font-family: 宋体">。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt">&lt;!--[if !supportLists]--&gt;<span style="font-family: 'Lucida Bright'">2、</span>&lt;!--[endif]--&gt;<span style="font-family: 'Lucida Bright'">HelloBean</span><span style="font-family: 宋体">的代码：</span></p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;HelloBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;helloworld</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello!World!</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;getHelloworld()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;helloworld;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setHelloworld(String&nbsp;helloworld)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.helloworld&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;helloworld;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<p style="margin-left: 21pt"><span style="font-family: 宋体">这是一个简单的</span><span style="font-family: 'Lucida Bright'">JavaBean</span><span style="font-family: 宋体">，有个</span><span style="font-family: 'Lucida Bright'">String</span><span style="font-family: 宋体">类型的</span><span style="font-family: 'Lucida Bright'">helloworld</span><span style="font-family: 宋体">属性，初始值是</span><span style="font-family: 'Lucida Bright'">"Hello!World!"</span><span style="font-family: 宋体">。</span>&nbsp;</p>
<p style="margin-left: 39pt; text-indent: -18pt">&lt;!--[if !supportLists]--&gt;<span style="font-family: 'Lucida Bright'">3、</span>&lt;!--[endif]--&gt;<span style="font-family: 'Lucida Bright'">Bean.xml</span><span style="font-family: 宋体">代码：</span></p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">&lt;?</span><span style="color: rgb(0,0,0)">xml&nbsp;version</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">1.0</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;encoding</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">GBK</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">?&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;!</span><span style="color: rgb(0,0,0)">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">-//SPRING/DTD&nbsp;BEAN/EN</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">http://www.springframework.org/dtd/spring-beans.dtd</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">beans</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">bean&nbsp;id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">helloBean</span><span style="color: rgb(0,0,0)">"</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">com.HelloBean</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">property&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">helloworld</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">value</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">Hello</span><span style="color: rgb(0,0,0)">!</span><span style="color: rgb(0,0,0)">Rick</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">value</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">property</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">bean</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">beans</span><span style="color: rgb(0,0,0)">&gt;<br />
</span></div>
<p style="margin-left: 39pt; text-indent: -18pt"><span style="color: black; font-family: 'Lucida Bright'">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Spirng重点之一就是配置文件，上面是个相当简单的配置文件，我想大家都应该看得懂。最后就是写应用程序了。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt"><span style="color: black; font-family: 'Lucida Bright'">4、</span>&lt;!--[endif]--&gt;<span style="background: white 0% 50%; color: black; font-family: 'Lucida Bright'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">Test</span><span style="background: white 0% 50%; color: black; font-family: 宋体; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">的代码：</span></p>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com;<br />
<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.beans.factory.</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.beans.factory.xml.XmlBeanFactory;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.core.io.ClassPathResource;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.core.io.Resource;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Test&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">static</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">实例化JavaBean，主要是为了比较new对象和依赖注入两者的区别</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloBean&nbsp;hellobean</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;HelloBean();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hellobean.getHelloworld());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">通过Spring访问JavaBean组件</span><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource&nbsp;resource</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;ClassPathResource(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">com/bean.xml</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory&nbsp;factory</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;XmlBeanFactory(resource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hellobean</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">(HelloBean)factory.getBean(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">helloBean</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hellobean.getHelloworld());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
&nbsp;&nbsp;&nbsp; 这个Demo很好的阐述了Spring的Ioc，其实就Spring而言，就是通过配置文件，让Spring如同一个管家一样来管理所有的Bean类。<br />
<br />
&nbsp;&nbsp;&nbsp; Spring的依赖注入相对复杂一点，主要是明白调用别的Bean，不是通过实例化对象来调用，而是告诉Spring，我需要什么Bean，然后Spring再向你的Bean里面注入你所需要的Bean对象。<br />
&nbsp;&nbsp;&nbsp; 接下来说说代码实现，我只是在刚刚的例子上再添加一点东东。<br />
&nbsp;&nbsp;&nbsp; 首先要增加一个HelloImp的接口，这是问什么呢，那你得问Spring，它定的规矩：JavaBean的实现要有两个部分，一个接口，一个默认实现。你不照做就不行。<br />
&nbsp;&nbsp;&nbsp; HelloImp代码：&nbsp;&nbsp; <br />
&nbsp; &nbsp;&nbsp;&nbsp;
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">interface</span><span style="color: rgb(0,0,0)">&nbsp;HelloImp&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;getName();<br />
}</span><span style="color: rgb(0,0,0)"><br />
</span></div>
&nbsp;&nbsp;&nbsp; <span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp; 实现HelloImp的Hello代码：<br />
</span>&nbsp;&nbsp;
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Hello&nbsp;</span><span style="color: rgb(0,0,255)">implements</span><span style="color: rgb(0,0,0)">&nbsp;HelloImp&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;getName(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Jack</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br />
<span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; 接着就是在</span><span style="color: black; font-family: 'Lucida Bright'">HelloBean</span><span style="color: black; font-family: 宋体">中调用</span><span style="color: black; font-family: 'Lucida Bright'">Hello</span><span style="color: black; font-family: 宋体">了。</span><span style="color: black; font-family: 'Lucida Bright'">Spring</span><span style="color: black; font-family: 宋体">的不同之处也在这体现出来。</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;HelloBean&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;helloworld</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">Hello!World!</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;<strong>&nbsp;</strong></span><strong><font color="#006400"><font face="Courier New"><span style="color: rgb(0,0,255)">private</span></font><span style="color: rgb(0,0,0)"><font face="Courier New">&nbsp;HelloImp&nbsp;hello;&nbsp;</font>&nbsp;</span><span style="color: rgb(0,128,0)">//</span><span style="color: rgb(0,128,0)">注意这个私有对象是借口</span></font></strong><span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;getHelloworld()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;helloworld;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setHelloworld(String&nbsp;helloworld)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.helloworld&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;helloworld;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font face="Courier New"><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setHello(HelloImp&nbsp;hello)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.hello&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;hello;<br />
&nbsp; &nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; </span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;get(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="color: rgb(0,0,255)">this</span></font></strong><span style="color: rgb(0,0,0)"><strong><font face="Courier New">.hello.getName();<br />
&nbsp;&nbsp; }</font></strong><br />
}<br />
</span></div>
<span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 注意字体加粗的地方。<br />
</span><span style="font-family: 宋体"><br />
&nbsp;&nbsp;&nbsp; 配置文件也需要增加一点东西：</span> <br />
&nbsp;&nbsp;&nbsp;
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,0)">&lt;?</span><span style="color: rgb(0,0,0)">xml&nbsp;version</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">1.0</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;encoding</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">GBK</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">?&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;!</span><span style="color: rgb(0,0,0)">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">-//SPRING/DTD&nbsp;BEAN/EN</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">http://www.springframework.org/dtd/spring-beans.dtd</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">beans</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;!</span><span style="color: rgb(0,0,0)">—注意引用的类是具体的类Hello</span><span style="color: rgb(0,0,0)">--&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">bean&nbsp;id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">myHello</span><span style="color: rgb(0,0,0)">"</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">com.Hello</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">bean</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">bean&nbsp;id</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">helloBean</span><span style="color: rgb(0,0,0)">"</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">com.HelloBean</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">property&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">helloworld</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">value</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">Hello</span><span style="color: rgb(0,0,0)">!</span><span style="color: rgb(0,0,0)">Rick</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">value</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">property</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">property&nbsp;name</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">hello</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">ref&nbsp;bean</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">myHello</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&gt;&lt;/</span><span style="color: rgb(0,0,0)">ref</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">property</span><span style="color: rgb(0,0,0)">&gt;</span></strong><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">bean</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0)">&lt;/</span><span style="color: rgb(0,0,0)">beans</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; 注意字体加粗的部分。<br />
<br />
&nbsp;&nbsp;&nbsp; <span style="color: black; font-family: 宋体">最后在</span><span style="color: black; font-family: 'Lucida Bright'">Test</span><span style="color: black; font-family: 宋体">中添加一句</span><span style="color: black; font-family: 'Lucida Bright'">hellobean.get();</span><span style="color: black; font-family: 宋体">就可以看到结果了。<br />
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;com;<br />
<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.beans.factory.</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.beans.factory.xml.XmlBeanFactory;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.core.io.ClassPathResource;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;org.springframework.core.io.Resource;<br />
</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;Test&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span>&nbsp;<span style="color: rgb(0,0,255)">static</span>&nbsp;<span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloBean&nbsp;hellobean</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;HelloBean();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hellobean.getHelloworld());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource&nbsp;resource</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;ClassPathResource(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">com/bean.xml</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory&nbsp;factory</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;XmlBeanFactory(resource);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hellobean</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">(HelloBean)factory.getBean(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">helloBean</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hellobean.getHelloworld());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>hellobean.get();</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
</span><br />
到这，Spring的IoC和DI总算有了一定的认识，也算是敲开了Spring的大门了。<br />
<img src ="http://www.blogjava.net/EricGu/aggbug/259042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/EricGu/" target="_blank">Eric Gu</a> 2009-03-11 11:06 <a href="http://www.blogjava.net/EricGu/archive/2009/03/11/259042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>