??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品av久久久久久麻豆网,亚洲一区二区三区精品中文字幕,久久综合久久久http://www.aygfsteel.com/honeybee/category/26932.htmlzh-cnTue, 27 Nov 2007 22:09:21 GMTTue, 27 Nov 2007 22:09:21 GMT60Struts配置q接池错误解决问题及实例http://www.aygfsteel.com/honeybee/articles/163351.htmlsunsunMon, 26 Nov 2007 15:37:00 GMThttp://www.aygfsteel.com/honeybee/articles/163351.htmlhttp://www.aygfsteel.com/honeybee/comments/163351.htmlhttp://www.aygfsteel.com/honeybee/articles/163351.html#Feedback0http://www.aygfsteel.com/honeybee/comments/commentRss/163351.htmlhttp://www.aygfsteel.com/honeybee/services/trackbacks/163351.html我用的是tomcat5.5Q配|了日志之后打印Z列信息:
       ERROR main org.springframework.web.context.ContextLoader - Context initialization failed
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
Caused by:
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
    at java.lang.Class.getConstructor0(Class.java:2640)
    at java.lang.Class.getDeclaredConstructor(Class.java:1953)
    ……


    从日志信息看问题已经很明显了Q是applicationContext.xml的dataSource问题?br /> 解决ҎQ?br /> 1  ?lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    改ؓ<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">之后问题得到解决。(org.springframework.jdbc.datasource.DriverManagerDataSource 不可以用连接池。)
2 org.apache.commons.dbcp.BasicDataSource作ؓ注入的DataSource源,Z使用 DBCP的功能,必须要将commons-dbcp.jar加入CLASSPATH中,另外q需要commons-pool.jar和commons- collections.jarQ这些都可以在Spring的lib目录下找到?br /> org.springframework.jdbc.datasource.DriverManagerDataSourceq没有提供连接池的功能,只能作作单的单机q接试。用org.apache.commons.dbcp.BasicDataSource时缺commons-pool.jar所以会出现如题的问题?nbsp;
    从日志信息看问题已经很明显了Q是applicationContext.xml的dataSource问题?br /> 解决ҎQ?br /> 1  ?lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    改ؓ<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">之后问题得到解决。(org.springframework.jdbc.datasource.DriverManagerDataSource 不可以用连接池。)
2 org.apache.commons.dbcp.BasicDataSource作ؓ注入的DataSource源,Z使用 DBCP的功能,必须要将commons-dbcp.jar加入CLASSPATH中,另外q需要commons-pool.jar和commons- collections.jarQ这些都可以在Spring的lib目录下找到?br /> org.springframework.jdbc.datasource.DriverManagerDataSourceq没有提供连接池的功能,只能作作单的单机q接试。用org.apache.commons.dbcp.BasicDataSource时缺commons-pool.jar所以会出现如题的问题?


sun 2007-11-26 23:37 发表评论
]]>
Spring事务理http://www.aygfsteel.com/honeybee/articles/157834.htmlsunsunFri, 02 Nov 2007 13:13:00 GMThttp://www.aygfsteel.com/honeybee/articles/157834.htmlhttp://www.aygfsteel.com/honeybee/comments/157834.htmlhttp://www.aygfsteel.com/honeybee/articles/157834.html#Feedback0http://www.aygfsteel.com/honeybee/comments/commentRss/157834.htmlhttp://www.aygfsteel.com/honeybee/services/trackbacks/157834.htmlSpring 事务理

Spring提供的事务管理可以分Zc:~程式的和声明式的。编E式的,比较灉|Q但是代码量大,存在重复的代码比较多;声明式的比编E式的更灉|方便?/span>

      Spring提供的编E式的事务处?/span>

  Spring提供了几个关于事务处理的c:

  TransactionDefinition //事务属性定?/span>

TranscationStatus //代表了当前的事务Q可以提交,回滚?/span>

