﻿<?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-honeybee-文章分类-spring</title><link>http://www.blogjava.net/honeybee/category/26932.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Nov 2007 22:09:21 GMT</lastBuildDate><pubDate>Tue, 27 Nov 2007 22:09:21 GMT</pubDate><ttl>60</ttl><item><title>Struts配置连接池错误解决问题及实例</title><link>http://www.blogjava.net/honeybee/articles/163351.html</link><dc:creator>sun</dc:creator><author>sun</author><pubDate>Mon, 26 Nov 2007 15:37:00 GMT</pubDate><guid>http://www.blogjava.net/honeybee/articles/163351.html</guid><wfw:comment>http://www.blogjava.net/honeybee/comments/163351.html</wfw:comment><comments>http://www.blogjava.net/honeybee/articles/163351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honeybee/comments/commentRss/163351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honeybee/services/trackbacks/163351.html</trackback:ping><description><![CDATA[<span font-family: 宋体;?>我用的是</span>tomcat5.5，配置了日志之后打印出下列信息：<br />
&nbsp;&nbsp;&nbsp; <font color="#000000">&nbsp;&nbsp; <strong>ERROR main org.springframework.web.context.ContextLoader - Context initialization failed<br />
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool<br />
Caused by: <br />
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool<br />
&nbsp;&nbsp;&nbsp; at java.lang.Class.getDeclaredConstructors0(Native Method)<br />
&nbsp;&nbsp;&nbsp; at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)<br />
&nbsp;&nbsp;&nbsp; at java.lang.Class.getConstructor0(Class.java:2640)<br />
&nbsp;&nbsp;&nbsp; at java.lang.Class.getDeclaredConstructor(Class.java:1953)<br />
&nbsp;&nbsp;&nbsp; &#8230;&#8230;</strong><br />
<br />
&nbsp;&nbsp;&nbsp; 从日志信息看问题已经很明显了，是applicationContext.xml的dataSource问题。<br />
解决方法：<br />
1&nbsp; 将&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
&nbsp;&nbsp;&nbsp; 改为&lt;bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;之后问题得到解决。（org.springframework.jdbc.datasource.DriverManagerDataSource 不可以使用连接池。）<br />
2 org.apache.commons.dbcp.BasicDataSource作为注入的DataSource源，为了使用 DBCP的功能，必须要将commons-dbcp.jar加入CLASSPATH中，另外还需要commons-pool.jar和commons- collections.jar，这些都可以在Spring的lib目录下找到。<br />
org.springframework.jdbc.datasource.DriverManagerDataSource并没有提供连接池的功能，只能作作简单的单机连接测试。使用org.apache.commons.dbcp.BasicDataSource时缺少commons-pool.jar所以会出现如题的问题。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 从日志信息看问题已经很明显了，是applicationContext.xml的dataSource问题。<br />
解决方法：<br />
1&nbsp; 将&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
&nbsp;&nbsp;&nbsp; 改为&lt;bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;之后问题得到解决。（org.springframework.jdbc.datasource.DriverManagerDataSource 不可以使用连接池。）<br />
2 org.apache.commons.dbcp.BasicDataSource作为注入的DataSource源，为了使用 DBCP的功能，必须要将commons-dbcp.jar加入CLASSPATH中，另外还需要commons-pool.jar和commons- collections.jar，这些都可以在Spring的lib目录下找到。<br />
org.springframework.jdbc.datasource.DriverManagerDataSource并没有提供连接池的功能，只能作作简单的单机连接测试。使用org.apache.commons.dbcp.BasicDataSource时缺少commons-pool.jar所以会出现如题的问题。 </font>
 <img src ="http://www.blogjava.net/honeybee/aggbug/163351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honeybee/" target="_blank">sun</a> 2007-11-26 23:37 <a href="http://www.blogjava.net/honeybee/articles/163351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring事务管理</title><link>http://www.blogjava.net/honeybee/articles/157834.html</link><dc:creator>sun</dc:creator><author>sun</author><pubDate>Fri, 02 Nov 2007 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/honeybee/articles/157834.html</guid><wfw:comment>http://www.blogjava.net/honeybee/comments/157834.html</wfw:comment><comments>http://www.blogjava.net/honeybee/articles/157834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honeybee/comments/commentRss/157834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honeybee/services/trackbacks/157834.html</trackback:ping><description><![CDATA[&nbsp;
