??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av色福利天堂,亚洲丰满熟女一区二区v,日本亚洲中午字幕乱码http://www.tkk7.com/iask/category/2361.html<font color='blue'>菩提本无?wi),明镜亦非?本来无一物,何处惹尘?lt;/font>zh-cnTue, 27 Feb 2007 22:56:55 GMTTue, 27 Feb 2007 22:56:55 GMT60(转帖)使用open source产品l装你的web应用架构(struts+spring+hibernate)http://www.tkk7.com/iask/articles/8609.html城市劣h城市劣hThu, 28 Jul 2005 04:32:00 GMThttp://www.tkk7.com/iask/articles/8609.htmlhttp://www.tkk7.com/iask/comments/8609.htmlhttp://www.tkk7.com/iask/articles/8609.html#Feedback1http://www.tkk7.com/iask/comments/commentRss/8609.htmlhttp://www.tkk7.com/iask/services/trackbacks/8609.html其实Q就用Java建造一个不是很烦琐的web应用Q也不是件轻杄事情?在构架的一开始就有很多事情要考虑?从高处看Q摆在开发者面前有很多问题Q要考虑是怎样建立用户接口Q在哪里处理业务逻辑Q?怎样持久化的数据?而这三层构架中,每一层都有他们要仔细考虑的?各个层该使用什么技术? 怎样的设计能松散耦合q能灉|改变Q?怎样替换某个层而不影响整体构架Q应用程序如何做各种U别的业务处理(比如事务处理Q?



构架一个Web应用需要弄明白好多问题?q运的是Q已l有不少开发者已l遇到过q类问题Qƈ且徏立了处理q类问题的框架?一个好框架具备以下几点Q?减轻开发者处理复杂的问题的负担(“不重复发明轮子”)Q?内部有良好的扩展Q?q且有一个支持它的强大的用户团体?好的构架一般有针对性的处理某一c问题,q且能将它做好(Do One Thing wellQ?然而,你的E序中有几个层可能需要用特定的框架Q已l完成的UI(用户接口) q不代表你也可以把你的业务逻辑和持久逻辑偶合C的UI部分?举个例子Q?你不该在一个Controller(控制?里面写JDBC代码作ؓ(f)你的业务逻辑Q?q不是控制器应该提供的?一个UI 控制器应该委z其它l在UI范围之外的轻量lg?好的框架应该能指g码如何分布?更重要的是,框架能把开发者从~码中解攑և来,使他们能专心于应用程序的逻辑Q这对客h说很重要Q?



q篇文章讨论怎样l合几种著名的框架来使得你的应用E序做到村ּ耦合?

如何建立你的架构Qƈ且怎样让你的各个应用层保持一致。?如何整合框架以便让每个层在以一U松散偶合的方式彼此作用而不用管低层的技术细节?q对我们来说真是一U挑战?q里讨论一个整合框架的{略( 使用3 U受Ƣ迎的开源框? Q表C层我们用StrutsQ?业务层我们用SpringQ而持久层则用Hibernate?你也可以用其他FrameWork替换只要能得到同L(fng)效果?见图1 Q框架组合示意图Q?



应用E序的分?/SPAN>

大部分的Web应用在职责上臛_能被分成4层?q四层是QpresentationQ描qͼQpersistenceQ持久)QbusinessQ业务)和domain modelQ域模块Q。每个层在处理程序上都应该有一Ҏ(gu)的责Q, 而不应该在功能上与其它层混合Qƈ且每个层要与其它层分开的,但要l他们之间放一个通信接口?我们׃介绍各个层开始,讨论一下这些层应该提供什么,不应该提供什么?



表示?The Presentation Layer)

一般来Ԍ一个典型的Web应用的的末端应该是表C层?很多Java发者也理解Struts所提供的?象业务逻辑之类的被打包到org.apache.struts.Action.Q?因此Q我们很赞成使用Strutsq样的框架?



下面是Struts所负责的:(x)

* 理用户的请?做出相应的响应?

* 提供一个Controller ,委派调用业务逻辑和其它上层处理?

* 处理异常Q抛lStruts Action

* 为显C提供一个模?

* UI验证?



以下条款Q不该在Struts昄层的~码中经常出现?它们与显C层无关的?

* 直接的与数据库通信Q例如JDBC调用?

* 与你应用E序相关联的业务逻辑以及校验?

* 事物理?

在表C层引入q些代码Q则?x)带来高偶合和麻烦的l护?