TransactionTemplate//Spring提供的事务模?/span>

  PlatformTransactionManagerq个?/span>spring提供的用于管理事务的基础接口Q其下有一个实现的抽象c?/span>AbstractPlatformTransactionManagerQ我们用的事务理cM?/span>DataSourceTransactionManager{都是这个类的子cR?/span>

我们使用~程式的事务理程可能如下Q?/span>

(1) 声明数据源?/span>

(2) 声明一个事务管理类Q例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager{?/span>

  (3) 在我们的代码中加入事务处理代码:

  TransactionDefinition td = new TransactionDefinition();

  TransactionStatus ts = transactionManager.getTransaction(td);

  try{

  //do sth transactionManager.commit(ts);

  }catch(Exception e){transactionManager.rollback(ts);

  }

  使用Spring提供的事务模?/span>TransactionTemplateQ?/span>

  void add(){

  transactionTemplate.execute( new TransactionCallback(){

  public Object doInTransaction(TransactionStatus ts){

  //do sth}

  }}

TransactionTemplate也是为我们省M部分事务提交、回滚代?/span>;定义事务模板Ӟ需注入事务理对象?/span>

      Spring提供的声明式事务处理

  Spring声明式事务处理也主要使用?/span>IoCQ?/span>AOP思想Q提供了TransactionInterceptor拦截器和常用的代理类TransactionProxyFactoryBeanQ可以直接对lgq行事务代理?/span>

  使用TransactionInterceptor的步骤:
  Q?/span>1Q定义数据源Q事务管理类
  Q?/span>2Q定义事务拦截器,例如Q?/span>

Qbean id = "transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"Q?br /> Qproperty name="transactionManager"Q<ref bean="transactionManager"/Q</propertyQ?br /> Qproperty name="transactionAttributeSource"Q?br /> QvalueQ?br /> com.test.UserManager.*r=PROPAGATION_REQUIRED
Q?valueQ?br /> Q?propertyQ?br /> Q?beanQ?/span>

  Q?/span>3Qؓlg声明一个代理类Q?/span>ProxyFactoryBean

Qbean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean"Q?br /> Qproperty name="proxyInterfaces"Q<valueQcom.test.UserManagerQ?valueQ</propertyQ?br /> Qproperty name="interceptorNames"Q?br /> QlistQ?br /> Qidref local="transactionInterceptor"/Q?br /> Q?listQ?br /> Q?propertyQ?br /> Q?beanQ?/span>

  使用TransactionProxyFactoryBeanQ?/span>

Qbean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"Q?br /> Qproperty name="transactionManager"Q<ref bean="transactionManager"/Q</propertyQ?br /> Qproperty name="target"Q<ref local="userManagerTarget"/Q</propertyQ?br /> Qproperty name="transactionAttributes"Q?br /> QpropsQ?br /> Qprop key="insert*"QPROPAGATION_REQUIREDQ?propQ?br /> Qprop key="update*"QPROPAGATION_REQUIREDQ?propQ?br /> Qprop key="*"QPROPAGATION_REQUIRED,readOnlyQ?propQ?br /> Q?propsQ?br /> Q?propertyQ?br /> Q?beanQ?/span>

  TransactionProxyFactoryBean只是为组件的事务代理Q如果我们要l组件添加一些业务方面的验证{,可以使用TransactionTemplate加拦截器方式Qؓlgd多个拦截器,spring AOP中提供了三类Advice,卛_增强Q后增强Q抛出异常时的增强,可以灉|使用?/span>



sun 2007-11-02 21:13 发表评论
]]>
Spring Bean 装机制——Spring学习W记Q?Q?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/honeybee/articles/157326.html</guid><wfw:comment>http://www.aygfsteel.com/honeybee/comments/157326.html</wfw:comment><comments>http://www.aygfsteel.com/honeybee/articles/157326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/honeybee/comments/commentRss/157326.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/honeybee/services/trackbacks/157326.html</trackback:ping><description><![CDATA[<p> </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: 宋体">机制Q通过动态调用的方式避免编码方式的U束Qƈ在此基础上徏立了其核心组?/span>BeanFactory<span style="font-family: 宋体">Q以此作为其依赖注入机制的实现基?/span></p> <p style="text-indent: 21pt">org.springframework.beans<span style="font-family: 宋体">包中包括了这些核心组件的实现c,核心中的核心?/span><span style="color: red">BeanWrapper</span><span style="font-family: 宋体">?/span><span style="color: red">BeanFactory</span><span style="font-family: 宋体">cR(<span style="color: red">对其源码q行研读</span>Q必有所P?/span>BeanFactory<span style="font-family: 宋体">家族如图</span>1<span style="font-family: 宋体">所C?/span></p> <p style="text-align: center" align="center"><span style="font-family: 宋体">?/span>1 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: 宋体">讲的通俗点,是在运行期Q由</span>Spring<span style="font-family: 宋体">Ҏ配置文gQ将其他对象的引用通过lg的提供的</span>setter<span style="font-family: 宋体">Ҏq行讑֮?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">通过</span>BeanWrapper<span style="font-family: 宋体">Q我们可以无需在编码时指?/span>JavaBean<span style="font-family: 宋体">的实现类和属性|通过在配|文件加以设定,可以在q行期动态创建对象ƈ讑֮其属性(依赖关系Q?/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: 宋体">Q顾名思义Q负责创建ƈl护</span>Bean<span style="font-family: 宋体">实例?/span></p> <p style="text-indent: 21pt">Bean Factory<span style="font-family: 宋体">负责Ҏ配置文g创徏</span>Bean<span style="font-family: 宋体">实例Q可以配|的目有:</span></p> <p style="text-indent: 21pt">1<span style="font-family: 宋体">Q?/span> Bean<span style="font-family: 宋体">属性值及依赖关系Q对其他</span>Bean<span style="font-family: 宋体">的引用)</span></p> <p style="text-indent: 21pt">2<span style="font-family: 宋体">Q?/span> Bean<span style="font-family: 宋体">创徏模式Q是?/span>Singleton<span style="font-family: 宋体">模式Q即是否只针Ҏ定类l持全局唯一的实例)</span></p> <p style="text-indent: 21pt">3<span style="font-family: 宋体">Q?/span> Bean<span style="font-family: 宋体">初始化和销毁方?/span></p> <p style="text-indent: 21pt">4<span style="font-family: 宋体">Q?/span> Bean<span style="font-family: 宋体">的依赖关p?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">联合上面关于</span>BeanWrapper<span style="font-family: 宋体">的内容,我们可以看到Q?/span>BeanWrapper<span style="font-family: 宋体">实现了针对单?/span>Bean<span style="font-family: 宋体">的属性设定操作。?/span>BeanFactory<span style="font-family: 宋体">则是针对多个</span>Bean<span style="font-family: 宋体">的管理容器,Ҏl定的配|文Ӟ</span>BeanFactory<span style="font-family: 宋体">从中dcd、属性名</span>/<span style="font-family: 宋体">|然后通过</span>Reflection<span style="font-family: 宋体">机制q行</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: 宋体">的所有功能,q提供了更多的特性。此?/span>ApplicationContext<span style="font-family: 宋体">Z现有应用框架相整合,提供了更为开攑ּ的实玎ͼ如对?/span>Web<span style="font-family: 宋体">应用Q我们可以在</span>web.xml<span style="font-family: 宋体">中对</span>ApplicationContext<span style="font-family: 宋体">q行配置Q?/span></p> <p><span style="font-family: 宋体">相对</span>BeanFactory<span style="font-family: 宋体">而言Q?/span>ApplicationContext<span style="font-family: 宋体">提供了以下扩展功能:</span></p> <p>1<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">国际化支持(</span>MessageSource<span style="font-family: 宋体">Q?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">我们可以?/span>Beans.xml<span style="font-family: 宋体">文g中,对程序中的语a信息Q如提示信息Q进行定义,程序中的提CZ息抽取到配置文g中加以定义,为我们进行应用的各语a版本转换提供了极大的灉|性?/span></p> <p>2<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">资源讉KQ?/span>ResourceLoader<span style="font-family: 宋体">Q?/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: 宋体">Q?/span> <span style="font-family: 宋体">事g传播Q?/span>ApplicationEventPublisher<span style="font-family: 宋体">Q?/span></p> <p style="text-indent: 21pt"><span style="font-family: 宋体">事g传播Ҏؓpȝ中状态改变时的检提供了良好支持?/span></p> <p>4<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">多实例加载可以在同一个应用中加蝲多个</span>Context<span style="font-family: 宋体">实例。(</span>ListableBeanFactory<span style="font-family: 宋体">Q?/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: 宋体">应用Q?/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'"><</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'">></span></p> <p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">    </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</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'">></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'"></</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'">></span></p> <p><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</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'">></span></p> <p><span style="font-size: 10pt; color: black; font-family: 宋体">或:</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span></p> <p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</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'">></span></p> <p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">  </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</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'">></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'"></</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'">></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">     </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</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'">></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'"></</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'">></span></p> <p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">  </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><</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'">></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'"></</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'">></span></p> <p style="text-indent: 10.5pt"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"></</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'">></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"> <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"> <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.aygfsteel.com/honeybee/aggbug/157326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/honeybee/" target="_blank">sun</a> 2007-10-31 22:01 <a href="http://www.aygfsteel.com/honeybee/articles/157326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>控制反{QIOCQ与依赖注入QDIQ——spring学习W记Q?Q?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/honeybee/articles/156767.html</guid><wfw:comment>http://www.aygfsteel.com/honeybee/comments/156767.html</wfw:comment><comments>http://www.aygfsteel.com/honeybee/articles/156767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/honeybee/comments/commentRss/156767.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/honeybee/services/trackbacks/156767.html</trackback:ping><description><![CDATA[  <h3>IoC<span style="font-family: 宋体">Q?/span></h3> <p><span style="font-family: 宋体">用白话来Ԍ是由容器控制程序之间的关系Q而非传统实现中,q序代码直接操控。这也就是所?#8220;控制反{”的概忉|在:控制权由应用代码中{C外部容器Q控制权的{U,是所谓反转?/span></p> <h3>DI<span style="font-family: 宋体">Q?/span></h3> <h4><span style="font-size: 12pt; line-height: 156%; font-family: 宋体">依赖注入的几U实现类?</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: 宋体">接口注入模式因ؓ具备侵入性,它要求组件必M特定的接口相兌Q因此ƈ不被看好Q实际用有限?/span></p> <p style="text-indent: 21pt">Type2<span style="font-family: 宋体">?/span>Type3<span style="font-family: 宋体">的依赖注入实现模式均具备无R入性的特点。在W者看来,q两U实现方式各有特点,也各具优势(一句经典废?/span>J<span style="font-family: 宋体">Q?/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>Q?/span></p> <p>1<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">“在构造期卛_Z个完整、合法的对象”Q对于这?/span>Java<span style="font-family: 宋体">设计原则Q?/span>Type2<span style="font-family: 宋体">无疑是最好的</span></p> <p><span style="font-family: 宋体">响应者?/span></p> <p>2<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">避免了繁琐的</span>setter<span style="font-family: 宋体">Ҏ的编写,所有依赖关pd在构造函C讑֮Q依赖关p集中呈玎ͼ</span></p> <p><span style="font-family: 宋体">更加易读?/span></p> <p>3<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">׃没有</span>setter<span style="font-family: 宋体">ҎQ依赖关pd构造时由容器一ơ性设定,因此lg在被创徏之后卛_于相?#8220;不变”的稳定状态,无需担心上层代码在调用过E中执行</span>setter<span style="font-family: 宋体">Ҏ对组件依赖关pM生破坏,特别是对?/span>Singleton<span style="font-family: 宋体">模式的组件而言Q这可能Ҏ个系l生重大的影响?/span></p> <p>4<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">同样Q由于关联关pM在构造函C表达Q只有组件创需要关心组件内部的依赖关系。对调用者而言Q组件中的依赖关pd于黑盒之中。对上层屏蔽不必要的信息Q也为系l的层次清晰性提供了保证?/span></p> <p>5<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">通过构造子注入Q意味着我们可以在构造函C军_依赖关系的注入顺序,对于一个大量依赖外部服务的lg而言Q依赖关pȝ获得序可能非常重要Q比如某个依赖关pL入的</span></p> <p><span style="font-family: 宋体">先决条g是组件的</span>DataSource<span style="font-family: 宋体">及相兌源已l被讑֮?/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: 宋体">Q?/span> <span style="font-family: 宋体">对于习惯了传l?/span>JavaBean<span style="font-family: 宋体">开发的E序员而言Q通过</span>setter<span style="font-family: 宋体">Ҏ讑֮依赖关系昑־更加?/span></p> <p><span style="font-family: 宋体">观,更加自然?/span></p> <p>2<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">如果依赖关系Q或l承关系Q较为复杂,那么</span>Type2<span style="font-family: 宋体">模式的构造函C会相当庞大(我们需要在构造函C讑֮所有依赖关p)Q此?/span>Type3<span style="font-family: 宋体">模式往往更ؓz?/span></p> <p>3<span style="font-family: 宋体">Q?/span> <span style="font-family: 宋体">对于某些W三方类库而言Q可能要求我们的lg必须提供一个默认的构造函敎ͼ?/span>Struts</p> <p><span style="font-family: 宋体">中的</span>Action<span style="font-family: 宋体">Q,此时</span>Type2<span style="font-family: 宋体">cd的依赖注入机制就体现出其局限性,难以完成我们期望的功</span></p> <p><span style="font-family: 宋体">能?br /> <br /> 注:本文的很多ȝ来源于对《spring框架Q技术详解及使用指导》(作者:夏昕Q的学习?/span></p> <img src ="http://www.aygfsteel.com/honeybee/aggbug/156767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/honeybee/" target="_blank">sun</a> 2007-10-29 20:52 <a href="http://www.aygfsteel.com/honeybee/articles/156767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽԶ</a>| <a href="http://" target="_blank">²</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϸ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϲ</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">֣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">׳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ⶫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">׶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ͬ</a>| <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank">г</a>| <a href="http://" target="_blank">ʼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ĭ</a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">뽭</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>