<h3>Spring <span style="font-family: 宋体">事务管理</span></h3>
<p style="text-indent: 19pt"><span style="font-size: 9.5pt; color: #333333">Spring</span><span style="font-size: 9.5pt; color: #333333; font-family: 宋体">提供的事务管理可以分为两类：编程式的和声明式的。编程式的，比较灵活，但是代码量大，存在重复的代码比较多</span><span style="font-size: 9.5pt; color: #333333">;</span><span style="font-size: 9.5pt; color: #333333; font-family: 宋体">声明式的比编程式的更灵活方便。</span></p>
<h4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring<span style="font-family: 黑体">提供的编程式的事务处理</span></h4>
<p><span style="font-family: 宋体">　　</span>Spring<span style="font-family: 宋体">提供了几个关于事务处理的类：</span></p>
<p><span style="font-family: 宋体">　　</span>TransactionDefinition //<span style="font-family: 宋体">事务属性定义</span></p>
<p>TranscationStatus //<span style="font-family: 宋体">代表了当前的事务，可以提交，回滚。</span></p>
<p><span style="font-size: 9.5pt; color: #333333">TransactionTemplate//</span>Spring<span style="font-family: 宋体">提供的事务模板</span></p>
<p><span style="font-family: 宋体">　　</span>PlatformTransactionManager<span style="font-family: 宋体">这个是</span>spring<span style="font-family: 宋体">提供的用于管理事务的基础接口，其下有一个实现的抽象类</span>AbstractPlatformTransactionManager<span style="font-family: 宋体">，我们使用的事务管理类例如</span>DataSourceTransactionManager<span style="font-family: 宋体">等都是这个类的子类。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">我们使用编程式的事务管理流程可能如下：</span></p>
<p style="text-indent: 21pt">(1) <span style="font-family: 宋体">声明数据源。</span></p>
<p style="text-indent: 21pt">(2) <span style="font-family: 宋体">声明一个事务管理类，例如：</span>DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager<span style="font-family: 宋体">等</span></p>
<p><span style="font-family: 宋体">　　</span>(3) <span style="font-family: 宋体">在我们的代码中加入事务处理代码：</span></p>
<p><span style="font-family: 宋体">　　</span>TransactionDefinition td = new TransactionDefinition();</p>
<p><span style="font-family: 宋体">　　</span>TransactionStatus ts = transactionManager.getTransaction(td);</p>
<p><span style="font-family: 宋体">　　</span>try{</p>
<p><span style="font-family: 宋体">　　</span>//do sth<span style="font-family: 宋体">　</span>transactionManager.commit(ts);</p>
<p><span style="font-family: 宋体">　　</span>}catch(Exception e){transactionManager.rollback(ts);</p>
<p><span style="font-family: 宋体">　　</span>}</p>
<p><span style="font-family: 宋体">　　使用</span>Spring<span style="font-family: 宋体">提供的事务模板</span>TransactionTemplate<span style="font-family: 宋体">：</span></p>
<p><span style="font-family: 宋体">　　</span>void add(){</p>
<p><span style="font-family: 宋体">　　</span>transactionTemplate.execute( new TransactionCallback(){</p>
<p><span style="font-family: 宋体">　　</span>public Object doInTransaction(TransactionStatus ts){</p>
<p><span style="font-family: 宋体">　　</span>//do sth}</p>
<p><span style="font-family: 宋体">　　</span>}}</p>
<p style="text-indent: 21pt">TransactionTemplate<span style="font-family: 宋体">也是为我们省去了部分事务提交、回滚代码</span>;<span style="font-family: 宋体">定义事务模板时，需注入事务管理对象。</span></p>
<h4>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring<span style="font-family: 黑体">提供的声明式事务处理</span></h4>
<p><span style="font-family: 宋体">　　</span>Spring<span style="font-family: 宋体">声明式事务处理也主要使用了</span>IoC<span style="font-family: 宋体">，</span>AOP<span style="font-family: 宋体">思想，提供了</span>TransactionInterceptor<span style="font-family: 宋体">拦截器和常用的代理类</span>TransactionProxyFactoryBean<span style="font-family: 宋体">，可以直接对组件进行事务代理。</span></p>
<p style="margin-bottom: 12pt; line-height: 17pt"><span style="font-family: 宋体">　　使用</span>TransactionInterceptor<span style="font-family: 宋体">的步骤：</span><br />
<span style="font-family: 宋体">　　（</span>1<span style="font-family: 宋体">）定义数据源，事务管理类</span><br />
<span style="font-family: 宋体">　　（</span>2<span style="font-family: 宋体">）定义事务拦截器</span>,<span style="font-family: 宋体">例如：</span></p>
<div align="center">
<table style="border-right: #cccccc 1pt outset; border-top: #cccccc 1pt outset; background: #e7e9e9; border-left: #cccccc 1pt outset; width: 90%; border-bottom: #cccccc 1pt outset" cellpadding="0" width="90%" border="1">
    <tbody>
        <tr>
            <td style="border-right: #cccccc 1pt inset; padding-right: 0.75pt; border-top: #cccccc 1pt inset; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: #cccccc 1pt inset; padding-top: 0.75pt; border-bottom: #cccccc 1pt inset">
            <p style="line-height: 17pt; text-align: left" align="left"><span style="font-size: 8pt; color: #666666; font-family: 宋体">＜bean id = "transactionInterceptor" <br />
            class="org.springframework.transaction.interceptor.TransactionInterceptor"＞<br />
            ＜property name="transactionManager"＞＜ref bean="transactionManager"/＞＜/property＞<br />
            ＜property name="transactionAttributeSource"＞<br />
            ＜value＞<br />
            com.test.UserManager.*r=PROPAGATION_REQUIRED<br />
            ＜/value＞<br />
            ＜/property＞<br />
            ＜/bean＞</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin-bottom: 12pt; line-height: 17pt; text-align: left" align="left"><span style="font-size: 9.5pt; color: #666666; font-family: 宋体">　　</span><span style="font-family: 宋体">（</span>3<span style="font-family: 宋体">）为组件声明一个代理类：</span>ProxyFactoryBean</p>
<div align="center">
<table style="border-right: #cccccc 1pt outset; border-top: #cccccc 1pt outset; background: #e7e9e9; border-left: #cccccc 1pt outset; width: 90%; border-bottom: #cccccc 1pt outset" cellpadding="0" width="90%" border="1">
    <tbody>
        <tr>
            <td style="border-right: #cccccc 1pt inset; padding-right: 0.75pt; border-top: #cccccc 1pt inset; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: #cccccc 1pt inset; padding-top: 0.75pt; border-bottom: #cccccc 1pt inset">
            <p style="line-height: 17pt; text-align: left" align="left"><span style="font-size: 8pt; color: #666666; font-family: 宋体">＜bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean"＞<br />
            ＜property name="proxyInterfaces"＞＜value＞com.test.UserManager＜/value＞＜/property＞<br />
            ＜property name="interceptorNames"＞<br />
            ＜list＞<br />
            ＜idref local="transactionInterceptor"/＞<br />
            ＜/list＞<br />
            ＜/property＞<br />
            ＜/bean＞</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="margin-bottom: 12pt; line-height: 17pt; text-align: left" align="left"><span style="font-size: 9.5pt; color: #666666; font-family: 宋体">　　</span><span style="font-family: 宋体">使用</span>TransactionProxyFactoryBean<span style="font-family: 宋体">：</span></p>
<div align="center">
<table style="border-right: #cccccc 1pt outset; border-top: #cccccc 1pt outset; background: #e7e9e9; border-left: #cccccc 1pt outset; width: 90%; border-bottom: #cccccc 1pt outset" cellpadding="0" width="90%" border="1">
    <tbody>
        <tr>
            <td style="border-right: #cccccc 1pt inset; padding-right: 0.75pt; border-top: #cccccc 1pt inset; padding-left: 0.75pt; padding-bottom: 0.75pt; border-left: #cccccc 1pt inset; padding-top: 0.75pt; border-bottom: #cccccc 1pt inset">
            <p style="line-height: 17pt; text-align: left" align="left"><span style="font-size: 8pt; color: #666666; font-family: 宋体">＜bean id="userManager"<br />
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"＞<br />
            ＜property name="transactionManager"＞＜ref bean="transactionManager"/＞＜/property＞<br />
            ＜property name="target"＞＜ref local="userManagerTarget"/＞＜/property＞<br />
            ＜property name="transactionAttributes"＞<br />
            ＜props＞<br />
            ＜prop key="insert*"＞PROPAGATION_REQUIRED＜/prop＞<br />
            ＜prop key="update*"＞PROPAGATION_REQUIRED＜/prop＞<br />
            ＜prop key="*"＞PROPAGATION_REQUIRED,readOnly＜/prop＞<br />
            ＜/props＞<br />
            ＜/property＞<br />
            ＜/bean＞</span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p><span style="font-size: 9.5pt; color: #666666; font-family: 宋体">　　</span>TransactionProxyFactoryBean<span style="font-family: 宋体">只是为组件的事务代理，如果我们要给组件添加一些业务方面的验证等，可以使用</span>TransactionTemplate<span style="font-family: 宋体">加拦截器方式，为组件添加多个拦截器，</span>spring AOP<span style="font-family: 宋体">中提供了三类</span>Advice,<span style="font-family: 宋体">即前增强，后增强，抛出异常时的增强，可以灵活使用。</span></p>
<img src ="http://www.blogjava.net/honeybee/aggbug/157834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honeybee/" target="_blank">sun</a> 2007-11-02 21:13 <a href="http://www.blogjava.net/honeybee/articles/157834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Bean 封装机制——Spring学习笔记（2）</title><link>http://www.blogjava.net/honeybee/articles/157326.html</link><dc:creator>sun</dc:creator><author>sun</author><pubDate>Wed, 31 Oct 2007 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/honeybee/articles/157326.html</guid><wfw:comment>http://www.blogjava.net/honeybee/comments/157326.html</wfw:comment><comments>http://www.blogjava.net/honeybee/articles/157326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honeybee/comments/commentRss/157326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honeybee/services/trackbacks/157326.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<h3>Spring Bean <span style="font-family: 宋体">封装机制</span></h3>
<p style="text-indent: 21pt">Spring <span style="font-family: 宋体">大量引入了</span>Java <span style="font-family: 宋体">的</span>Reflection<span style="font-family: 宋体">机制，通过动态调用的方式避免硬编码方式的约束，并在此基础上建立了其核心组件</span>BeanFactory<span style="font-family: 宋体">，以此作为其依赖注入机制的实现基础。</span></p>
<p style="text-indent: 21pt">org.springframework.beans<span style="font-family: 宋体">包中包括了这些核心组件的实现类，核心中的核心为</span><span style="color: red">BeanWrapper</span><span style="font-family: 宋体">和</span><span style="color: red">BeanFactory</span><span style="font-family: 宋体">类。（<span style="color: red">对其源码进行研读</span>，必有所获）。</span>BeanFactory<span style="font-family: 宋体">家族如图</span>1<span style="font-family: 宋体">所示。</span></p>
<p style="text-align: center" align="center"><span style="font-family: 宋体">图</span>1&nbsp;BeanFactory<span style="font-family: 宋体">家族</span></p>
<h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">BeanWrapper</span></h4>
<p style="text-indent: 21pt"><span style="font-family: 宋体">讲的通俗点，就是在运行期，由</span>Spring<span style="font-family: 宋体">根据配置文件，将其他对象的引用通过组件的提供的</span>setter<span style="font-family: 宋体">方法进行设定。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">通过</span>BeanWrapper<span style="font-family: 宋体">，我们可以无需在编码时就指定</span>JavaBean<span style="font-family: 宋体">的实现类和属性值，通过在配置文件加以设定，就可以在运行期动态创建对象并设定其属性（依赖关系）。</span></p>
<h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">BeanFactory</span></h4>
<p style="text-indent: 21pt">Bean Factory<span style="font-family: 宋体">，顾名思义，负责创建并维护</span>Bean<span style="font-family: 宋体">实例。</span></p>
<p style="text-indent: 21pt">Bean Factory<span style="font-family: 宋体">负责根据配置文件创建</span>Bean<span style="font-family: 宋体">实例，可以配置的项目有：</span></p>
<p style="text-indent: 21pt">1<span style="font-family: 宋体">．</span> Bean<span style="font-family: 宋体">属性值及依赖关系（对其他</span>Bean<span style="font-family: 宋体">的引用）</span></p>
<p style="text-indent: 21pt">2<span style="font-family: 宋体">．</span> Bean<span style="font-family: 宋体">创建模式（是否</span>Singleton<span style="font-family: 宋体">模式，即是否只针对指定类维持全局唯一的实例）</span></p>
<p style="text-indent: 21pt">3<span style="font-family: 宋体">．</span> Bean<span style="font-family: 宋体">初始化和销毁方法</span></p>
<p style="text-indent: 21pt">4<span style="font-family: 宋体">．</span> Bean<span style="font-family: 宋体">的依赖关系</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">联合上面关于</span>BeanWrapper<span style="font-family: 宋体">的内容，我们可以看到，</span>BeanWrapper<span style="font-family: 宋体">实现了针对单个</span>Bean<span style="font-family: 宋体">的属性设定操作。而</span>BeanFactory<span style="font-family: 宋体">则是针对多个</span>Bean<span style="font-family: 宋体">的管理容器，根据给定的配置文件，</span>BeanFactory<span style="font-family: 宋体">从中读取类名、属性名</span>/<span style="font-family: 宋体">值，然后通过</span>Reflection<span style="font-family: 宋体">机制进行</span>Bean<span style="font-family: 宋体">加载和属性设定。</span></p>
<h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">ApplicationContext</span></h4>
<p style="text-indent: 21pt">ApplicationContext<span style="font-family: 宋体">覆盖了</span>BeanFactory<span style="font-family: 宋体">的所有功能，并提供了更多的特性。此外</span>ApplicationContext<span style="font-family: 宋体">为与现有应用框架相整合，提供了更为开放式的实现（如对于</span>Web<span style="font-family: 宋体">应用，我们可以在</span>web.xml<span style="font-family: 宋体">中对</span>ApplicationContext<span style="font-family: 宋体">进行配置）。</span></p>
<p><span style="font-family: 宋体">相对</span>BeanFactory<span style="font-family: 宋体">而言，</span>ApplicationContext<span style="font-family: 宋体">提供了以下扩展功能：</span></p>
<p>1<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">国际化支持（</span>MessageSource<span style="font-family: 宋体">）</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">我们可以在</span>Beans.xml<span style="font-family: 宋体">文件中，对程序中的语言信息（如提示信息）进行定义，将程序中的提示信息抽取到配置文件中加以定义，为我们进行应用的各语言版本转换提供了极大的灵活性。</span></p>
<p>2<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">资源访问（</span>ResourceLoader<span style="font-family: 宋体">）</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">支持对文件和</span>URL<span style="font-family: 宋体">的访问。</span></p>
<p>3<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">事件传播（</span>ApplicationEventPublisher<span style="font-family: 宋体">）</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">事件传播特性为系统中状态改变时的检测提供了良好支持。</span></p>
<p>4<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">多实例加载可以在同一个应用中加载多个</span>Context<span style="font-family: 宋体">实例。（</span>ListableBeanFactory<span style="font-family: 宋体">）</span></p>
<h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">WebApplication</span><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">Context</span></h4>
<p style="text-indent: 21pt"><span style="font-family: 宋体">与</span>ApplicationContext<span style="font-family: 宋体">的区别：</span>ApplicationContext<span style="font-family: 宋体">均通过编码加载。对于</span>Web<span style="font-family: 宋体">应用，</span>Spring<span style="font-family: 宋体">提供了可配置的</span>ApplicationContext<span style="font-family: 宋体">加载机制。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">两种加载器：</span>ContextLoaderServlet , ContextLoaderListener</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">配置非常简单，在</span>web.xml<span style="font-family: 宋体">中增加：</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">listener</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">listener-class</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">org.springframework.web.context.contextLoaderLisenter</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">listener-class</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">listener</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 宋体">或：</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">servlet</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">servlet-name</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">context</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">servlet-name</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">servlet-class</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">org.springframework.web.context.contextLoaderServlet</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">servlet-class</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">load-on-startup</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">load-on-startup</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="text-indent: 10.5pt"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">servlet</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">通过以<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span>上配置，</span>Web<span style="font-family: 宋体">容器会自动加载</span>/WEB-INF/applicationContext.xml<span style="font-family: 宋体">初始化</span>ApplicationContext<span style="font-family: 宋体">。<br />
<br />
<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></span></span></p>
<img src ="http://www.blogjava.net/honeybee/aggbug/157326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honeybee/" target="_blank">sun</a> 2007-10-31 22:01 <a href="http://www.blogjava.net/honeybee/articles/157326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>控制反转（IOC）与依赖注入（DI）——spring学习笔记（1）</title><link>http://www.blogjava.net/honeybee/articles/156767.html</link><dc:creator>sun</dc:creator><author>sun</author><pubDate>Mon, 29 Oct 2007 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/honeybee/articles/156767.html</guid><wfw:comment>http://www.blogjava.net/honeybee/comments/156767.html</wfw:comment><comments>http://www.blogjava.net/honeybee/articles/156767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/honeybee/comments/commentRss/156767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/honeybee/services/trackbacks/156767.html</trackback:ping><description><![CDATA[&nbsp;
<h3>IoC<span style="font-family: 宋体">，</span></h3>
<p><span style="font-family: 宋体">用白话来讲，就是由容器控制程序之间的关系，而非传统实现中，由程序代码直接操控。这也就是所谓&#8220;控制反转&#8221;的概念所在：控制权由应用代码中转到了外部容器，控制权的转移，是所谓反转。</span></p>
<h3>DI<span style="font-family: 宋体">，</span></h3>
<h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">依赖注入的几种实现类型:</span></h4>
<p>1.<span style="font-family: 宋体">接口注入</span></p>
<p>2.<span style="font-family: 宋体">构造子注入</span></p>
<p>3.<span style="font-family: 宋体">设值注入</span></p>
<h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">几种依赖注入模式的对比总结</span></h4>
<p style="text-indent: 21pt"><span style="font-family: 宋体">接口注入模式因为具备侵入性，它要求组件必须与特定的接口相关联，因此并不被看好，实际使用有限。</span></p>
<p style="text-indent: 21pt">Type2<span style="font-family: 宋体">和</span>Type3<span style="font-family: 宋体">的依赖注入实现模式均具备无侵入性的特点。在笔者看来，这两种实现方式各有特点，也各具优势（一句经典废话</span>J<span style="font-family: 宋体">）。</span></p>
<p>Type2 <span style="font-family: 宋体">构造子注入的<span style="border-right: windowtext 1pt solid; padding-right: 0cm; border-top: windowtext 1pt solid; padding-left: 0cm; padding-bottom: 0cm; border-left: windowtext 1pt solid; padding-top: 0cm; border-bottom: windowtext 1pt solid">优势</span>：</span></p>
<p>1<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">&#8220;在构造期即创建一个完整、合法的对象&#8221;，对于这条</span>Java<span style="font-family: 宋体">设计原则，</span>Type2<span style="font-family: 宋体">无疑是最好的</span></p>
<p><span style="font-family: 宋体">响应者。</span></p>
<p>2<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">避免了繁琐的</span>setter<span style="font-family: 宋体">方法的编写，所有依赖关系均在构造函数中设定，依赖关系集中呈现，</span></p>
<p><span style="font-family: 宋体">更加易读。</span></p>
<p>3<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">由于没有</span>setter<span style="font-family: 宋体">方法，依赖关系在构造时由容器一次性设定，因此组件在被创建之后即处于相对&#8220;不变&#8221;的稳定状态，无需担心上层代码在调用过程中执行</span>setter<span style="font-family: 宋体">方法对组件依赖关系产生破坏，特别是对于</span>Singleton<span style="font-family: 宋体">模式的组件而言，这可能对整个系统产生重大的影响。</span></p>
<p>4<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">同样，由于关联关系仅在构造函数中表达，只有组件创建者需要关心组件内部的依赖关系。对调用者而言，组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息，也为系统的层次清晰性提供了保证。</span></p>
<p>5<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">通过构造子注入，意味着我们可以在构造函数中决定依赖关系的注入顺序，对于一个大量依赖外部服务的组件而言，依赖关系的获得顺序可能非常重要，比如某个依赖关系注入的</span></p>
<p><span style="font-family: 宋体">先决条件是组件的</span>DataSource<span style="font-family: 宋体">及相关资源已经被设定。</span></p>
<p>Type3 <span style="font-family: 宋体">设值注入的<span style="border-right: windowtext 1pt solid; padding-right: 0cm; border-top: windowtext 1pt solid; padding-left: 0cm; padding-bottom: 0cm; border-left: windowtext 1pt solid; padding-top: 0cm; border-bottom: windowtext 1pt solid">优势</span></span></p>
<p>1<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">对于习惯了传统</span>JavaBean<span style="font-family: 宋体">开发的程序员而言，通过</span>setter<span style="font-family: 宋体">方法设定依赖关系显得更加直</span></p>
<p><span style="font-family: 宋体">观，更加自然。</span></p>
<p>2<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">如果依赖关系（或继承关系）较为复杂，那么</span>Type2<span style="font-family: 宋体">模式的构造函数也会相当庞大（我们需要在构造函数中设定所有依赖关系），此时</span>Type3<span style="font-family: 宋体">模式往往更为简洁。</span></p>
<p>3<span style="font-family: 宋体">．</span> <span style="font-family: 宋体">对于某些第三方类库而言，可能要求我们的组件必须提供一个默认的构造函数（如</span>Struts</p>
<p><span style="font-family: 宋体">中的</span>Action<span style="font-family: 宋体">），此时</span>Type2<span style="font-family: 宋体">类型的依赖注入机制就体现出其局限性，难以完成我们期望的功</span></p>
<p><span style="font-family: 宋体">能。<br />
<br />
注：本文的很多总结来源于对《spring框架，技术详解及使用指导》（作者：夏昕）的学习。</span></p>
<img src ="http://www.blogjava.net/honeybee/aggbug/156767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/honeybee/" target="_blank">sun</a> 2007-10-29 20:52 <a href="http://www.blogjava.net/honeybee/articles/156767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>