持久?The Persistence Layer)

典型的Web应用的另一个末端是持久层。这里通常是程序最Ҏ(gu)失控的地斏V开发者L低估构徏他们自己的持久框架的挑战性。系l内部的持箋层不但需要大量调试时_(d)而且q经常缺功能之变得难以控Ӟq是持久层的通病?q好有几个ORM开源框架很好的解决了这c问题。尤其是Hibernate?Hibernate为java提供了OR持久化机制和查询服务, 它还l已l熟(zhn)SQL和JDBC API 的Java开发者一个学?fn)桥梁,他们学?fn)h很方ѝ?Hibernate的持久对象是ZPOJO和Java collections。此外,使用Hibernateq不妨碍你正在用的IDE?



L(fng)下面的条目,你在持久层编码中需要了解的?

* 查询对象的相关信息的语句?Hibernate通过一个OO查询语言QHQLQ或者正则表辄API来完成查询?HQL非常cM于SQL-- 只是把SQL里的table和columns用Object和它的fields代替?你需要学?fn)一些新的HQL语言Q?不管怎样Q他们容易理解而文档也做的很好?HQL是一U对象查询的自然语言Q花很小的代价就能学?fn)它?

* 如何存储Q更斎ͼ删除数据库记录?

* 象Hibernateq类的高UORM框架支持大部分主数据库Qƈ且他们支?Parent/child关系Q事物处理,l承和多态?



