<div id="article_content" class="article_content tracking-ad" data-mod="popu_307" data-dsm="post">
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
欢迎大家向我推荐你在面试过程中遇到关于<a href="http://lib.csdn.net/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">spring</a>的问题。我会把大家推荐的问题添加到下面的Spring常用面试题清单中供大家参考。</p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t0" target="_blank"></a>
问题清单:</h3>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">什么是Spring框架?Spring框架有哪些主要模块?</li><li style="border:0px; margin:0px; padding:0px">使用Spring框架有什么好处?</li><li style="border:0px; margin:0px; padding:0px">什么是控制反转(IOC)?什么是依赖注入?</li><li style="border:0px; margin:0px; padding:0px">请解释下Spring中的IOC?</li><li style="border:0px; margin:0px; padding:0px">BeanFactory和ApplicationContext有什么区别?</li><li style="border:0px; margin:0px; padding:0px">将Spring配置到你的应用中共有几种方法?</li><li style="border:0px; margin:0px; padding:0px">什么基于XML的配置?</li><li style="border:0px; margin:0px; padding:0px">什么基Java的配置?</li><li style="border:0px; margin:0px; padding:0px">怎样用注解的方式配置Spring?</li><li style="border:0px; margin:0px; padding:0px">描述Spring Bean的生命周期?</li><li style="border:0px; margin:0px; padding:0px">描述Spring中各种Bean的范围?</li><li style="border:0px; margin:0px; padding:0px">什么是Spring的嵌入beans?</li><li style="border:0px; margin:0px; padding:0px">Spring框架中的单例bean是否是线程安全的?</li><li style="border:0px; margin:0px; padding:0px">请举例说明如何用Spring注入一个Java的集合类?</li><li style="border:0px; margin:0px; padding:0px">请举例说明如何在Spring的Bean中注入一个java.util.Properties?</li><li style="border:0px; margin:0px; padding:0px">请解释Spring的Bean的自动生成原理?</li><li style="border:0px; margin:0px; padding:0px">请辨析自动生成Bean之间模块的区别?</li><li style="border:0px; margin:0px; padding:0px">如何开启基于基于注解的自动写入?</li><li style="border:0px; margin:0px; padding:0px">请举例说明@Required注解?</li><li style="border:0px; margin:0px; padding:0px">请举例说明@Autowired注解?</li><li style="border:0px; margin:0px; padding:0px">请举例说明@Qualifier注解?</li><li style="border:0px; margin:0px; padding:0px">请说明构造器注入和setter方法注入之间的区别?</li><li style="border:0px; margin:0px; padding:0px">Spring框架中不同类型event有什么区别?</li><li style="border:0px; margin:0px; padding:0px">FileSystemResource和ClassPathResource有何区别?</li><li style="border:0px; margin:0px; padding:0px">请列举Spring框架中用了哪些设计模式?</li></ol>
<div><span style="font-family:Microsoft YaHei,宋体,Myriad Pro,Lato,Helvetica Neue,Helvetica,Arial,sans-serif"><span style="font-size:14px; line-height:21px"><br>
</span></span></div>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t1" target="_blank"></a>
<span style="color:#006600">1、什么是Spring框架?Spring框架有哪些主要模块?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架是一个为<a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照<span class="wp_keywordlink_affiliate" style="border:0px; margin:0px; padding:0px"><a target="_blank" href="http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=importnew-23&linkCode=as2&camp=536&creative=3200&creativeASIN=B001130JN8" title="设计模式:可复用面向对象软件的基础" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">设计模式</a></span>精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>模块。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<span style="border:0px; margin:0px; padding:0px"><img src="https://img-blog.csdn.net/20150612131709937" alt=""></span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="spring_benefits" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t2" target="_blank"></a>
<span style="color:#006600">2、使用Spring框架能带来哪些好处?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面列举了一些使用Spring框架带来的主要好处:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><a target="_blank" title="Inversion of control (IoC) and dependency injection (DI) patterns in spring framework and related interview questions" href="http://howtodoinjava.com/2013/03/19/inversion-of-control-ioc-and-dependency-injection-di-patterns-in-spring-framework-and-related-interview-questions/" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)"><span style="border:0px; margin:0px; padding:0px">Dependency
Injection(DI)</span></a> 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。</li><li style="border:0px; margin:0px; padding:0px">与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。</li><li style="border:0px; margin:0px; padding:0px">Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。</li><li style="border:0px; margin:0px; padding:0px">Spring框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。</li><li style="border:0px; margin:0px; padding:0px">要<a target="_blank" href="http://howtodoinjava.com/2013/04/19/how-to-unit-test-spring-security-authentication-with-junit/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">测试一项用Spring开发的应用程序</a>十分简单,因为测试相关的环境代码都已经囊括在框架中了。更加简单的是,利用JavaBean形式的POJO类,可以很方便的利用依赖注入来写入测试数据。</li><li style="border:0px; margin:0px; padding:0px">Spring的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有力选项。</li><li style="border:0px; margin:0px; padding:0px">Spring提供了一个便捷的事务管理接口,适用于小型的本地事物处理(比如在单DB的环境下)和复杂的共同事物处理(比如利用JTA的复杂DB环境)。</li></ul>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="ioc_di" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t3" target="_blank"></a>
<span style="color:#006600">3、什么是控制反转(IOC)?什么是依赖注入?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Java中依然注入有以下三种实现方式:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">构造器注入</li><li style="border:0px; margin:0px; padding:0px">Setter方法注入</li><li style="border:0px; margin:0px; padding:0px">接口注入</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="ioc_in_spring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t4" target="_blank"></a>
<span style="color:#006600">4、请解释下Spring框架中的IoC?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring中的 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">org.springframework.beans</code> 包和 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">org.springframework.context</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">包构成了</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">框架</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">IoC</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">容器的基础。</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
BeanFactory 接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContex</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">接口对</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">BeanFactory</code>(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与<a target="_blank" href="http://howtodoinjava.com/category/frameworks/java-spring-tutorials/spring-aop/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">Spring的AOP</a>更容易集成,也提供了处理<a target="_blank" href="http://howtodoinjava.com/2015/02/10/spring-mvc-internationalization-i18n-and-localization-i10n-example/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">message
resource的机制</a>(用于国际化)、事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><span style="border:0px; margin:0px; padding:0px; background-color:rgb(153,255,153)">org.springframework.beans.factory.BeanFactory</span></code> 是Spring
IoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。<span style="border:0px; margin:0px; padding:0px"><br>
</span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转。<br>
</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="beanfactory_vs_applicationcontext" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t5" target="_blank"></a>
<span style="color:#006600">5、BeanFactory和ApplicationContext有什么区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">提供了支持国际化的文本消息</li><li style="border:0px; margin:0px; padding:0px">统一的资源文件读取方式</li><li style="border:0px; margin:0px; padding:0px">已在监听器中注册的bean的事件</li></ol>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
以下是三种较常见的 ApplicationContext 实现方式:</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 524px; top: 3260px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>ApplicationContext </span><span class="attribute">context</span><span> = </span><span class="attribute-value">new</span><span> ClassPathXmlApplicationContext(“bean.xml”); </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_1_7618360" name="code" class="html" style="display: none;">ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);</pre>
<p></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_345856" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<span style="font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:14px">2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。</span></div>
</div>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_751431" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 3380px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>ApplicationContext </span><span class="attribute">context</span><span> = </span><span class="attribute-value">new</span><span> FileSystemXmlApplicationContext(“bean.xml”); </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_2_694213" name="code" class="html" style="display: none;">ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="spring_configuration_types" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t6" target="_blank"></a>
<span style="color:#006600">6、Spring有几种配置方式?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
将Spring配置到应用开发中有以下三种方式:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">基于XML的配置</li><li style="border:0px; margin:0px; padding:0px">基于注解的配置</li><li style="border:0px; margin:0px; padding:0px">基于Java的配置</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="xml_based_configuration" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t7" target="_blank"></a>
<span style="color:#006600">7、如何用基于XML配置的方式配置Spring?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中,依赖和服务需要在专门的配置文件来实现,我常用的XML格式的配置文件。这些配置文件的格式通常用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><beans></code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">开头,然后一系列的</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">定义和专门的应用配置选项组成。</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
SpringXML配置的主要目的时候是使所有的Spring组件都可以用xml文件的形式来进行配置。这意味着不会出现其他的Spring配置类型(比如声明的方式或基于<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java </a>Class的配置方式)</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring的XML配置方式是使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_748229" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 3914px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- JSON Support --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"viewResolver"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.servlet.view.BeanNameViewResolver"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jsonTemplate"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.servlet.view.json.MappingJackson2JsonView"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"restTemplate"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.client.RestTemplate"</span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_3_2341607" name="code" class="html" style="display: none;"><beans>
<!-- JSON Support -->
<bean name="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
</beans></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面这个web.xml仅仅配置了<span style="border:0px; margin:0px; padding:0px">DispatcherServlet,</span>这件最简单的配置便能满足应用程序配置运行时组件的需求。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_628016" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 4160px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">web-app</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">display-name</span><span class="tag">></span><span>Archetype Created Web Application</span><span class="tag"></</span><span class="tag-name">display-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>spring</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-class</span><span class="tag">></span><span>org.springframework.web.servlet.DispatcherServlet</span><span class="tag"></</span><span class="tag-name">servlet-class</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">load-on-startup</span><span class="tag">></span><span>1</span><span class="tag"></</span><span class="tag-name">load-on-startup</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>spring</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">url-pattern</span><span class="tag">></span><span>/</span><span class="tag"></</span><span class="tag-name">url-pattern</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">web-app</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_4_9354173" name="code" class="html" style="display: none;"><web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app></pre><br>
</div>
</div>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t8" target="_blank"></a>
<span style="color:#006600">8、如何用基于Java配置的方式配置Spring?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/> 元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
最简单的@Configuration 声明类请参考下面的代码:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_983118" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 4661px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppConfig{ </span></span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> MyService myService() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> MyServiceImpl(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_5_2778691" name="code" class="java" style="display: none;">@Configuration
public class AppConfig{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}</pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
对于上面的@Beans配置文件相同的XML配置文件如下:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_348868" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 4908px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"myService"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.services.MyServiceImpl"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_6_6029268" name="code" class="html" style="display: none;"><beans>
<bean id="myService" class="com.somnus.services.MyServiceImpl"/>
</beans></pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
上述配置方式的实例化方式如下:利用AnnotationConfigApplicationContext 类进行实例化</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 522px; top: 5064px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) { </span></span></li><li class=""><span> ApplicationContext ctx = <span class="keyword">new</span><span> AnnotationConfigApplicationContext(AppConfig.</span><span class="keyword">class</span><span>); </span></span></li><li class="alt"><span> MyService myService = ctx.getBean(MyService.<span class="keyword">class</span><span>); </span></span></li><li class=""><span> myService.doStuff(); </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_7_6248202" name="code" class="java" style="display: none;">public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}</pre>
<p></p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
要使用组件组建扫描,仅需用@Configuration进行注解即可:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_381042" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 5262px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@ComponentScan</span><span>(basePackages = </span><span class="string">"com.somnus"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppConfig { </span></span></li><li class=""><span> ... </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_8_8767647" name="code" class="java" style="display: none;">@Configuration
@ComponentScan(basePackages = "com.somnus")
public class AppConfig {
...
}</pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在上面的例子中,com.acme包首先会被扫到,然后再容器内查找被@Component 声明的类,找到后将这些类按照Sring bean定义进行注册。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
如果你要在你的web应用开发中选用上述的配置的方式的话,需要用AnnotationConfigWebApplicationContext 类来读取配置文件,可以用来配置Spring的Servlet监听器ContrextLoaderListener或者Spring MVC的DispatcherServlet。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_562032" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 5535px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">web-app</span><span class="tag">></span><span> </span></span></li><li class=""><span> <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext </span></li><li class="alt"><span> instead of the default XmlWebApplicationContext --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextClass</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <!-- Configuration locations must consist of one or more comma- or space-delimited </span></li><li class=""><span> fully-qualified @Configuration classes. Fully-qualified packages may also be </span></li><li class="alt"><span> specified for component-scanning --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextConfigLocation</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span>com.howtodoinjava.AppConfig</span><span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- Bootstrap the root application context as usual using ContextLoaderListener --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">listener</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">listener-class</span><span class="tag">></span><span>org.springframework.web.context.ContextLoaderListener</span><span class="tag"></</span><span class="tag-name">listener-class</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">listener</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- Declare a Spring MVC DispatcherServlet as usual --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>dispatcher</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-class</span><span class="tag">></span><span>org.springframework.web.servlet.DispatcherServlet</span><span class="tag"></</span><span class="tag-name">servlet-class</span><span class="tag">></span><span> </span></span></li><li class=""><span> <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext </span></li><li class="alt"><span> instead of the default XmlWebApplicationContext --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextClass</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> <!-- Again, config locations must consist of one or more comma- or space-delimited </span></li><li class="alt"><span> and fully-qualified @Configuration classes --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextConfigLocation</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span>com.howtodoinjava.web.MvcConfig</span><span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- map all requests for /app/* to the dispatcher servlet --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>dispatcher</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">url-pattern</span><span class="tag">></span><span>/app/*</span><span class="tag"></</span><span class="tag-name">url-pattern</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">web-app</span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_9_1985204" name="code" class="html" style="display: none;"><web-app>
<!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
instead of the default XmlWebApplicationContext -->
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<!-- Configuration locations must consist of one or more comma- or space-delimited
fully-qualified @Configuration classes. Fully-qualified packages may also be
specified for component-scanning -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.howtodoinjava.AppConfig</param-value>
</context-param>
<!-- Bootstrap the root application context as usual using ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Declare a Spring MVC DispatcherServlet as usual -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
instead of the default XmlWebApplicationContext -->
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<!-- Again, config locations must consist of one or more comma- or space-delimited
and fully-qualified @Configuration classes -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.howtodoinjava.web.MvcConfig</param-value>
</init-param>
</servlet>
<!-- map all requests for /app/* to the dispatcher servlet -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app</pre></div>
</div>
<p><br>
</p>
<p><br>
</p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t9" target="_blank"></a>
<span style="color:#006600">9、怎样用注解的方式配置Spring?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_479638" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 6897px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_10" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context:annotation-config</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- bean definitions go here --></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_10_1680750" name="code" class="html" style="display: none;"><beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans></pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在 <context:annotation-config/>标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面是几种比较重要的注解类型:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">@Required:</span>该注解应用于设值方法。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">@Autowired:</span>该注解应用于有值设值方法、非设值方法、构造方法和变量。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">@Qualifier:</span>该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">JSR-250 Annotations:</span>Spring支持基于JSR-250 注解的以下注解,@Resource、@PostConstruct 和 @PreDestroy。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="bean_lifecycle" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t10" target="_blank"></a>
<span style="color:#006600">10、请解释Spring Bean的生命周期?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">初始化之后调用的回调方法。</li><li style="border:0px; margin:0px; padding:0px">销毁之前调用的回调方法。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架提供了以下四种方式来管理bean的生命周期事件:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">InitializingBean和DisposableBean回调接口</li><li style="border:0px; margin:0px; padding:0px">针对特殊行为的其他Aware接口</li><li style="border:0px; margin:0px; padding:0px">Bean配置文件中的Custom init()方法和destroy()方法</li><li style="border:0px; margin:0px; padding:0px">@PostConstruct和@PreDestroy注解方式</li></ul>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">customInit()</code>和 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">customDestroy()</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">方法管理</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">生命周期的代码样例如下:</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_479810" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 7629px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_11" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_11" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=11&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"demoBean"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.task.DemoBean"</span><span> </span><span class="attribute">init-method</span><span>=</span><span class="attribute-value">"customInit"</span><span> </span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">"customDestroy"</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_11_1376296" name="code" class="html" style="display: none;"><beans>
<bean id="demoBean" class="com.somnus.task.DemoBean" init-method="customInit" destroy-method="customDestroy"></bean>
</beans></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
更多内容请参考:Spring生命周期<a target="_blank" title="Spring Bean Life Cycle" href="http://howtodoinjava.com/2013/05/07/spring-bean-life-cycle/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">Spring
Bean Life Cycle</a>。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="bean_scopes" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t11" target="_blank"></a>
<span style="color:#006600">11、Spring Bean的作用域之间有什么区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。</li><li style="border:0px; margin:0px; padding:0px">prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。</li><li style="border:0px; margin:0px; padding:0px">request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。</li><li style="border:0px; margin:0px; padding:0px">Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。</li><li style="border:0px; margin:0px; padding:0px">global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。</li></ol>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
全局作用域与Servlet中的session作用域效果相同。<span style="border:0px; margin:0px; padding:0px"></span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<span style="border:0px; margin:0px; padding:0px">更多内容请参考 :</span> <a target="_blank" title="Spring bean scopes" href="http://howtodoinjava.com/2013/05/07/spring-bean-scopes/" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">Spring
Bean Scopes</a>。<br>
<a target="_blank" name="inner_beans" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t12" target="_blank"></a>
<span style="color:#006600">12、什么是Spring inner beans?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean声明为内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们的要做的是创建一个Person的实例,然后在Customer内部使用。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_942139" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 8299px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_12" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_12" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=12&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Customer{ </span></span></li><li class=""><span> <span class="keyword">private</span><span> Person person; </span></span></li><li class="alt"><span> <span class="comment">//Setters and Getters</span><span> </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_12_2434263" name="code" class="java" style="display: none;">public class Customer{
private Person person;
//Setters and Getters
}</pre><br>
</div>
</div>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_595794" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 8472px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_13" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_13" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=13&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Person{ </span></span></li><li class=""><span> <span class="keyword">private</span><span> String name; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String address; </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> age; </span></span></li><li class="alt"><span> <span class="comment">//Setters and Getters</span><span> </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_13_1224737" name="code" class="java" style="display: none;">public class Person{
private String name;
private String address;
private int age;
//Setters and Getters
}</pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
内部bean的声明方式如下:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_300618" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 8701px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_14" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_14" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=14&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"CustomerBean"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Customer"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"person"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- This is inner bean --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.common.Person"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"lokesh"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"address"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"India"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"age"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"34"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_14_4769972" name="code" class="html" style="display: none;"><bean id="CustomerBean" class="com.somnus.common.Customer">
<property name="person">
<!-- This is inner bean -->
<bean class="com.howtodoinjava.common.Person">
<property name="name" value="lokesh" />
<property name="address" value="India" />
<property name="age" value="34" />
</bean>
</property>
</bean></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="singleton_bean_threadsafe" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t13" target="_blank"></a>
<span style="color:#006600">13、Spring框架中的单例Beans是线程安全的么?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架并没有对<a target="_blank" href="http://howtodoinjava.com/2012/10/22/singleton-design-pattern-in-java/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">单例</a>bean进行任何多线程的封装处理。关于单例bean的<a target="_blank" href="http://howtodoinjava.com/2014/06/02/what-is-thread-safety/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">线程安全</a>和并发问题需要开发者自行去搞定。但实际上,大部分的Spring
bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
最浅显的解决办法就是将多态bean的作用域由<span style="border:0px; margin:0px; padding:0px">“singleton</span>”变更为“<span style="border:0px; margin:0px; padding:0px">prototype</span>”。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="inject_collection" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t14" target="_blank"></a>
<span style="color:#006600">14、请举例说明如何在Spring中注入一个Java Collection?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring提供了以下四种集合类的配置元素:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><list></span> : 该标签用来装配可重复的list值。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><set></span> : 该标签用来装配没有重复的set值。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><map></span>: 该标签可用来注入键和值可以为任何类型的键值对。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><props></span> : 该标签支持注入键和值都是字符串类型的键值对。</li></ul>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面看一下具体的例子:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_536906" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 9384px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_15" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_15" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=15&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- Definition for javaCollection --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"javaCollection"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.JavaCollection"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- java.util.List --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customList"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">list</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>INDIA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>Pakistan</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>USA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>UK</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">list</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- java.util.Set --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customSet"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>INDIA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>Pakistan</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>USA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>UK</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- java.util.Map --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customMap"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">map</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"1"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"INDIA"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"2"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"Pakistan"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"3"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"USA"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"4"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"UK"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">map</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- java.util.Properties --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customProperies"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"admin"</span><span class="tag">></span><span>admin@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"support"</span><span class="tag">></span><span>support@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_15_7671884" name="code" class="html" style="display: none;"><beans>
<!-- Definition for javaCollection -->
<bean id="javaCollection" class="com.howtodoinjava.JavaCollection">
<!-- java.util.List -->
<property name="customList">
<list>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</list>
</property>
<!-- java.util.Set -->
<property name="customSet">
<set>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</set>
</property>
<!-- java.util.Map -->
<property name="customMap">
<map>
<entry key="1" value="INDIA"/>
<entry key="2" value="Pakistan"/>
<entry key="3" value="USA"/>
<entry key="4" value="UK"/>
</map>
</property>
<!-- java.util.Properties -->
<property name="customProperies">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean>
</beans></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="inject_properties" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t15" target="_blank"></a>
<span style="color:#006600">15、如何向Spring Bean中注入一个Java.util.Properties?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
第一种方法是使用如下面代码所示的<span style="border:0px; margin:0px; padding:0px"><props></span> 标签:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_210225" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 10350px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_16" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_16" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=16&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"adminUser"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Customer"</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- java.util.Properties --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"emails"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"admin"</span><span class="tag">></span><span>admin@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"support"</span><span class="tag">></span><span>support@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_16_1761493" name="code" class="html" style="display: none;"><bean id="adminUser" class="com.somnus.common.Customer">
<!-- java.util.Properties -->
<property name="emails">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
也可用”util:”命名空间来从properties文件中创建出一个propertiesbean,然后利用setter方法注入bean的引用。<br>
<a target="_blank" name="bean_autowiring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t16" target="_blank"></a>
<span style="color:rgb(0,102,0)">16、请解释Spring Bean的自动装配?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring容器还可以自动装配合作关系bean之间的关联关系。这意味着Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面的XML配置文件表明了如何根据名称将一个bean设置为自动装配:</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 524px; top: 10795px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_17" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_17" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=17&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"employeeDAO"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.EmployeeDAOImpl"</span><span> </span><span class="attribute">autowire</span><span>=</span><span class="attribute-value">"byName"</span><span> </span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_17_6615253" name="code" class="html" style="display: none;"><bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" /></pre>
<p></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
除了bean配置文件中提供的自动装配模式,还可以使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解来自动装配指定的</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">。在使用</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解之前需要在按照如下的配置方式在</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">配置文件进行配置才可以使用。</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_258076" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 10943px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_18" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_18" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=18&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">context:annotation-config</span><span> </span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_18_214494" name="code" class="html" style="display: none;"><context:annotation-config /></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
也可以通过在配置文件中配置<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">AutowiredAnnotationBeanPostProcessor</code> 达到相同的效果。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_545088" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 11083px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_19" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_19" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=19&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span> =</span><span class="attribute-value">"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"</span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_19_5973325" name="code" class="html" style="display: none;"><bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
配置好以后就可以使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code>来标注了。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_438814" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 11240px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_20" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_20" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=20&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>@Autowired </span></span></li><li class=""><span>public EmployeeDAOImpl ( EmployeeManager manager ) { </span></li><li class="alt"><span> <span class="attribute">this.manager</span><span> = </span><span class="attribute-value">manager</span><span>; </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_20_6192259" name="code" class="html" style="display: none;">@Autowired
public EmployeeDAOImpl ( EmployeeManager manager ) {
this.manager = manager;
}</pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="autowiring_modes" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t17" target="_blank"></a>
<span style="color:rgb(0,102,0)">17、请解释自动装配模式的区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中共有5种自动装配,让我们逐一分析。</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">no:</span>这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">byName:</span>该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">byType:</span>该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">constructor:</span>造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">autodetect:</span>该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="enable_autowiring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t18" target="_blank"></a>
<span style="color:#006600">18、如何开启基于注解的自动装配?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
要使用 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">,需要注册</code> <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">AutowiredAnnotationBeanPostProcessor</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">,可以有以下两种方式来实现:</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
1、引入配置文件中的<bean>下引入 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><context:annotation-config></code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_830392" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 11839px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_21" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_21" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=21&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context:annotation-config</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_21_663552" name="code" class="html" style="display: none;"><beans>
<context:annotation-config />
</beans></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
2、在bean配置文件中直接引入<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">AutowiredAnnotationBeanPostProcessor</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_896725" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 12015px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_22" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_22" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=22&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_22_2136222" name="code" class="html" style="display: none;"><beans>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
</beans></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="required_annotation" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t19" target="_blank"></a>
<span style="color:#006600">19、请举例解释@Required注解?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在产品级别的应用中,IoC容器可能声明了数十万了bean,bean与bean之间有着复杂的依赖关系。设值注解方法的短板之一就是验证所有的属性是否被注解是一项十分困难的操作。可以通过在<bean>中设置“<span style="border:0px; margin:0px; padding:0px">dependency-check</span>”来解决这个问题。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在应用程序的生命周期中,你可能不大愿意花时间在验证所有bean的属性是否按照上下文文件正确配置。或者你宁可验证某个bean的特定属性是否被正确的设置。即使是用“<span style="border:0px; margin:0px; padding:0px">dependency-check</span>”属性也不能很好的解决这个问题,在这种情况下,你需要使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code> 注解。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
需要用如下的方式使用来标明bean的设值方法。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_565244" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 12403px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_23" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_23" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=23&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> EmployeeFactoryBean </span><span class="keyword">extends</span><span> AbstractFactoryBean<Object>{ </span></span></li><li class=""><span> <span class="keyword">private</span><span> String designation; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getDesignation() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> designation; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Required</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setDesignation(String designation) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.designation = designation; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//more code here</span><span> </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_23_6848278" name="code" class="java" style="display: none;">public class EmployeeFactoryBean extends AbstractFactoryBean<Object>{
private String designation;
public String getDesignation() {
return designation;
}
@Required
public void setDesignation(String designation) {
this.designation = designation;
}
//more code here
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">RequiredAnnotationBeanPostProcessor</code>是Spring中的后置处理用来验证被<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code> 注解的bean属性是否被正确的设置了。在使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">RequiredAnnotationBeanPostProcesso</code>来验证<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code>属性之前,首先要在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">IoC</code>容器中对其进行注册:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_873484" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 12799px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_24" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_24" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=24&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"</span><span> </span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_24_4384233" name="code" class="html" style="display: none;"><bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
但是如果没有属性被用 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code> 注解过的话,后置处理器会抛出一个<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">BeanInitializationException</code> 异常。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="autowired_annotation" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t20" target="_blank"></a>
<span style="color:#006600">20、请举例解释@Autowired注解?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
@Autowired注解对自动装配何时何处被实现提供了更多细粒度的控制。<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解可以像</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解、构造器一样被用于在</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">的设值方法上自动装配</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">的属性,一个参数或者带有任意名称或带有多个参数的方法。</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
比如,可以在设值方法上使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解来替代配置文件中的</code> <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><property></code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">元素。当</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">容器在</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">setter</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">方法上找到</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解时,会尝试用</code><span style="border:0px; margin:0px; padding:0px">byType</span> 自动装配。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
当然我们也可以在构造方法上使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code> 注解。带有<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code> 注解的构造方法意味着在创建一个bean时将会被自动装配,即便在配置文件中使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><constructor-arg></code> 元素。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_981979" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 13188px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_25" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_25" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=25&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> TextEditor { </span></span></li><li class=""><span> <span class="keyword">private</span><span> SpellChecker spellChecker; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> TextEditor(SpellChecker spellChecker){ </span></span></li><li class=""><span> System.out.println(<span class="string">"Inside TextEditor constructor."</span><span> ); </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.spellChecker = spellChecker; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> spellCheck(){ </span></span></li><li class="alt"><span> spellChecker.checkSpelling(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_25_9411933" name="code" class="java" style="display: none;">public class TextEditor {
private SpellChecker spellChecker;
@Autowired
public TextEditor(SpellChecker spellChecker){
System.out.println("Inside TextEditor constructor." );
this.spellChecker = spellChecker;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面是没有构造参数的配置方式:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_923770" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 13543px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_26" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_26" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=26&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">context:annotation-config</span><span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- Definition for textEditor bean without constructor-arg --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"textEditor"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.TextEditor"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- Definition for spellChecker bean --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"spellChecker"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.SpellChecker"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_26_8899736" name="code" class="html" style="display: none;"><beans>
<context:annotation-config/>
<!-- Definition for textEditor bean without constructor-arg -->
<bean id="textEditor" class="com.howtodoinjava.TextEditor"/>
<!-- Definition for spellChecker bean -->
<bean id="spellChecker" class="com.howtodoinjava.SpellChecker"/>
</beans></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="qualifier_annotation" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t21" target="_blank"></a>
<span style="color:#006600">21、请举例说明@Qualifier注解?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Qualifier</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解意味着可以在被标注</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">的字段上可以自动装配。</code>Qualifier注解可以用来取消Spring不能取消的bean应用。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面的示例将会在Customer的person属性中自动装配person的值。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_892518" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 13975px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_27" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_27" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=27&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Customer{ </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> Person person; </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_27_23743" name="code" class="java" style="display: none;">public class Customer{
@Autowired
private Person person;
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面我们要在配置文件中来配置Person类。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_496504" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 14168px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_28" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_28" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=28&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"customer"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Customer"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"personA"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Person"</span><span> </span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"lokesh"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"personB"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Person"</span><span> </span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"alex"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_28_5051442" name="code" class="html" style="display: none;"><bean id="customer" class="com.somnus.common.Customer" />
<bean id="personA" class="com.somnus.common.Person" >
<property name="name" value="lokesh" />
</bean>
<bean id="personB" class="com.somnus.common.Person" >
<property name="name" value="alex" />
</bean></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">会知道要自动装配哪个person
bean么?不会的,但是运行上面的示例时,</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">会抛出下面的异常:</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_602632" class="syntaxhighlighter notranslate shell" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 14451px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_29" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_29" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=29&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: </span></span></li><li class=""><span> No unique bean of type [com.howtodoinjava.common.Person] is defined: </span></li><li class="alt"><span> expected single matching bean but found 2: [personA, personB] </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_29_6698836" name="code" class="html" style="display: none;">Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [com.howtodoinjava.common.Person] is defined:
expected single matching bean but found 2: [personA, personB]</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
要解决上面的问题,需要使用 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Quanlifier</code>注解来告诉Spring容器要装配哪个bean:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_671244" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 14627px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_30" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_30" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=30&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Customer{ </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"personA"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> Person person; </span></span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_30_2806332" name="code" class="java" style="display: none;">public class Customer{
@Autowired
@Qualifier("personA")
private Person person;
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<br>
</p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t22" target="_blank"></a>
<span style="color:#006600">22、构造方法注入和设值注入有什么区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
请注意以下明显的区别:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">在设值注入方法支持大部分的依赖注入,如果我们仅需要注入int、string和long型的变量,我们不要用设值的方法注入。对于基本类型,如果我们没有注入的话,可以为基本类型设置默认值。在构造方法注入不支持大部分的依赖注入,因为在调用构造方法中必须传入正确的构造参数,否则的话为报错。</li><li style="border:0px; margin:0px; padding:0px">设值注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。很明显,因为构造方法尽在对象被创建时调用。</li><li style="border:0px; margin:0px; padding:0px">在使用设值注入时有可能还不能保证某种依赖是否已经被注入,也就是说这时对象的依赖关系有可能是不完整的。而在另一种情况下,构造器注入则不允许生成依赖关系不完整的对象。</li><li style="border:0px; margin:0px; padding:0px">在设值注入时如果对象A和对象B互相依赖,在创建对象A时Spring会抛出s<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ObjectCurrentlyInCreationException异常,因为在B对象被创建之前A对象是不能被创建的,反之亦然。所以Spring用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被创建之前被调用的。</code></li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="applicationcontext_events" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t23" target="_blank"></a>
<span style="color:#006600">23、Spring框架中有哪些不同类型的事件?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring的<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code> 提供了支持事件和代码中监听器的功能。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
我们可以创建bean用来监听在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code> 中发布的事件。<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationEven</code>t类和在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">接口</code>中处理的事件,如果一个bean实现了<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationListener</code>接口,当一个<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationEvent</code> 被发布以后,bean会自动被通知。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_83753" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 15259px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_31" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_31" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=31&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AllApplicationEventListener </span><span class="keyword">implements</span><span> ApplicationListener < ApplicationEvent >{ </span></span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onApplicationEvent(ApplicationEvent applicationEvent) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="comment">//process event</span><span> </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_31_4453725" name="code" class="java" style="display: none;">public class AllApplicationEventListener implements ApplicationListener < ApplicationEvent >{
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent)
{
//process event
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring 提供了以下5中标准的事件:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文更新事件(ContextRefreshedEvent)</span>:该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文开始事件(ContextStartedEvent)</span>:当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文停止事件(ContextStoppedEvent)</span>:当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文关闭事件(ContextClosedEvent)</span>:当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">请求处理事件(RequestHandledEvent)</span>:在Web应用中,当一个http请求(request)结束触发该事件。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
除了上面介绍的事件以外,还可以通过扩展<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationEvent</code> 类来开发自定义的事件。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_466321" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 15729px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_32" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_32" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=32&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CustomApplicationEvent </span><span class="keyword">extends</span><span> ApplicationEvent{ </span></span></li><li class=""><span> <span class="keyword">public</span><span> CustomApplicationEvent ( Object source, </span><span class="keyword">final</span><span> String msg ) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="keyword">super</span><span>(source); </span></span></li><li class="alt"><span> System.out.println(<span class="string">"Created a Custom event"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_32_4149271" name="code" class="java" style="display: none;">public class CustomApplicationEvent extends ApplicationEvent{
public CustomApplicationEvent ( Object source, final String msg )
{
super(source);
System.out.println("Created a Custom event");
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
为了监听这个事件,还需要创建一个监听器:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_863517" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 15976px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_33" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_33" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=33&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CustomEventListener </span><span class="keyword">implements</span><span> ApplicationListener < CustomApplicationEvent >{ </span></span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onApplicationEvent(CustomApplicationEvent applicationEvent) { </span></span></li><li class=""><span> <span class="comment">//handle event</span><span> </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_33_1652207" name="code" class="java" style="display: none;">public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{
@Override
public void onApplicationEvent(CustomApplicationEvent applicationEvent) {
//handle event
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
之后通过applicationContext接口的<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">publishEvent()方法来发布自定义事件。</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_91576" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 16241px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_34" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_34" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=34&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>CustomApplicationEvent customEvent = </span><span class="keyword">new</span><span> CustomApplicationEvent(applicationContext, </span><span class="string">"Test message"</span><span>); </span></span></li><li class=""><span>applicationContext.publishEvent(customEvent); </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_34_4728060" name="code" class="java" style="display: none;">CustomApplicationEvent customEvent = new CustomApplicationEvent(applicationContext, "Test message");
applicationContext.publishEvent(customEvent);</pre></div>
</div>
<br>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t24" target="_blank"></a>
<span style="color:#006600">24、FileSystemResource和ClassPathResource有何区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">FileSystemResource</code> 中需要给出<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">spring-config.xml</code>文件在你项目中的相对路径或者绝对路径。在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ClassPathResource</code>中spring会在ClassPath中自动搜寻配置文件,所以要把<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ClassPathResource</code> 文件放在ClassPath下。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
如果将<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">spring-config.xml</code>保存在了src文件夹下的话,只需给出配置文件的名称即可,因为src文件夹是默认。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<span style="border:0px; margin:0px; padding:0px">简而言之,ClassPathResource在环境变量中读取配置文件,FileSystemResource在配置文件中读取配置文件。</span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="design_patterns_used_in_spring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t25" target="_blank"></a>
<span style="color:#006600">25、Spring 框架中都用到了哪些设计模式?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">代理模式—在AOP和remoting中被用的比较多。</li><li style="border:0px; margin:0px; padding:0px">单例模式—在spring配置文件中定义的bean默认为单例模式。<span style="border:0px; margin:0px; padding:0px"></span></li><li style="border:0px; margin:0px; padding:0px">模板方法—用来解决代码重复的问题。比如. <a target="_blank" title="Spring RESTFul Client – RestTemplate Example" href="http://howtodoinjava.com/2015/02/20/spring-restful-client-resttemplate-example/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)"><span style="border:0px; margin:0px; padding:0px">RestTemplate</span></a>, <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace; font-style:inherit; font-weight:inherit">JmsTemplate</code>, <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace; font-style:inherit; font-weight:inherit">JpaTemplate。</code></li><li style="border:0px; margin:0px; padding:0px">前端控制器—Spring提供了<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">DispatcherServlet</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">来对请求进行分发。</code></li><li style="border:0px; margin:0px; padding:0px">视图帮助(<span style="border:0px; margin:0px; padding:0px">View Helper</span> )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。</li><li style="border:0px; margin:0px; padding:0px">依赖注入—贯穿于<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">BeanFactory</code> / <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">接口的核心理念。</code></li><li style="border:0px; margin:0px; padding:0px">工厂模式—BeanFactory用来创建对象的实例。</li></ul>
<br>
<br>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
欢迎大家向我推荐你在面试过程中遇到关于<a href="http://lib.csdn.net/base/javaee" class="replace_word" title="Java EE知识库" target="_blank" style="color:#df3434; font-weight:bold;">spring</a>的问题。我会把大家推荐的问题添加到下面的Spring常用面试题清单中供大家参考。</p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t0" target="_blank"></a>
问题清单:</h3>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">什么是Spring框架?Spring框架有哪些主要模块?</li><li style="border:0px; margin:0px; padding:0px">使用Spring框架有什么好处?</li><li style="border:0px; margin:0px; padding:0px">什么是控制反转(IOC)?什么是依赖注入?</li><li style="border:0px; margin:0px; padding:0px">请解释下Spring中的IOC?</li><li style="border:0px; margin:0px; padding:0px">BeanFactory和ApplicationContext有什么区别?</li><li style="border:0px; margin:0px; padding:0px">将Spring配置到你的应用中共有几种方法?</li><li style="border:0px; margin:0px; padding:0px">什么基于XML的配置?</li><li style="border:0px; margin:0px; padding:0px">什么基Java的配置?</li><li style="border:0px; margin:0px; padding:0px">怎样用注解的方式配置Spring?</li><li style="border:0px; margin:0px; padding:0px">描述Spring Bean的生命周期?</li><li style="border:0px; margin:0px; padding:0px">描述Spring中各种Bean的范围?</li><li style="border:0px; margin:0px; padding:0px">什么是Spring的嵌入beans?</li><li style="border:0px; margin:0px; padding:0px">Spring框架中的单例bean是否是线程安全的?</li><li style="border:0px; margin:0px; padding:0px">请举例说明如何用Spring注入一个Java的集合类?</li><li style="border:0px; margin:0px; padding:0px">请举例说明如何在Spring的Bean中注入一个java.util.Properties?</li><li style="border:0px; margin:0px; padding:0px">请解释Spring的Bean的自动生成原理?</li><li style="border:0px; margin:0px; padding:0px">请辨析自动生成Bean之间模块的区别?</li><li style="border:0px; margin:0px; padding:0px">如何开启基于基于注解的自动写入?</li><li style="border:0px; margin:0px; padding:0px">请举例说明@Required注解?</li><li style="border:0px; margin:0px; padding:0px">请举例说明@Autowired注解?</li><li style="border:0px; margin:0px; padding:0px">请举例说明@Qualifier注解?</li><li style="border:0px; margin:0px; padding:0px">请说明构造器注入和setter方法注入之间的区别?</li><li style="border:0px; margin:0px; padding:0px">Spring框架中不同类型event有什么区别?</li><li style="border:0px; margin:0px; padding:0px">FileSystemResource和ClassPathResource有何区别?</li><li style="border:0px; margin:0px; padding:0px">请列举Spring框架中用了哪些设计模式?</li></ol>
<div><span style="font-family:Microsoft YaHei,宋体,Myriad Pro,Lato,Helvetica Neue,Helvetica,Arial,sans-serif"><span style="font-size:14px; line-height:21px"><br>
</span></span></div>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t1" target="_blank"></a>
<span style="color:#006600">1、什么是Spring框架?Spring框架有哪些主要模块?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架是一个为<a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a>应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照<span class="wp_keywordlink_affiliate" style="border:0px; margin:0px; padding:0px"><a target="_blank" href="http://www.amazon.cn/gp/product/B001130JN8/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=importnew-23&linkCode=as2&camp=536&creative=3200&creativeASIN=B001130JN8" title="设计模式:可复用面向对象软件的基础" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">设计模式</a></span>精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和<a href="http://lib.csdn.net/base/softwaretest" class="replace_word" title="软件测试知识库" target="_blank" style="color:#df3434; font-weight:bold;">测试</a>模块。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<span style="border:0px; margin:0px; padding:0px"><img src="https://img-blog.csdn.net/20150612131709937" alt=""></span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="spring_benefits" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t2" target="_blank"></a>
<span style="color:#006600">2、使用Spring框架能带来哪些好处?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面列举了一些使用Spring框架带来的主要好处:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><a target="_blank" title="Inversion of control (IoC) and dependency injection (DI) patterns in spring framework and related interview questions" href="http://howtodoinjava.com/2013/03/19/inversion-of-control-ioc-and-dependency-injection-di-patterns-in-spring-framework-and-related-interview-questions/" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)"><span style="border:0px; margin:0px; padding:0px">Dependency
Injection(DI)</span></a> 方法使得构造器和JavaBean properties文件中的依赖关系一目了然。</li><li style="border:0px; margin:0px; padding:0px">与EJB容器相比较,IoC容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。</li><li style="border:0px; margin:0px; padding:0px">Spring并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。</li><li style="border:0px; margin:0px; padding:0px">Spring框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。</li><li style="border:0px; margin:0px; padding:0px">要<a target="_blank" href="http://howtodoinjava.com/2013/04/19/how-to-unit-test-spring-security-authentication-with-junit/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">测试一项用Spring开发的应用程序</a>十分简单,因为测试相关的环境代码都已经囊括在框架中了。更加简单的是,利用JavaBean形式的POJO类,可以很方便的利用依赖注入来写入测试数据。</li><li style="border:0px; margin:0px; padding:0px">Spring的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有力选项。</li><li style="border:0px; margin:0px; padding:0px">Spring提供了一个便捷的事务管理接口,适用于小型的本地事物处理(比如在单DB的环境下)和复杂的共同事物处理(比如利用JTA的复杂DB环境)。</li></ul>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="ioc_di" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t3" target="_blank"></a>
<span style="color:#006600">3、什么是控制反转(IOC)?什么是依赖注入?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对象之间的关联关系的定义抽象化。而绑定的过程是通过“依赖注入”实现的。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
控制反转是一种以给予应用程序中目标组件更多控制为目的设计范式,并在我们的实际工作中起到了有效的作用。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
依赖注入是在编译阶段尚未知所需的功能是来自哪个的类的情况下,将其他对象所依赖的功能对象实例化的模式。这就需要一种机制用来激活相应的组件以提供特定的功能,所以依赖注入是控制反转的基础。否则如果在组件不受框架控制的情况下,框架又怎么知道要创建哪个组件?</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Java中依然注入有以下三种实现方式:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">构造器注入</li><li style="border:0px; margin:0px; padding:0px">Setter方法注入</li><li style="border:0px; margin:0px; padding:0px">接口注入</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="ioc_in_spring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t4" target="_blank"></a>
<span style="color:#006600">4、请解释下Spring框架中的IoC?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring中的 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">org.springframework.beans</code> 包和 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">org.springframework.context</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">包构成了</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">框架</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">IoC</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">容器的基础。</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
BeanFactory 接口提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContex</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">接口对</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">BeanFactory</code>(是一个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与<a target="_blank" href="http://howtodoinjava.com/category/frameworks/java-spring-tutorials/spring-aop/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">Spring的AOP</a>更容易集成,也提供了处理<a target="_blank" href="http://howtodoinjava.com/2015/02/10/spring-mvc-internationalization-i18n-and-localization-i10n-example/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">message
resource的机制</a>(用于国际化)、事件传播以及应用层的特别配置,比如针对Web应用的WebApplicationContext。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><span style="border:0px; margin:0px; padding:0px; background-color:rgb(153,255,153)">org.springframework.beans.factory.BeanFactory</span></code> 是Spring
IoC容器的具体实现,用来包装和管理前面提到的各种bean。BeanFactory接口是Spring IoC 容器的核心接口。<span style="border:0px; margin:0px; padding:0px"><br>
</span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反转。<br>
</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="beanfactory_vs_applicationcontext" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t5" target="_blank"></a>
<span style="color:#006600">5、BeanFactory和ApplicationContext有什么区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
BeanFactory 可以理解为含有bean集合的工厂类。BeanFactory 包含了种bean的定义,以便在接收到客户端请求时将对应的bean实例化。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
BeanFactory还能在实例化对象的时生成协作类之间的关系。此举将bean自身与bean客户端的配置中解放出来。BeanFactory还包含了bean生命周期的控制,调用客户端的初始化方法(initialization methods)和销毁方法(destruction methods)。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
从表面上看,application context如同bean factory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。但application context在此基础上还提供了其他的功能。</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">提供了支持国际化的文本消息</li><li style="border:0px; margin:0px; padding:0px">统一的资源文件读取方式</li><li style="border:0px; margin:0px; padding:0px">已在监听器中注册的bean的事件</li></ol>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
以下是三种较常见的 ApplicationContext 实现方式:</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
1、ClassPathXmlApplicationContext:从classpath的XML配置文件中读取上下文,并生成上下文定义。应用程序上下文从程序环境变量中取得。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 524px; top: 3260px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>ApplicationContext </span><span class="attribute">context</span><span> = </span><span class="attribute-value">new</span><span> ClassPathXmlApplicationContext(“bean.xml”); </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_1_7618360" name="code" class="html" style="display: none;">ApplicationContext context = new ClassPathXmlApplicationContext(“bean.xml”);</pre>
<p></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_345856" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<span style="font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; font-size:14px">2、FileSystemXmlApplicationContext :由文件系统中的XML配置文件读取上下文。</span></div>
</div>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_751431" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 3380px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>ApplicationContext </span><span class="attribute">context</span><span> = </span><span class="attribute-value">new</span><span> FileSystemXmlApplicationContext(“bean.xml”); </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_2_694213" name="code" class="html" style="display: none;">ApplicationContext context = new FileSystemXmlApplicationContext(“bean.xml”);</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
3、XmlWebApplicationContext:由Web应用的XML文件读取上下文。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="spring_configuration_types" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t6" target="_blank"></a>
<span style="color:#006600">6、Spring有几种配置方式?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
将Spring配置到应用开发中有以下三种方式:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">基于XML的配置</li><li style="border:0px; margin:0px; padding:0px">基于注解的配置</li><li style="border:0px; margin:0px; padding:0px">基于Java的配置</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="xml_based_configuration" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t7" target="_blank"></a>
<span style="color:#006600">7、如何用基于XML配置的方式配置Spring?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中,依赖和服务需要在专门的配置文件来实现,我常用的XML格式的配置文件。这些配置文件的格式通常用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><beans></code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">开头,然后一系列的</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">定义和专门的应用配置选项组成。</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
SpringXML配置的主要目的时候是使所有的Spring组件都可以用xml文件的形式来进行配置。这意味着不会出现其他的Spring配置类型(比如声明的方式或基于<a href="http://lib.csdn.net/base/java" class="replace_word" title="Java 知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java </a>Class的配置方式)</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring的XML配置方式是使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_748229" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 3914px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- JSON Support --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"viewResolver"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.servlet.view.BeanNameViewResolver"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"jsonTemplate"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.servlet.view.json.MappingJackson2JsonView"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"restTemplate"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.client.RestTemplate"</span><span class="tag">/></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_3_2341607" name="code" class="html" style="display: none;"><beans>
<!-- JSON Support -->
<bean name="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
</beans></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面这个web.xml仅仅配置了<span style="border:0px; margin:0px; padding:0px">DispatcherServlet,</span>这件最简单的配置便能满足应用程序配置运行时组件的需求。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_628016" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 4160px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">web-app</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">display-name</span><span class="tag">></span><span>Archetype Created Web Application</span><span class="tag"></</span><span class="tag-name">display-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>spring</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-class</span><span class="tag">></span><span>org.springframework.web.servlet.DispatcherServlet</span><span class="tag"></</span><span class="tag-name">servlet-class</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">load-on-startup</span><span class="tag">></span><span>1</span><span class="tag"></</span><span class="tag-name">load-on-startup</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>spring</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">url-pattern</span><span class="tag">></span><span>/</span><span class="tag"></</span><span class="tag-name">url-pattern</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">web-app</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_4_9354173" name="code" class="html" style="display: none;"><web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app></pre><br>
</div>
</div>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t8" target="_blank"></a>
<span style="color:#006600">8、如何用基于Java配置的方式配置Spring?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/> 元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
最简单的@Configuration 声明类请参考下面的代码:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_983118" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 4661px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppConfig{ </span></span></li><li class="alt"><span> <span class="annotation">@Bean</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> MyService myService() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> MyServiceImpl(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_5_2778691" name="code" class="java" style="display: none;">@Configuration
public class AppConfig{
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}</pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
对于上面的@Beans配置文件相同的XML配置文件如下:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_348868" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 4908px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"myService"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.services.MyServiceImpl"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_6_6029268" name="code" class="html" style="display: none;"><beans>
<bean id="myService" class="com.somnus.services.MyServiceImpl"/>
</beans></pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
上述配置方式的实例化方式如下:利用AnnotationConfigApplicationContext 类进行实例化</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 522px; top: 5064px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) { </span></span></li><li class=""><span> ApplicationContext ctx = <span class="keyword">new</span><span> AnnotationConfigApplicationContext(AppConfig.</span><span class="keyword">class</span><span>); </span></span></li><li class="alt"><span> MyService myService = ctx.getBean(MyService.<span class="keyword">class</span><span>); </span></span></li><li class=""><span> myService.doStuff(); </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_7_6248202" name="code" class="java" style="display: none;">public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService = ctx.getBean(MyService.class);
myService.doStuff();
}</pre>
<p></p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
要使用组件组建扫描,仅需用@Configuration进行注解即可:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_381042" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 5262px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="annotation">@Configuration</span><span> </span></span></li><li class=""><span><span class="annotation">@ComponentScan</span><span>(basePackages = </span><span class="string">"com.somnus"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AppConfig { </span></span></li><li class=""><span> ... </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_8_8767647" name="code" class="java" style="display: none;">@Configuration
@ComponentScan(basePackages = "com.somnus")
public class AppConfig {
...
}</pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在上面的例子中,com.acme包首先会被扫到,然后再容器内查找被@Component 声明的类,找到后将这些类按照Sring bean定义进行注册。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
如果你要在你的web应用开发中选用上述的配置的方式的话,需要用AnnotationConfigWebApplicationContext 类来读取配置文件,可以用来配置Spring的Servlet监听器ContrextLoaderListener或者Spring MVC的DispatcherServlet。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_562032" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 5535px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">web-app</span><span class="tag">></span><span> </span></span></li><li class=""><span> <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext </span></li><li class="alt"><span> instead of the default XmlWebApplicationContext --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextClass</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <!-- Configuration locations must consist of one or more comma- or space-delimited </span></li><li class=""><span> fully-qualified @Configuration classes. Fully-qualified packages may also be </span></li><li class="alt"><span> specified for component-scanning --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextConfigLocation</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span>com.howtodoinjava.AppConfig</span><span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">context-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- Bootstrap the root application context as usual using ContextLoaderListener --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">listener</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">listener-class</span><span class="tag">></span><span>org.springframework.web.context.ContextLoaderListener</span><span class="tag"></</span><span class="tag-name">listener-class</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">listener</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- Declare a Spring MVC DispatcherServlet as usual --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>dispatcher</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-class</span><span class="tag">></span><span>org.springframework.web.servlet.DispatcherServlet</span><span class="tag"></</span><span class="tag-name">servlet-class</span><span class="tag">></span><span> </span></span></li><li class=""><span> <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext </span></li><li class="alt"><span> instead of the default XmlWebApplicationContext --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextClass</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> org.springframework.web.context.support.AnnotationConfigWebApplicationContext </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> <!-- Again, config locations must consist of one or more comma- or space-delimited </span></li><li class="alt"><span> and fully-qualified @Configuration classes --<span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">param-name</span><span class="tag">></span><span>contextConfigLocation</span><span class="tag"></</span><span class="tag-name">param-name</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">param-value</span><span class="tag">></span><span>com.howtodoinjava.web.MvcConfig</span><span class="tag"></</span><span class="tag-name">param-value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">init-param</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">servlet</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- map all requests for /app/* to the dispatcher servlet --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">servlet-name</span><span class="tag">></span><span>dispatcher</span><span class="tag"></</span><span class="tag-name">servlet-name</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">url-pattern</span><span class="tag">></span><span>/app/*</span><span class="tag"></</span><span class="tag-name">url-pattern</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">servlet-mapping</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">web-app</span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_9_1985204" name="code" class="html" style="display: none;"><web-app>
<!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
instead of the default XmlWebApplicationContext -->
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<!-- Configuration locations must consist of one or more comma- or space-delimited
fully-qualified @Configuration classes. Fully-qualified packages may also be
specified for component-scanning -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.howtodoinjava.AppConfig</param-value>
</context-param>
<!-- Bootstrap the root application context as usual using ContextLoaderListener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Declare a Spring MVC DispatcherServlet as usual -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
instead of the default XmlWebApplicationContext -->
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<!-- Again, config locations must consist of one or more comma- or space-delimited
and fully-qualified @Configuration classes -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.howtodoinjava.web.MvcConfig</param-value>
</init-param>
</servlet>
<!-- map all requests for /app/* to the dispatcher servlet -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app</pre></div>
</div>
<p><br>
</p>
<p><br>
</p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t9" target="_blank"></a>
<span style="color:#006600">9、怎样用注解的方式配置Spring?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_479638" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 6897px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_10" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_10" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=10&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context:annotation-config</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- bean definitions go here --></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_10_1680750" name="code" class="html" style="display: none;"><beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans></pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在 <context:annotation-config/>标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面是几种比较重要的注解类型:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">@Required:</span>该注解应用于设值方法。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">@Autowired:</span>该注解应用于有值设值方法、非设值方法、构造方法和变量。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">@Qualifier:</span>该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">JSR-250 Annotations:</span>Spring支持基于JSR-250 注解的以下注解,@Resource、@PostConstruct 和 @PreDestroy。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="bean_lifecycle" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t10" target="_blank"></a>
<span style="color:#006600">10、请解释Spring Bean的生命周期?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring Bean的生命周期简单易懂。在一个bean实例被初始化时,需要执行一系列的初始化操作以达到可用的状态。同样的,当一个bean不在被调用时需要进行相关的析构操作,并从bean容器中移除。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring bean factory 负责管理在spring容器中被创建的bean的生命周期。Bean的生命周期由两组回调(call back)方法组成。</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">初始化之后调用的回调方法。</li><li style="border:0px; margin:0px; padding:0px">销毁之前调用的回调方法。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架提供了以下四种方式来管理bean的生命周期事件:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">InitializingBean和DisposableBean回调接口</li><li style="border:0px; margin:0px; padding:0px">针对特殊行为的其他Aware接口</li><li style="border:0px; margin:0px; padding:0px">Bean配置文件中的Custom init()方法和destroy()方法</li><li style="border:0px; margin:0px; padding:0px">@PostConstruct和@PreDestroy注解方式</li></ul>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">customInit()</code>和 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">customDestroy()</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">方法管理</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">生命周期的代码样例如下:</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_479810" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 7629px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_11" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_11" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=11&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"demoBean"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.task.DemoBean"</span><span> </span><span class="attribute">init-method</span><span>=</span><span class="attribute-value">"customInit"</span><span> </span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">"customDestroy"</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_11_1376296" name="code" class="html" style="display: none;"><beans>
<bean id="demoBean" class="com.somnus.task.DemoBean" init-method="customInit" destroy-method="customDestroy"></bean>
</beans></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
更多内容请参考:Spring生命周期<a target="_blank" title="Spring Bean Life Cycle" href="http://howtodoinjava.com/2013/05/07/spring-bean-life-cycle/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">Spring
Bean Life Cycle</a>。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="bean_scopes" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t11" target="_blank"></a>
<span style="color:#006600">11、Spring Bean的作用域之间有什么区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">singleton:这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。</li><li style="border:0px; margin:0px; padding:0px">prototype:原形范围与单例范围相反,为每一个bean请求提供一个实例。</li><li style="border:0px; margin:0px; padding:0px">request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。</li><li style="border:0px; margin:0px; padding:0px">Session:与请求范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。</li><li style="border:0px; margin:0px; padding:0px">global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。</li></ol>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
全局作用域与Servlet中的session作用域效果相同。<span style="border:0px; margin:0px; padding:0px"></span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<span style="border:0px; margin:0px; padding:0px">更多内容请参考 :</span> <a target="_blank" title="Spring bean scopes" href="http://howtodoinjava.com/2013/05/07/spring-bean-scopes/" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">Spring
Bean Scopes</a>。<br>
<a target="_blank" name="inner_beans" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t12" target="_blank"></a>
<span style="color:#006600">12、什么是Spring inner beans?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean声明为内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现。</p>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们的要做的是创建一个Person的实例,然后在Customer内部使用。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_942139" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 8299px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_12" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_12" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=12&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Customer{ </span></span></li><li class=""><span> <span class="keyword">private</span><span> Person person; </span></span></li><li class="alt"><span> <span class="comment">//Setters and Getters</span><span> </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_12_2434263" name="code" class="java" style="display: none;">public class Customer{
private Person person;
//Setters and Getters
}</pre><br>
</div>
</div>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_595794" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 8472px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_13" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_13" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=13&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Person{ </span></span></li><li class=""><span> <span class="keyword">private</span><span> String name; </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String address; </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">int</span><span> age; </span></span></li><li class="alt"><span> <span class="comment">//Setters and Getters</span><span> </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_13_1224737" name="code" class="java" style="display: none;">public class Person{
private String name;
private String address;
private int age;
//Setters and Getters
}</pre></div>
</div>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
内部bean的声明方式如下:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_300618" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 8701px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_14" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_14" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=14&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"CustomerBean"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Customer"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"person"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- This is inner bean --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.common.Person"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"lokesh"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"address"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"India"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"age"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"34"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class=""><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_14_4769972" name="code" class="html" style="display: none;"><bean id="CustomerBean" class="com.somnus.common.Customer">
<property name="person">
<!-- This is inner bean -->
<bean class="com.howtodoinjava.common.Person">
<property name="name" value="lokesh" />
<property name="address" value="India" />
<property name="age" value="34" />
</bean>
</property>
</bean></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="singleton_bean_threadsafe" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t13" target="_blank"></a>
<span style="color:#006600">13、Spring框架中的单例Beans是线程安全的么?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架并没有对<a target="_blank" href="http://howtodoinjava.com/2012/10/22/singleton-design-pattern-in-java/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">单例</a>bean进行任何多线程的封装处理。关于单例bean的<a target="_blank" href="http://howtodoinjava.com/2014/06/02/what-is-thread-safety/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)">线程安全</a>和并发问题需要开发者自行去搞定。但实际上,大部分的Spring
bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
最浅显的解决办法就是将多态bean的作用域由<span style="border:0px; margin:0px; padding:0px">“singleton</span>”变更为“<span style="border:0px; margin:0px; padding:0px">prototype</span>”。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="inject_collection" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t14" target="_blank"></a>
<span style="color:#006600">14、请举例说明如何在Spring中注入一个Java Collection?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring提供了以下四种集合类的配置元素:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><list></span> : 该标签用来装配可重复的list值。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><set></span> : 该标签用来装配没有重复的set值。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><map></span>: 该标签可用来注入键和值可以为任何类型的键值对。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px"><props></span> : 该标签支持注入键和值都是字符串类型的键值对。</li></ul>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面看一下具体的例子:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_536906" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 9384px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_15" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_15" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=15&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- Definition for javaCollection --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"javaCollection"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.JavaCollection"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- java.util.List --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customList"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">list</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>INDIA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>Pakistan</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>USA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>UK</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">list</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- java.util.Set --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customSet"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>INDIA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>Pakistan</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>USA</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">value</span><span class="tag">></span><span>UK</span><span class="tag"></</span><span class="tag-name">value</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- java.util.Map --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customMap"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">map</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"1"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"INDIA"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"2"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"Pakistan"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"3"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"USA"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">entry</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"4"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"UK"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">map</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- java.util.Properties --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"customProperies"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"admin"</span><span class="tag">></span><span>admin@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"support"</span><span class="tag">></span><span>support@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_15_7671884" name="code" class="html" style="display: none;"><beans>
<!-- Definition for javaCollection -->
<bean id="javaCollection" class="com.howtodoinjava.JavaCollection">
<!-- java.util.List -->
<property name="customList">
<list>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</list>
</property>
<!-- java.util.Set -->
<property name="customSet">
<set>
<value>INDIA</value>
<value>Pakistan</value>
<value>USA</value>
<value>UK</value>
</set>
</property>
<!-- java.util.Map -->
<property name="customMap">
<map>
<entry key="1" value="INDIA"/>
<entry key="2" value="Pakistan"/>
<entry key="3" value="USA"/>
<entry key="4" value="UK"/>
</map>
</property>
<!-- java.util.Properties -->
<property name="customProperies">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean>
</beans></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="inject_properties" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 align="left" style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t15" target="_blank"></a>
<span style="color:#006600">15、如何向Spring Bean中注入一个Java.util.Properties?</span></h3>
<p align="left" style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
第一种方法是使用如下面代码所示的<span style="border:0px; margin:0px; padding:0px"><props></span> 标签:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_210225" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 10350px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_16" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_16" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=16&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"adminUser"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Customer"</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- java.util.Properties --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"emails"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"admin"</span><span class="tag">></span><span>admin@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">prop</span><span> </span><span class="attribute">key</span><span>=</span><span class="attribute-value">"support"</span><span class="tag">></span><span>support@nospam.com</span><span class="tag"></</span><span class="tag-name">prop</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">props</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_16_1761493" name="code" class="html" style="display: none;"><bean id="adminUser" class="com.somnus.common.Customer">
<!-- java.util.Properties -->
<property name="emails">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
也可用”util:”命名空间来从properties文件中创建出一个propertiesbean,然后利用setter方法注入bean的引用。<br>
<a target="_blank" name="bean_autowiring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t16" target="_blank"></a>
<span style="color:rgb(0,102,0)">16、请解释Spring Bean的自动装配?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中,在配置文件中设定bean的依赖关系是一个很好的机制,Spring容器还可以自动装配合作关系bean之间的关联关系。这意味着Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面的XML配置文件表明了如何根据名称将一个bean设置为自动装配:</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
</p>
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 524px; top: 10795px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_17" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_17" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=17&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"employeeDAO"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.EmployeeDAOImpl"</span><span> </span><span class="attribute">autowire</span><span>=</span><span class="attribute-value">"byName"</span><span> </span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_17_6615253" name="code" class="html" style="display: none;"><bean id="employeeDAO" class="com.howtodoinjava.EmployeeDAOImpl" autowire="byName" /></pre>
<p></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
除了bean配置文件中提供的自动装配模式,还可以使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解来自动装配指定的</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">。在使用</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解之前需要在按照如下的配置方式在</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">配置文件进行配置才可以使用。</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_258076" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 10943px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_18" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_18" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=18&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">context:annotation-config</span><span> </span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_18_214494" name="code" class="html" style="display: none;"><context:annotation-config /></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
也可以通过在配置文件中配置<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">AutowiredAnnotationBeanPostProcessor</code> 达到相同的效果。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_545088" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 11083px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_19" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_19" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=19&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span> =</span><span class="attribute-value">"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"</span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_19_5973325" name="code" class="html" style="display: none;"><bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
配置好以后就可以使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code>来标注了。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_438814" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 11240px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_20" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_20" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=20&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>@Autowired </span></span></li><li class=""><span>public EmployeeDAOImpl ( EmployeeManager manager ) { </span></li><li class="alt"><span> <span class="attribute">this.manager</span><span> = </span><span class="attribute-value">manager</span><span>; </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_20_6192259" name="code" class="html" style="display: none;">@Autowired
public EmployeeDAOImpl ( EmployeeManager manager ) {
this.manager = manager;
}</pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="autowiring_modes" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t17" target="_blank"></a>
<span style="color:rgb(0,102,0)">17、请解释自动装配模式的区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在Spring框架中共有5种自动装配,让我们逐一分析。</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">no:</span>这是Spring框架的默认设置,在该设置下自动装配是关闭的,开发者需要自行在bean定义中用标签明确的设置依赖关系。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">byName:</span>该选项可以根据bean名称设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的名称自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">byType:</span>该选项可以根据bean类型设置依赖关系。当向一个bean中自动装配一个属性时,容器将根据bean的类型自动在在配置文件中查询一个匹配的bean。如果找到的话,就装配这个属性,如果没找到的话就报错。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">constructor:</span>造器的自动装配和byType模式类似,但是仅仅适用于与有构造器相同参数的bean,如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">autodetect:</span>该模式自动探测使用构造器自动装配或者byType自动装配。首先,首先会尝试找合适的带参数的构造器,如果找到的话就是用构造器自动装配,如果在bean内部没有找到相应的构造器或者是无参构造器,容器就会自动选择byTpe的自动装配方式。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="enable_autowiring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t18" target="_blank"></a>
<span style="color:#006600">18、如何开启基于注解的自动装配?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
要使用 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">,需要注册</code> <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">AutowiredAnnotationBeanPostProcessor</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">,可以有以下两种方式来实现:</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
1、引入配置文件中的<bean>下引入 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><context:annotation-config></code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_830392" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 11839px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_21" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_21" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=21&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">context:annotation-config</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_21_663552" name="code" class="html" style="display: none;"><beans>
<context:annotation-config />
</beans></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
2、在bean配置文件中直接引入<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">AutowiredAnnotationBeanPostProcessor</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_896725" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 12015px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_22" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_22" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=22&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_22_2136222" name="code" class="html" style="display: none;"><beans>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
</beans></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="required_annotation" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t19" target="_blank"></a>
<span style="color:#006600">19、请举例解释@Required注解?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在产品级别的应用中,IoC容器可能声明了数十万了bean,bean与bean之间有着复杂的依赖关系。设值注解方法的短板之一就是验证所有的属性是否被注解是一项十分困难的操作。可以通过在<bean>中设置“<span style="border:0px; margin:0px; padding:0px">dependency-check</span>”来解决这个问题。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在应用程序的生命周期中,你可能不大愿意花时间在验证所有bean的属性是否按照上下文文件正确配置。或者你宁可验证某个bean的特定属性是否被正确的设置。即使是用“<span style="border:0px; margin:0px; padding:0px">dependency-check</span>”属性也不能很好的解决这个问题,在这种情况下,你需要使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code> 注解。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
需要用如下的方式使用来标明bean的设值方法。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_565244" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 12403px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_23" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_23" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=23&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> EmployeeFactoryBean </span><span class="keyword">extends</span><span> AbstractFactoryBean<Object>{ </span></span></li><li class=""><span> <span class="keyword">private</span><span> String designation; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getDesignation() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> designation; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Required</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setDesignation(String designation) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.designation = designation; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//more code here</span><span> </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_23_6848278" name="code" class="java" style="display: none;">public class EmployeeFactoryBean extends AbstractFactoryBean<Object>{
private String designation;
public String getDesignation() {
return designation;
}
@Required
public void setDesignation(String designation) {
this.designation = designation;
}
//more code here
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">RequiredAnnotationBeanPostProcessor</code>是Spring中的后置处理用来验证被<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code> 注解的bean属性是否被正确的设置了。在使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">RequiredAnnotationBeanPostProcesso</code>来验证<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code>属性之前,首先要在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">IoC</code>容器中对其进行注册:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_873484" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 12799px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_24" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_24" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=24&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"</span><span> </span><span class="tag">/></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_24_4384233" name="code" class="html" style="display: none;"><bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
但是如果没有属性被用 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code> 注解过的话,后置处理器会抛出一个<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">BeanInitializationException</code> 异常。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="autowired_annotation" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t20" target="_blank"></a>
<span style="color:#006600">20、请举例解释@Autowired注解?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
@Autowired注解对自动装配何时何处被实现提供了更多细粒度的控制。<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解可以像</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Required</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解、构造器一样被用于在</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">的设值方法上自动装配</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">的属性,一个参数或者带有任意名称或带有多个参数的方法。</code></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
比如,可以在设值方法上使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解来替代配置文件中的</code> <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><property></code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">元素。当</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">容器在</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">setter</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">方法上找到</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解时,会尝试用</code><span style="border:0px; margin:0px; padding:0px">byType</span> 自动装配。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
当然我们也可以在构造方法上使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code> 注解。带有<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Autowired</code> 注解的构造方法意味着在创建一个bean时将会被自动装配,即便在配置文件中使用<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace"><constructor-arg></code> 元素。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_981979" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 13188px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_25" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_25" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=25&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> TextEditor { </span></span></li><li class=""><span> <span class="keyword">private</span><span> SpellChecker spellChecker; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> TextEditor(SpellChecker spellChecker){ </span></span></li><li class=""><span> System.out.println(<span class="string">"Inside TextEditor constructor."</span><span> ); </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.spellChecker = spellChecker; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> spellCheck(){ </span></span></li><li class="alt"><span> spellChecker.checkSpelling(); </span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_25_9411933" name="code" class="java" style="display: none;">public class TextEditor {
private SpellChecker spellChecker;
@Autowired
public TextEditor(SpellChecker spellChecker){
System.out.println("Inside TextEditor constructor." );
this.spellChecker = spellChecker;
}
public void spellCheck(){
spellChecker.checkSpelling();
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面是没有构造参数的配置方式:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_923770" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 13543px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_26" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_26" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=26&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">context:annotation-config</span><span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- Definition for textEditor bean without constructor-arg --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"textEditor"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.TextEditor"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- Definition for spellChecker bean --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"spellChecker"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.howtodoinjava.SpellChecker"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_26_8899736" name="code" class="html" style="display: none;"><beans>
<context:annotation-config/>
<!-- Definition for textEditor bean without constructor-arg -->
<bean id="textEditor" class="com.howtodoinjava.TextEditor"/>
<!-- Definition for spellChecker bean -->
<bean id="spellChecker" class="com.howtodoinjava.SpellChecker"/>
</beans></pre><br>
</div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="qualifier_annotation" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t21" target="_blank"></a>
<span style="color:#006600">21、请举例说明@Qualifier注解?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Qualifier</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">注解意味着可以在被标注</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">bean</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">的字段上可以自动装配。</code>Qualifier注解可以用来取消Spring不能取消的bean应用。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面的示例将会在Customer的person属性中自动装配person的值。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_892518" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 13975px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_27" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_27" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=27&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Customer{ </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> Person person; </span></span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_27_23743" name="code" class="java" style="display: none;">public class Customer{
@Autowired
private Person person;
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
下面我们要在配置文件中来配置Person类。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_496504" class="syntaxhighlighter notranslate xml" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 14168px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_28" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_28" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=28&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"customer"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Customer"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"personA"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Person"</span><span> </span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"lokesh"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"personB"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"com.somnus.common.Person"</span><span> </span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">value</span><span>=</span><span class="attribute-value">"alex"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_28_5051442" name="code" class="html" style="display: none;"><bean id="customer" class="com.somnus.common.Customer" />
<bean id="personA" class="com.somnus.common.Person" >
<property name="name" value="lokesh" />
</bean>
<bean id="personB" class="com.somnus.common.Person" >
<property name="name" value="alex" />
</bean></pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">Spring</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">会知道要自动装配哪个person
bean么?不会的,但是运行上面的示例时,</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">会抛出下面的异常:</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_602632" class="syntaxhighlighter notranslate shell" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 525px; top: 14451px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_29" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_29" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=29&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span>Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: </span></span></li><li class=""><span> No unique bean of type [com.howtodoinjava.common.Person] is defined: </span></li><li class="alt"><span> expected single matching bean but found 2: [personA, personB] </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_29_6698836" name="code" class="html" style="display: none;">Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [com.howtodoinjava.common.Person] is defined:
expected single matching bean but found 2: [personA, personB]</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
要解决上面的问题,需要使用 <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">@Quanlifier</code>注解来告诉Spring容器要装配哪个bean:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_671244" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 14627px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_30" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_30" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=30&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Customer{ </span></span></li><li class=""><span> <span class="annotation">@Autowired</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Qualifier</span><span>(</span><span class="string">"personA"</span><span>) </span></span></li><li class=""><span> <span class="keyword">private</span><span> Person person; </span></span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_30_2806332" name="code" class="java" style="display: none;">public class Customer{
@Autowired
@Qualifier("personA")
private Person person;
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<br>
</p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t22" target="_blank"></a>
<span style="color:#006600">22、构造方法注入和设值注入有什么区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
请注意以下明显的区别:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">在设值注入方法支持大部分的依赖注入,如果我们仅需要注入int、string和long型的变量,我们不要用设值的方法注入。对于基本类型,如果我们没有注入的话,可以为基本类型设置默认值。在构造方法注入不支持大部分的依赖注入,因为在调用构造方法中必须传入正确的构造参数,否则的话为报错。</li><li style="border:0px; margin:0px; padding:0px">设值注入不会重写构造方法的值。如果我们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。很明显,因为构造方法尽在对象被创建时调用。</li><li style="border:0px; margin:0px; padding:0px">在使用设值注入时有可能还不能保证某种依赖是否已经被注入,也就是说这时对象的依赖关系有可能是不完整的。而在另一种情况下,构造器注入则不允许生成依赖关系不完整的对象。</li><li style="border:0px; margin:0px; padding:0px">在设值注入时如果对象A和对象B互相依赖,在创建对象A时Spring会抛出s<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ObjectCurrentlyInCreationException异常,因为在B对象被创建之前A对象是不能被创建的,反之亦然。所以Spring用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被创建之前被调用的。</code></li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="applicationcontext_events" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t23" target="_blank"></a>
<span style="color:#006600">23、Spring框架中有哪些不同类型的事件?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring的<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code> 提供了支持事件和代码中监听器的功能。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
我们可以创建bean用来监听在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code> 中发布的事件。<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationEven</code>t类和在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">接口</code>中处理的事件,如果一个bean实现了<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationListener</code>接口,当一个<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationEvent</code> 被发布以后,bean会自动被通知。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_83753" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 15259px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_31" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_31" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=31&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> AllApplicationEventListener </span><span class="keyword">implements</span><span> ApplicationListener < ApplicationEvent >{ </span></span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onApplicationEvent(ApplicationEvent applicationEvent) </span></span></li><li class=""><span> { </span></li><li class="alt"><span> <span class="comment">//process event</span><span> </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_31_4453725" name="code" class="java" style="display: none;">public class AllApplicationEventListener implements ApplicationListener < ApplicationEvent >{
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent)
{
//process event
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring 提供了以下5中标准的事件:</p>
<ol style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文更新事件(ContextRefreshedEvent)</span>:该事件会在ApplicationContext被初始化或者更新时发布。也可以在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文开始事件(ContextStartedEvent)</span>:当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文停止事件(ContextStoppedEvent)</span>:当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">上下文关闭事件(ContextClosedEvent)</span>:当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。</li><li style="border:0px; margin:0px; padding:0px"><span style="border:0px; margin:0px; padding:0px">请求处理事件(RequestHandledEvent)</span>:在Web应用中,当一个http请求(request)结束触发该事件。</li></ol>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
除了上面介绍的事件以外,还可以通过扩展<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationEvent</code> 类来开发自定义的事件。</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_466321" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 15729px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_32" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_32" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=32&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CustomApplicationEvent </span><span class="keyword">extends</span><span> ApplicationEvent{ </span></span></li><li class=""><span> <span class="keyword">public</span><span> CustomApplicationEvent ( Object source, </span><span class="keyword">final</span><span> String msg ) </span></span></li><li class="alt"><span> { </span></li><li class=""><span> <span class="keyword">super</span><span>(source); </span></span></li><li class="alt"><span> System.out.println(<span class="string">"Created a Custom event"</span><span>); </span></span></li><li class=""><span> } </span></li><li class="alt"><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_32_4149271" name="code" class="java" style="display: none;">public class CustomApplicationEvent extends ApplicationEvent{
public CustomApplicationEvent ( Object source, final String msg )
{
super(source);
System.out.println("Created a Custom event");
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
为了监听这个事件,还需要创建一个监听器:</p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_863517" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 15976px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_33" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_33" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=33&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> CustomEventListener </span><span class="keyword">implements</span><span> ApplicationListener < CustomApplicationEvent >{ </span></span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> onApplicationEvent(CustomApplicationEvent applicationEvent) { </span></span></li><li class=""><span> <span class="comment">//handle event</span><span> </span></span></li><li class="alt"><span> } </span></li><li class=""><span>} </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_33_1652207" name="code" class="java" style="display: none;">public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{
@Override
public void onApplicationEvent(CustomApplicationEvent applicationEvent) {
//handle event
}
}</pre></div>
</div>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
之后通过applicationContext接口的<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">publishEvent()方法来发布自定义事件。</code></p>
<div style="border:0px; margin:0px; padding:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<div id="highlighter_91576" class="syntaxhighlighter notranslate java" style="border:0px; width:620px; margin:1em 0px!important; padding:1px!important; font-size:12px!important; position:relative!important; overflow-y:hidden!important; overflow-x:auto!important; font-family:Consolas,'Bitstream Vera Sans Mono','Courier New',Courier,monospace!important">
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" target="_blank">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 523px; top: 16241px; width: 27px; height: 15px; z-index: 99;"><embed id="ZeroClipboardMovie_34" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="27" height="15" name="ZeroClipboardMovie_34" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=34&width=27&height=15" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;" target="_blank">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span>CustomApplicationEvent customEvent = </span><span class="keyword">new</span><span> CustomApplicationEvent(applicationContext, </span><span class="string">"Test message"</span><span>); </span></span></li><li class=""><span>applicationContext.publishEvent(customEvent); </span></li></ol><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="692907" snippet_file_name="blog_20150612_34_4728060" name="code" class="java" style="display: none;">CustomApplicationEvent customEvent = new CustomApplicationEvent(applicationContext, "Test message");
applicationContext.publishEvent(customEvent);</pre></div>
</div>
<br>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t24" target="_blank"></a>
<span style="color:#006600">24、FileSystemResource和ClassPathResource有何区别?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">FileSystemResource</code> 中需要给出<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">spring-config.xml</code>文件在你项目中的相对路径或者绝对路径。在<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ClassPathResource</code>中spring会在ClassPath中自动搜寻配置文件,所以要把<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ClassPathResource</code> 文件放在ClassPath下。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
如果将<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">spring-config.xml</code>保存在了src文件夹下的话,只需给出配置文件的名称即可,因为src文件夹是默认。</p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<span style="border:0px; margin:0px; padding:0px">简而言之,ClassPathResource在环境变量中读取配置文件,FileSystemResource在配置文件中读取配置文件。</span></p>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<a target="_blank" name="design_patterns_used_in_spring" style="border:0px; margin:0px; padding:0px; color:rgb(0,153,204)"></a></p>
<h3 style="border:0px; margin:-8px 0px 20px; padding:0px; font-size:20px; font-weight:normal; line-height:30px; font-family:'Microsoft YaHei','Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif"><a name="t25" target="_blank"></a>
<span style="color:#006600">25、Spring 框架中都用到了哪些设计模式?</span></h3>
<p style="border:0px; margin-top:0px; margin-bottom:20px; padding-top:0px; padding-bottom:0px; font-size:14px; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:</p>
<ul style="border:0px; margin:0px 0px 20px; padding:0px; font-size:14px; list-style-position:inside; font-family:'Microsoft YaHei',宋体,'Myriad Pro',Lato,'Helvetica Neue',Helvetica,Arial,sans-serif; line-height:21px">
<li style="border:0px; margin:0px; padding:0px">代理模式—在AOP和remoting中被用的比较多。</li><li style="border:0px; margin:0px; padding:0px">单例模式—在spring配置文件中定义的bean默认为单例模式。<span style="border:0px; margin:0px; padding:0px"></span></li><li style="border:0px; margin:0px; padding:0px">模板方法—用来解决代码重复的问题。比如. <a target="_blank" title="Spring RESTFul Client – RestTemplate Example" href="http://howtodoinjava.com/2015/02/20/spring-restful-client-resttemplate-example/" class="external" rel="nofollow" style="border:0px; margin:0px; padding:0px; text-decoration:none; color:rgb(0,153,204)"><span style="border:0px; margin:0px; padding:0px">RestTemplate</span></a>, <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace; font-style:inherit; font-weight:inherit">JmsTemplate</code>, <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace; font-style:inherit; font-weight:inherit">JpaTemplate。</code></li><li style="border:0px; margin:0px; padding:0px">前端控制器—Spring提供了<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">DispatcherServlet</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">来对请求进行分发。</code></li><li style="border:0px; margin:0px; padding:0px">视图帮助(<span style="border:0px; margin:0px; padding:0px">View Helper</span> )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。</li><li style="border:0px; margin:0px; padding:0px">依赖注入—贯穿于<code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">BeanFactory</code> / <code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">ApplicationContext</code><code style="border:0px; margin:0px; padding:0px; font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace">接口的核心理念。</code></li><li style="border:0px; margin:0px; padding:0px">工厂模式—BeanFactory用来创建对象的实例。</li></ul>
<br>
<br>
</div>