﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我思故我强-文章分类-Spring</title><link>http://www.blogjava.net/balajinima/category/26955.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 29 Feb 2008 10:25:51 GMT</lastBuildDate><pubDate>Fri, 29 Feb 2008 10:25:51 GMT</pubDate><ttl>60</ttl><item><title>SSH中 struts hibernate spring 各起什么作用?</title><link>http://www.blogjava.net/balajinima/articles/182937.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Fri, 29 Feb 2008 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/182937.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/182937.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/182937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/182937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/182937.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<font size="4">简单的说：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 3.0">
				<span lang="EN-US" style="FONT-SIZE: 14pt">struts </span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控制用的</span>
				<span style="FONT-SIZE: 14pt">
						<span lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 3.0">
				<span lang="EN-US" style="FONT-SIZE: 14pt">hibernate </span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作数据库的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 3.0">
				<span lang="EN-US" style="FONT-SIZE: 14pt">spring </span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用解耦的</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">
						<br />
				</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">详细的说：</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 3.0">
				<span lang="EN-US" style="FONT-SIZE: 14pt">STRUTS </span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">SSH</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架中起控制的作用</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其核心是</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">Controller,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">ActionServlet,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">ActionServlet</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的核心就是</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">Struts-confi g.xml.</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要控制逻辑关系的处理</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">. <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 42pt; mso-char-indent-count: 3.0">
				<span lang="EN-US" style="FONT-SIZE: 14pt">hibernate</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是数据持久化层</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一种新的对象、关系的映射工具</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了从</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">Java</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类到数据表的映射，也提供了数据查询和恢复等机制</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大大减少数据访问的复杂度。把对数据库的直接操作</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">,</span>
				<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">转换为对持久对象的操作</span>
				<span lang="EN-US" style="FONT-SIZE: 14pt">.<o:p></o:p></span>
		</p>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">SPRING </span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">是一个轻量级的控制反转</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(IoC)</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">和面向切面</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">(AOP)</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">的容器框架</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">面向接口的编程</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">,</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">由容器控制程序之间的（依赖）关系，而非传统实现中，由程序代码直接操控。这也就是所谓</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">“</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">控制反转</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">”</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">的概念所在：（依赖）控制权由应用代码中转到了外部容器，控制权的转移，是所谓反转。依赖注入，即组件之间的依赖关系由容器在运行期决定，形象的来说，即由容器动态的将某种依赖关系注入到组件之中</span>
		<span lang="EN-US" style="FONT-SIZE: 14pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
				<br />
		</span>
		<span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">起到的主要作用是解耦</span>
		<br />
		<br />
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Struts</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">spring</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在各层的作用</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">struts </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">负责</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">层</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">. <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">ActionFormBean </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">接收网页中表单提交的数据，然后通过</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Action </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">进行处理，再</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Forward</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">到对应的网页。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">struts-config.xml</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中定义</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">&lt;action-mapping&gt;, ActionServlet</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">会加载。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">spring </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">负责业务层管理，即</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Service</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">（或</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Manager).<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">1</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">．</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> service</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">为</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">action</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">提供统计的调用接口，封装持久层的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">DAO.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">．可以写一些自己的业务方法。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">3</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">．统一的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">javabean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">管理方法</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">4</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">．声明式事务管理</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">5.</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">集成</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Hiberante<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">3</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Hiberante</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，负责持久化层，完成数据库的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">crud</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">操作</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">hibernate </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">为持久层，提供</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> OR/Mapping</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">它有一组</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> .hbm.xml</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">文件和</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> POJO,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">是跟数据库中的表相对应的。然后定义</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">DAO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，这些是跟数据库打交道的类，它们会使用</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">PO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">struts+spring+hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的系统中，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">对象的调用流程是：</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">jsp-&gt; Action</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">－</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">&gt; Service -&gt;DAO -&gt;Hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">数据的流向是</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> ActionFormBean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">接受用户的数据，</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Action </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">将数据从</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt"> ActionFromBean </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中取出，封装成</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">VO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">或</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">PO, <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">再调用业务层的</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">类，完成各种业务处理后再</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">forward</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。而业务层</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Bean</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">收到这个</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">PO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">对象之后，会调用</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">DAO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">接口方法，进行持久化操作。</span>
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="mso-bidi-font-size: 10.5pt">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/balajinima/aggbug/182937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2008-02-29 15:19 <a href="http://www.blogjava.net/balajinima/articles/182937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>控制反转(Ioc) </title><link>http://www.blogjava.net/balajinima/articles/146913.html</link><dc:creator>李云泽</dc:creator><author>李云泽</author><pubDate>Thu, 20 Sep 2007 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/balajinima/articles/146913.html</guid><wfw:comment>http://www.blogjava.net/balajinima/comments/146913.html</wfw:comment><comments>http://www.blogjava.net/balajinima/articles/146913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/balajinima/comments/commentRss/146913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/balajinima/services/trackbacks/146913.html</trackback:ping><description><![CDATA[
		<p>    <br /> 缩略显示      </p>
		<p>控制反转(Ioc) <br />        控制反转（IOC）模式(又称DI：Dependency Injection)就是Inversion of Control，控制反转。在Java开发中，IoC意味着将你设计好的类交给系统去控制，而不是在你的类内部控制。这称为控制反转。</p>
		<p>        IoC(Inversion of Control)是近年来兴起的一种思想，不仅仅是编程思想。主要是协调各组件间相互的依赖关系，同时大大提高了组件的可移植性，组件的重用机会也变得更多。在传统的实现中，由程序内部代码来控制程序之间的关系。我们经常使用new关键字来实现两组键间关系的组合，这种实现的方式会造成组件之间耦合(一个好的设计，不但要实现代码重用，还要将组件间关系解耦)。IoC很好的解决了该问题，它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部的容器来完成。即常说的好莱坞原则“Don't call us, we'll call you”。 </p>
		<p>      Ioc也有称为DI(Dependecy Injection 依赖注射)，由Martin Fowler的一篇《Inversion of Control Containers and the Dependency Injection pattern》提出。 </p>
		<p>
				<br />　　分离关注（ Separation of Concerns : SOC）是Ioc模式和AOP产生最原始动力，通过功能分解可得到关注点，这些关注可以是 组件Components, 方面Aspects或服务Services。</p>
		<p>　　从GOF设计模式中，我们已经习惯一种思维编程方式：Interface Driven Design 接口驱动，接口驱动有很多好处，可以提供不同灵活的子类实现，增加代码稳定和健壮性等等，但是接口一定是需要实现的，也就是如下语句迟早要执行：</p>
		<p>　　AInterface a = new AInterfaceImp(); </p>
		<p>　　AInterfaceImp是接口AInterface的一个子类，Ioc模式可以延缓接口的实现，根据需要实现，有个比喻：接口如同空的模型套，在必要时，需要向模型套注射石膏，这样才能成为一个模型实体，因此，我们将人为控制接口的实现成为“注射”。</p>
		<p>　　Ioc英文为 Inversion of Control，即反转模式，这里有著名的好莱坞理论：你呆着别动，到时我会找你。</p>
		<p>　　其实Ioc模式也是解决调用者和被调用者之间的一种关系，上述AInterface实现语句表明当前是在调用被调用者AInterfaceImp，由于被调用者名称写入了调用者的代码中，这产生了一个接口实现的原罪：彼此联系，调用者和被调用者有紧密联系，在UML中是用依赖 Dependency 表示。</p>
		<p>　　但是这种依赖在分离关注的思维下是不可忍耐的，必须切割，实现调用者和被调用者解耦，新的Ioc模式 Dependency Injection 模式由此产生了， Dependency Injection模式是依赖注射的意思，也就是将依赖先剥离，然后在适当时候再注射进入。</p>
		<p>一、Ioc模式（Dependency Injection模式）有三种：</p>
		<p>      第一种类型 从JNDI或ServiceManager等获得被调用者，这里类似ServiceLocator模式。 1.EJB/j2ee 2. Avalon（Apache的一个复杂使用不多的项目） <br />      第二种类型 使用JavaBeans的setter方法 1. Spring Framework,2.WebWork/XWork <br />      第三种类型 在构造方法中实现依赖 1. PicoContainer,2. HiveMind </p>
		<p>　　有过EJB开发经验的人都知道，每个EJB的调用都需要通过JNDI寻找到工厂性质的Home接口，在我的教程EJB是什么章节中，我也是从依赖和工厂模式角度来阐述EJB的使用。</p>
		<p>　　在通常传统情况下，为了实现调用者和被调用者解耦，分离，一般是通过工厂模式实现的，下面将通过比较工厂模式和Ioc模式不同，加深理解Ioc模式。</p>
		<p>二、工厂模式和Ioc</p>
		<p>　　假设有两个类B 和 C：B作为调用者，C是被调用者，在B代码中存在对C的调用：</p>
		<p>
		</p>
		<p>java 代码<br />public class B{    <br />　　 private C comp;     <br />　　......    <br />}    </p>
		<p> </p>
		<p>　　实现comp实例有两种途径：单态工厂模式和Ioc。</p>
		<p>工厂模式实现如下：</p>
		<p>java 代码<br />public class B{    <br />　　 private C comp;     <br />　　private final static MyFactory myFactory = MyFactory.getInstance();    <br />   <br />　　public B(){    <br />　　　　this.comp = myFactory.createInstanceOfC();    <br />   <br />　　}    <br />　　 public void someMethod(){    <br />　　　　this.comp.sayHello();    <br />　 }     <br />　　......    <br />}    </p>
		<p> </p>
		<p>特点：</p>
		<p>每次运行时，MyFactory可根据XML配置文件中定义的C子类实现，通过createInstanceOfC()生成C的具体实例。 <br />使用Ioc依赖性注射( Dependency Injection )实现Picocontainer如下，B类如同通常POJO类，如下：</p>
		<p>java 代码<br />public class B{    <br />　　 private C comp;     <br />　　public B(C comp){    <br />　　　　this.comp = comp;    <br />　　 }    <br />　　 public void someMethod(){    <br />　　　　this.comp.sayHello();    <br />　　 }    <br />　　......    <br />}    </p>
		<p>
				<br /> </p>
		<p>假设C接口/类有有一个具体实现CImp类。当客户端调用B时，使用下列代码：</p>
		<p>java 代码<br />public class client{    <br />　　 public static void main( String[] args ) {    <br />　　　　DefaultPicoContainer container = new DefaultPicoContainer();    <br />　　　　container.registerComponentImplementation(CImp.class);    <br />　　　　container.registerComponentImplementation(B.class);    <br />　　　　B b = (B) container.getComponentInstance(B.class);    <br />　　　　b.someMethod();    <br />　　 }    <br />}    </p>
		<p>
				<br /> </p>
		<p>　　因此，当客户端调用B时，分别使用工厂模式和Ioc有不同的特点和区别：</p>
		<p>　　主要区别体现在B类的代码，如果使用Ioc，在B类代码中将不需要嵌入任何工厂模式等的代码，因为这些工厂模式其实还是与C有些间接的联系，这样，使用Ioc彻底解耦了B和C之间的联系。</p>
		<p>　　使用Ioc带来的代价是：需要在客户端或其它某处进行B和C之间联系的组装。</p>
		<p>　　所以，Ioc并没有消除B和C之间这样的联系，只是转移了这种联系。<br />　　这种联系转移实际也是一种分离关注，它的影响巨大，它提供了AOP实现的可能。</p>
		<p>Ioc和AOP<br />　　AOP我们已经知道是一种面向切面的编程方式，由于Ioc解放自由了B类，而且可以向B类实现注射C类具体实现，如果把B类想像成运行时的横向动作，无疑注入C类子类就是AOP中的一种Advice，如下图：</p>
		<p> </p>
		<p>　　通过下列代码说明如何使用Picocontainer实现AOP，该例程主要实现是记录logger功能，通过Picocontainer可以使用简单一行，使所有的应用类的记录功能激活。</p>
		<p>首先编制一个记录接口：</p>
		<p>java 代码<br />public interface Logging {    <br />   <br />　　public void enableLogging(Log log);    <br />   <br />}   </p>
		<p>
				<br /> </p>
		<p>有一个LogSwitcher类，主要用来激活具体应用中的记录功能：</p>
		<p>java 代码<br />import org.apache.commons.logging.Log;    <br />public class LogSwitcher    <br />{    <br />　 protected Log m_log;    <br />　 public void enableLogging(Log log) {    <br />　　　　m_log = log;    <br />　　　　m_log.info("Logging Enabled");    <br />　　}    <br />}    </p>
		<p>一般的普通应用JavaBeans都可以继承这个类，假设PicoUserManager是一个用户管理类，代码如下：</p>
		<p>java 代码<br />public class PicoUserManager extends LogSwitcher    <br />{     <br />　　..... //用户管理功能    <br />}    <br />public class PicoXXXX1Manager extends LogSwitcher    <br />{     <br />   <br />　　..... //业务功能    <br />}    <br />public class PicoXXXX2Manager extends LogSwitcher    <br />{     <br />   <br />　　..... //业务功能    <br />}   </p>
		<p>
				<br /> </p>
		<p>注意LogSwitcher中Log实例是由外界赋予的，也就是说即将被外界注射进入，下面看看使用Picocontainer是如何注射Log的具体实例的。</p>
		<p> </p>
		<p>
				<br />java 代码<br />DefaultPicoContainer container = new DefaultPicoContainer();    <br />container.registerComponentImplementation(PicoUserManager.class);    <br />container.registerComponentImplementation(PicoXXXX1Manager.class);     <br />container.registerComponentImplementation(PicoXXXX2Manager.class);    <br />.....     <br />   <br />Logging logging = (Logging) container.getComponentMulticaster();    <br />   <br />logging.enableLogging(new SimpleLog("pico"));//激活log   </p>
		<p>
				<br /> </p>
		<p>　　由上代码可见，通过使用简单一行logging.enableLogging()方法使所有的应用类的记录功能激活。这是不是类似AOP的advice实现？</p>
		<p>　　总之，使用Ioc模式，可以不管将来具体实现，完全在一个抽象层次进行描述和技术架构，因此，Ioc模式可以为容器、框架之类的软件实现提供了具体的实现手段，属于架构技术中一种重要的模式应用。J道的JdonSD框架也使用了Ioc模式。</p>
		<p>参考资料：</p>
		<p>Inversion of Control Containers and the Dependency Injection pattern<br />A Brief Introduction to IoC <br />Ioc容器的革命性优点<br />Java企业系统架构选择考量<br />IOC模式的思考和疑问</p>
		<p>三、IoC的几种实现类型</p>
		<p>(1)Type1接口注入</p>
		<p>通常做法是利用接口将调用者与实现者分离。</p>
		<p>
				<br />java 代码<br />public class Sport {    <br />private InterfaceBall ball; //InterfaceBall是定义的接口    <br />public void init() {    <br />//Basketball实现了InterfaceBall接口    <br />ball = (InterfaceBall) Class.forName("Basketball").newInstance();    <br />}    <br />}   </p>
		<p>
				<br />Sport类在编译期依赖于InterfaceBall的实现，为了将调用者与实现者分离，我们动态生成Basketball类并通了强制类型转换为InterfaceBall。Apache Avalon是一个典型的Type1型IoC容器。</p>
		<p>(2)setter方法注入</p>
		<p>在类中暴露setter方法来实现依赖关系。</p>
		<p>
				<br />java 代码<br />public class Sport {    <br />private InterfaceBall ball;    <br />public void setBall(InterfaceBall arg) {    <br />ball = arg;    <br />}    <br />}   </p>
		<p>
				<br />这种方式对已经习惯了JavaBean的程序员而言，更显直观。Spring就是实现了该类型的轻量级容器。</p>
		<p>(3)Type3构造子注入</p>
		<p>即通过构造方法完成依赖关系。</p>
		<p>
				<br />java 代码<br />public class Sport {    <br />private InterfaceBall ball;    <br />public Sport(InterfaceBall arg) {    <br />ball = arg;    <br />}    <br />}   </p>
		<p>
				<br />可以看到，通过类的构造方法建立依赖关系。由于Type3在构造期就形成了对象的依赖关系，即存对象的重用变的困难。有些框架需要组件提供一个默认的构造方法，此时就体现了Type3的局限性。通常所有的参数都是通过构造方法注入的，当对象间的依赖关系较多时，构造方法就显的比较复杂，不利于单元测试。PicoContainer就是实现了Type3依赖注入模式的轻量级容器。<br /> <br /></p>
<img src ="http://www.blogjava.net/balajinima/aggbug/146913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/balajinima/" target="_blank">李云泽</a> 2007-09-20 20:22 <a href="http://www.blogjava.net/balajinima/articles/146913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>