业务层(The Business LayerQ?/SPAN>

一个典型Web应用的中间部分是业务层或者服务层?从编码的视角来看Q这层是最Ҏ(gu)被忽视的一层?而我们却往往在UI层或持久层周围看到这些业务处理的代码Q这其实是不正确的,因ؓ(f)它导致了E序代码的紧密偶合,q样一来,随着旉推移q些代码很难l护。幸好,针对q一问题有好几种Frameworks存在?最受欢q的两个框架是Spring和PicoContainer?q些Z被称为microcontainersQ他们能让你很好的把对象搭配h?q两个框枉着手于‘依赖注?dependency injection)(q有我们知道的‘控制反转’Inversion of Control=IoC)q样的简单概c?q篇文章关注于Spring的注(译注Q通过一个给定参数的SetterҎ(gu)来构造Bean,有所不同于FactoryQ? Springq提供了Setter Injection(type2)QConstructor Injection(type3){方式供我们选择?Spring把程序中所涉及到包含业务逻辑和Dao的Objects——例如transaction management handlerQ事物管理控Ӟ、Object Factoris(对象工厂)、service objectsQ服务组Ӟ——都通过XML来配|联pv来?



后面我们?x)D个例子来揭示一下Spring 是怎样q用q些概念?

业务层所负责的如下:(x)

* 处理应用E序?业务逻辑和业务校?

* 理事物

* 允许与其它层怺作用的接?

* 理业务层别的对象的依赖?

* 在显C层和持久层之间增加了一个灵zȝ机制Q得他们不直接的联pd一赗?

* 通过揭示 从显C层C务层之间的Context来得到business services?

* 理E序的执行(从业务层到持久层Q?





域模块层QThe Domain Model Layer Q?/SPAN>
既然我们致力于的是一个不是很复杂的Web的应用, 我们需要一个对象集合,让它在不同层之间Ud的?域模块层由实际需求中的业务对象组?比如, OrderLineItem , Product{等?开发者在q层 不用那些DTOsQ仅xdomain object卛_?例如QHibernate允许你将数据库中的信息存攑օ对象Qdomain objectsQ,q样你可以在q接断开的情况下把这些数据显C到UI层?而那些对象也可以q回l持l层Q从而在数据库里更新?而且Q你不必把对象{化成DTOsQ这可能似的它在不同层之间的在传输过E中丢失Q,q个模型使得Java开发者能很自然运用OOQ而不需要附加的~码?

一个简单例?



既然我们已经从全局上理解这些组件?现在p我们开始实践吧?我们q是?StrutsQSpring 和Hibernate。这三个框架已经被描q够多了Q这里就不重复介l了?q篇文章举例指导你如何用这三个框架整合开? q向你揭C?一个请求是如何贯穿于各个层的。(从用L(fng)加入一个Order到数据库Q显C;q而更新、删除)?



从这里可以下载到E序E序原代码(
downloadQ?

既然每个层是互相作用的,我们先来创建domain objects。首先,我们要在q些Object中要定那些是需要持久化的,哪些是提供给business logicQ那些是昄接口的设计?下一步,我们配|我们的持久层ƈ且定义好Hibernate的OR mappings。然后定义好Business Objects。有了这些组成部分之后,我们?使用Spring把这些连接v来?最后,我们提供lSpring一个持久层Q从q个持久层里我们可以知道它是如何与业务逻辑层(business service layerQ通信的,以及它是怎样处理其他层抛出的异常的。?



域对象层QDomain Object LayerQ?/SPAN>


q层是编码的着手点Q我们的~码׃q层开始?例子中Order 与OrderItem 是一个One—To—Many的关pR?下面是Domain Object Layer的两个对象:(x)



· com.meagle.bo.Order.java: 包含了一个Order的概要信?

· com.meagle.bo.OrderLineItem.java: 包含了Order的详l信?

好好考虑怎你的package命名,q反应出了你是怎样分层的?例如 domain objects在程序中可能打包在com.meagle.bo内?更详l一点将打包在com. meagle.bo的子目录下面。business logic应该从com.meagle.serice开始打包,而DAO 对象应该位于com.meagle.service.dao.hibernate。反应Forms和Actions?持久对象Qpresentation classesQ?应该分别攑֜ com.meagle.action和com.meagle.forms包?准确的给包命名得你的classes很好分割q且易于l护Qƈ且在你添加新的classesӞ能得程序结构上保持上下一致?

持久层的配置QPersistence Layer ConfigurationQ?/SPAN>

建立Hibernate的持久层 需要好几个步骤?W一步让我们把BO持久化?既然Hibernate是通过POJO工作的, 因此Order?OrderLineItem对象需要给所有的fileds 加上getter,setterҎ(gu)?Hibernate通过XML文g来映?OR)对象Q以下两个xml文g分别映射了Order 和OrderItem对象。(q里有个叫XDoclet工具可以自动生成你的XML影射文gQ?

- Order.hbm.xml
- OrderLineItem.hbm.xml

你可以在WebContent/WEB-INF/classes/com/meagle/bo目录下找到这些xml文g。Hibernate?[urlhttp://www.hibernate.org/hib_docs/api/net/sf/hibernate/SessionFactory.html]SessionFactory [/url]是用来告诉程?应该与哪个数据库通信Q该使用哪个q接池或使用了DataSourceQ?应该加蝲哪些持久对象。?/FONT>Session接口是用来完成SelectingQSavingQDelete和Updatingq些操作?后面的我们将讲述SessionFactory和Session是怎样讄的?

业务层的配置QBusiness Layer ConfigurationQ?/SPAN>

既然我们已经有了domain objectsQ接下来我们pbusiness service objects了,用他们来执行E序的logic,调用持久层,得到UI层的requests,处理transactionsQƈ且控制exceptions?Z这些连接v来ƈ且易于管理,我们用面向方面的 SpringFramework?Spring 提供?控制倒置Qinversion of control 0==IoC)和注依赖设|(setter dependency injectionQ这些方式(可供选择Q,用XML文g对象连接v来?IoC是一个简单概念(它允怸个对象在上层接受其他对象的创建)Q用IoCq种方式让你的对象从创徏中释放了出来Q降低了偶合度?




q里是一个没有用IoC的对象创建的例子Q它有很高偶合度?




?2.没有使用 IoC. A 创徏?B ?C

而这里是一个用IoC的例子,q种方式允许对象在高层可以创建ƈq入另外一个对象,所以这样可以直接被执行?


?3. 对象使用?IoC?A 包含了接受B,C?setterҎ(gu) , q同栯C 由A创徏B,C的目的?/SPAN>

建立我们的业务服务对象(Building Our Business Service ObjectsQ?


Business Object中的SetterҎ(gu)接受的是接口Q这h们可以很松散的定义对象实玎ͼ然后注入?在我们的案例中,我们用一个business service object接收一个DAO,用它来控制domain objects的持久化?׃在这个例子中使用了HibernateQ我们可以很方便的用其他持久框架实现 同时通知Spring 有新的DAO可以使用了?

在面向接口的~程中,你会(x)明白 “注依赖”模式是怎样松散耦合你的业务逻辑和持久机制的Q)?



下面是一个接口business service objectQDAO代码片段Q?


代码:

public interface IOrderService {

  public abstract Order saveNewOrder(Order order)

    throws OrderException,

           OrderMinimumAmountException;

 

  public abstract List findOrderByUser(

                                     String user)

                           throws OrderException;

 

  public abstract Order findOrderById(int id)

                           throws OrderException;

 

  public abstract void setOrderDAO(

                             IOrderDAO orderDAO);

}

 

注意到这D代码里有一?setOrderDaoQ)Q它?yu)是一个DAO Object讄Ҏ(gu)Q注器Q?但这里ƈ没有一个getOrderDao的方法,q不必要Q因Zq不?x)在外部讉Kq个orderDao。这个DAO Objecte被调用Q和我们的persistence layer 通信。我们将用Spring把DAO Object ?business service object搭配h的。因为我们是面向接口~程的,所以ƈ不需要将实现cȝ密的耦合在一赗?



接下L们开始我们的DAO的实现类q行~码?既然Spring已经有对Hibernate的支持,那这个例子就直接l承
HibernateDaoSupportcMQ这个类很有用,我们可以参?/FONT>HibernateTemplateQ它主要是针对HibernateDaoSupport的一个用法,译注Q具体可以查?/FONT>Srping 的APIQ?下面是这个DAO接口代码Q?

代码:
public interface IOrderDAO {
  public abstract Order findOrderById(
                                    final int id);
 
  public abstract List findOrdersPlaceByUser(
                           final String placedBy);
  public abstract Order saveOrder(
                               final Order order);
}


我们仍然要给我们持久层组装很多关联的对象Q这里包含了HibernateSessionFactory 和TransactionManager?Spring 提供了一?HibernateTransactionManagerQ他用线E捆l了一个Hibernate SessionQ用它来支持transactions(h?/FONT>ThreadLocal) ?

下面是HibernateSessionFactory ?HibernateTransactionManager:的配|:(x)

代码:
<bean id="mySessionFactory"
       class="org.springframework.orm.hibernate.
              LocalSessionFactoryBean">
  <property name="mappingResources">
    <list>
      <value>
        com/meagle/bo/Order.hbm.xml
      </value>
      <value>
        com/meagle/bo/OrderLineItem.hbm.xml
      </value>
    </list>
  </property>
  <property name="hibernateProperties">
    <props>
      <prop key="hibernate.dialect">
        net.sf.hibernate.dialect.MySQLDialect
      </prop>
      <prop key="hibernate.show_sql">
        false
      </prop>
      <prop key="hibernate.proxool.xml">
        C:/MyWebApps/.../WEB-INF/proxool.xml
      </prop>
      <prop key="hibernate.proxool.pool_alias">
          spring
      </prop>
    </props>
  </property>
</bean>
 
<!-- Transaction manager for a single Hibernate
SessionFactory (alternative to JTA) -->
<bean id="myTransactionManager"
         class="org.
                springframework.
                orm.
                hibernate.
                HibernateTransactionManager">
  <property name="sessionFactory">
    <ref local="mySessionFactory"/>
  </property>
  </bean>



可以看出Q每个对象都可以在Spring 配置信息中用<bean>标签引用。在q里QmySessionFactory引用了HibernateSessionFactoryQ而myTransactionManager引用了HibernateTransactionManage?注意代码中myTransactionManger Bean有个sessionFactory属性?HibernateTransactionManager有个sessionFactory setter ?getterҎ(gu)Q这是用来在Spring启动的时候实现“依赖注入?Qdependency injectionQ的?在sessionFactory 属性里 引用mySessionFactory。这两个对象在Spring容器初始化后pl装了v来了?q样的搭配让你从 单例Qsingleton objectsQ和工厂QfactoriesQ中解放了出来,降低了代码的l护代h(hun)?mySessionFactory.的两个属性,分别是用来注入mappingResources ?hibernatePropertes的。通常Q如果你在Spring之外使用Hibernate,q样的设|应该放在hibernate.cfg.xml中的?不管怎样,Spring提供了一个便L(fng)方式-----在Spring内部配置中ƈ入了Hibernate的配|?如果要得到更多的信息Q可以查阅Spring API?





既然我们已经l装配置好了Service BeansQ就需要把Business Service Object?DAO也组装v来,q把q些对象配到一个事务管理器Qtransaction managerQ里?



在Spring中的配置信息Q?
代码:

<!-- ORDER SERVICE -->
<bean id="orderService"
  class="org.
         springframework.
         transaction.
         interceptor.
         TransactionProxyFactoryBean">
  <property name="transactionManager">
    <ref local="myTransactionManager"/>
  </property>
  <property name="target">
    <ref local="orderTarget"/>
  </property>
  <property name="transactionAttributes">
    <props>
      <prop key="find*">
     PROPAGATION_REQUIRED,readOnly,-OrderException
      </prop>
      <prop key="save*">
     PROPAGATION_REQUIRED,-OrderException
      </prop>
    </props>
  </property>
</bean>
 
<!-- ORDER TARGET PRIMARY BUSINESS OBJECT:
Hibernate implementation -->
<bean id="orderTarget"
         class="com.
                meagle.
                service.
                spring.
                OrderServiceSpringImpl">
  <property name="orderDAO">
    <ref local="orderDAO"/>
  </property>
</bean>
 
<!-- ORDER DAO OBJECT -->
<bean id="orderDAO"
         class="com.
                meagle.
                service.
                dao.
                hibernate.
                OrderHibernateDAO">
  <property name="sessionFactory">
    <ref local="mySessionFactory"/>
  </property>
</bean>




? 是我们对象搭建的一个提UӀ?从中可以看出Q每个对象都联系着SpringQƈ且能通过Spring注入到其他对象。把它与Spring的配|文件比较,观察他们之间的关p?



?4. Spring是q样Z配置文gQ将各个Bean搭徏在一赗?/SPAN>

q个例子使用一个TransactionProxyFactoryBeanQ它定义了一个setTransactionManager()?q对象很有用Q他能很方便的处理你x的事物还有Service Object?你可以通过transactionAttributes属性来定义怎样处理?想知道更多还是参考TransactionAttributeEditor吧?

TransactionProxyFactoryBean q有个setter. q会(x)被我?Business service objectQorderTargetQ引用, orderTarget定义?业务服务层,q且它还有个属性,由setOrderDAO()引用。这个属?



Spring 和Bean 的还有一点要注意的:(x) bean可以以用两种方式创造?q些都在单例模式QSingtonQ和原型模式QpropotypeQ中定义了?默认的方式是singleton,q意味着׃n的实例将被束~?而原形模式是在Spring用到bean的时候允许新建实例的。当每个用户需要得C们自己Bean的CopyӞ你应该仅使用prototype模式。(更多的请参考设计模式中的单例模式和原Ş模式Q?

提供一个服务定位器QProviding a Service LocatorQ?/SPAN>
既然我们已经我们的Serices和DAO搭配h了。我们需要把我们的Service昄到其他层?q个通常是在Struts或者Swingq层里编码。一个简单方法就是用 服务定位器返回给Spring context 。当Ӟ可以通过直接调用Spring中的Bean来做?

下面是一个Struts Actin 中的服务定位器的一个例子?
代码:

public abstract class BaseAction extends Action {
 
  private IOrderService orderService;
 
  public void setServlet(ActionServlet
                                 actionServlet) {
    super.setServlet(actionServlet);
    ServletContext servletContext =
               actionServlet.getServletContext();
 
    WebApplicationContext wac =
      WebApplicationContextUtils.
         getRequiredWebApplicationContext(
                                 servletContext);
 
      this.orderService = (IOrderService)
                     wac.getBean("orderService");
  }
 
  protected IOrderService getOrderService() {
    return orderService;
  }
}
 

UI 层配|?QUI Layer ConfigurationQ?/SPAN>

q个例子里UI?使用了Struts framework. q里我们要讲qC下在l程序分层的时候, 哪些是和Struts部分的。我们就从一个Struts-config.xml文g中的Action的配|信息开始吧?
代码:

struts-config.xml file.

<action path="/SaveNewOrder"
    type="com.meagle.action.SaveOrderAction"
    name="OrderForm"
    scope="request"
    validate="true"
    input="/NewOrder.jsp">
  <display-name>Save New Order</display-name>
  <exception key="error.order.save"
    path="/NewOrder.jsp"
    scope="request"
    type="com.meagle.exception.OrderException"/>
  <exception key="error.order.not.enough.money"
    path="/NewOrder.jsp"
    scope="request"
    type="com.
          meagle.
          exception.
          OrderMinimumAmountException"/>
  <forward name="success" path="/ViewOrder.jsp"/>
  <forward name="failure" path="/NewOrder.jsp"/>
</action>

SaveNewOrder q个Action是用来持久化UI层里的表单提交过来Order的。这是Struts中一个很典型的Action; 注意观察q个Action中exception配置Q这些Exceptions也在Spring 配置文g(applicationContext-hibernate.xml)中配|了Q就?business service object 的transactionAttributes属性里Q?当异常在业务层被被抛出时Q我们可以控制他们,q当的显C给UI层?

W一个异常,OrderException,在持久层保存order对象p|的时候被触发。这导致事物回滚ƈ且通过BO把异常回传到Strutsq一层?

W二个异常,OrderMinimumAmountException也同W一个一栗?





搭配整和的最后一?通过是让你显C层和业务层相结合。这个已l被服务定位器(service locatorQ实CQ前面讨了)Q?q里服务层作Z个接口提供给我们的业务逻辑和持久层?



SaveNewOrder Action 在Struts中用一个服务定位器Qservice locatorQ来调用执行业务Ҏ(gu)的?Ҏ(gu)代码如下Q?



代码:
public ActionForward execute(

  ActionMapping mapping,

  ActionForm form,

  javax.servlet.http.HttpServletRequest request,

  javax.servlet.http.HttpServletResponse response)

  throws java.lang.Exception {

 

  OrderForm oForm = (OrderForm) form;

 

  // Use the form to build an Order object that

  // can be saved in the persistence layer.

  // See the full source code in the sample app.

 

  // Obtain the wired business service object

  // from the service locator configuration

  // in BaseAction.

  // Delegate the save to the service layer and

  // further upstream to save the Order object.

  getOrderService().saveNewOrder(order);

 

  oForm.setOrder(order);

 

  ActionMessages messages = new ActionMessages();

  messages.add(

      ActionMessages.GLOBAL_MESSAGE,

            new ActionMessage(

      "message.order.saved.successfully"));

 

  saveMessages(request, messages);

 

  return mapping.findForward("success");

}


ȝ

q篇文章在技术和构架斚w掩盖了很多低层的基础信息Q?文章的主要的意图在于让你意识到如何给你应用程序分层?分层可以“解耦”你的代码——允许新的组件被dq来Q而且让你的代码易于维护?q里用到的技术只是专注于把“解偶”做好?不管怎样Q用这L(fng)构架可以让你用其他技术代替现在的层?例如Q你可能不用Hibernate实现持久化。既然你在DAO中面向接口的~程的,所以你完全可以用iBATIS来代ѝ或者,你也可能想用Struts外的其他的技术或者框架替换现在的UI层(转换久层Q实现层q不应该直接影响C的业务逻辑和业务服务层Q?用适当的框架搭Z的Web应用Q其实也不是一件烦琐的工作Q更主要的是它“解耦”了你程序中的各个层?





后记Q?

看完q篇文章后,只是觉得很喜Ƣ,于是q译了Q当然同时也准备着挨大家扔来的鸡蛋Q)?

q篇文章里ƈ没有太多的技术细节,和详l的步骤。如果你从未使用q这些框架而在q行实例E序遇上困难的话Q可以到CSDN论坛Java Open Source版发_(d)我一定会(x)详细解答的(啊哦Q这不算做广告吧Q)Q?

文章是从一个构架的角度讲述了如何搭配现有的开源框架进行分层, 有太多的术语我都不知道怎么表达Q而且可能有很多语句存在错误。如果媄响了你的阅读Q请你直接点原文地址Q我同时也象你说声抱歉?



作者简介:(x)Mark Eagle 高软g工程师,亚特兰大?
?译:(x)Totodo,软g工程?





参考:(x)

StrutsQhttp://jakarta.apache.org/struts/index.html

Spring:
http://www.springframework.org

Hibernate:
http://www.hibernate.org

http://www.hibernate.org.cn

关于控制反{IOC和依赖注:(x)http://www.martinfowler.com/articles/injection.html

原文:

http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=1
http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=2
http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=3
http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=4


此文Q?A >http://spring.jactiongroup.net/viewtopic.php?t=389


城市劣h 2005-07-28 12:32 发表评论
]]>
վ֩ģ壺 ŮƵ| aëƬѲ| ѿĿһ| Ļ޾ƷԴ| þþþóƬѹۿѿ| þþþAV| AVƬ߹ۿ| þþƷav| 黨ýmvѹۿ| ޹ƷۺϾþ2007| 91ѾƷԲ߲| һ23456| վѹۿ| ƷƵ| ߻ɫַ| aëƬëƬѹۿ| AVþþƷ| ww߹Ƶѹۿ| ۺ϶| Ů߲| 97߹ۿƵ| ޹AV| ޾ƷҳĻ| ޾Ʒav| èԴ߹ۿ | ҹþþþþ| ³ѲƵ㽶| þþƷž޾Ʒ| ҹѸþӰԺ| ޻ɫַ߹ۿ| ŷÿѵӰ߹ۿ| ɫƨƨ߹ۿƵ| Ʒۺߵһ| Ƶѹۿ| պĻ| þþƷƵ| ִˬֻƵƵ | AƬѹۿ| ƷƬҹɫ| һػƬ| ˸ӰԺѿ|