论坛首页 Java企业应用论坛

Spring介绍:Bean的配置管理体系

浏览 10107 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-04-17  
Spring最大的亮点就在于他的Bean的配置管理体系,
将所有Depency变成外在配置了。
我们知道,好的面向对象系统是面向接口编程,而非面向实现编程,
这样可以透明替换不通实现。然而再要取得一个具体的类实现的
时候,必然需要通过某种机制,一般是通过工厂。
比如Vat计算对于不同国家有不同的Stragety,计算总钱的客户端
有一个Vat 的引用,
Interface VatStragety
VatStragety vatStragety;
public BigDecimal calAmt() {
  BigDecimal vat= vatStragety.calVat();
  //add with other fee and return;
}
然而在使用Vat的时候,必然先要获得一个实际的Vat实现,
传统的做法:
  vatStragety = VatFactory.getVatStragety(); 然后使用。
而工厂类通过外部配置返回合适的实现:
public VatStragety getVatStragety() {
  String vatConf = getVatConf();//从配置文件读取
  if("canada".equals(vatConf)) {
    return new CanadaVatStragety();
  } else  if("usa".equals(vatConf)) {
    return new UsaVatStragety();
  }
}
(注:当然也可以直接把类名配在配置文件里,
利用反射实例化)
-------------------------------------------------------

好的面向对象系统是面向接口编程,可是也带来了一个问题,
工厂类的膨胀,我们看到,每次需要这样透明Interface的不同实现
时候,我们都需要一个工厂类,而且要自己写如何读取配置文件这样Plumbing的代码。
----------------------------------------------------
让我们来看看Spring是如何作的:
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml";
        vat= (Vat) ctx.getBean("vat";
然后在applicationContext.xml里头指明有这样一个Bean
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<bean id="vat" class="CanadaVatStragety" />
  </xml>
---------------------------------------------------
Spring支持对属性的配置,换
比如你写一个缓存的实现,evict的策略包括timeout的时间,队列的大小,
你肯定不会把这些属性写死在java文件里头,而是通过外部文件来配置。

比如CachePolicy 有2个属性timeout,queueLenth(注意要想让Spring帮你
配置好Bean体系,你的属性必须满足JavaBean的get/set规放)
class CachePolicy {
  private long timeout;
    private long queueLenth;

    public long getTimeout() {
        return timeout;
    }

    public void setTimeout(long timeout) {
        this.timeout = timeout;
    }

    public long getQueueLenth() {
        return queueLenth;
    }

    public void setQueueLenth(long queueLenth) {
        this.queueLenth = queueLenth;
    }
}
配置文件
<bean id="cachePolicy" class="test.CachePolicy">
<property name="timeout"><value>3600</value></property>
<property name="queueLenth"><value>10</value></property>
        </bean>

配好之后,
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        cachePolicy= (CachePolicy) ctx.getBean("cachePolicy"
就可以取得合适的CachePolicy.
这是简单属性的配置,以下是复杂属性的配置
对于一个应用系统,必然存在大量相互关联的类,
共同组成一个Bean体系,
比如BO引用一个BODao(可能有OracleDao,DB2Dao的不同实现),
BODao再引用DataSource,可能是简单的JdbcDataSource或者Apache dhcp作了
ConnectionPool的DataSource.
让我们看看如何实现:
class BO {
  BODAO bodao;
   //get,set方法略掉,以下同
}
class OracleDao implements BODAO ;
class DB2Dao implements BODAO ;

配置文件:
<bean id="bo" class="BO">
<property name="bodao"><ref local="bodao"/></property> <!--通过ref local引用其他bean-->
</bean>
<bean id="bodao" class="OracleDao" />
这样从Spring的ApplicationContext拿出来的bo就有合适的bodao可用了。
想想看,如果自己写工厂类的话,要多少plumbing的代码。
--------------------------------------------------------------
一个tip, bean有autowire属性,可以byName或者byType组装,
比如
<bean id="bo" class="BO"  autowire="byName" />
<bean id="bodao" class="OracleDao" />
就会根据名字,bo里头有个属性是bodao,组装的时候就会找到一个ApplicationContext下的
id为bodao的bean组装。byType是根据类型组装
-----------------------------------------------------
这样整个Bean体系就好了。
还有的Spring Aop支持,也是配在这个xml里头,可以动态的
给一个Bean加上Transaction,或其他Interceptor等特性。
还有部署在Web里头的WebApplicationContext类式于这里的
ClassPathXmlApplicationContext,只不过是部署到Web Application,
使得整个Bean体系对于Web Application可用。
这样Bean体系可以在外部测试,然后部署到Web Application里头,非常方便。
------------------------------------------------
Spring自己的文档非常的好,例子也很全,
建议结合他的Petclinic例子看他的Aop和对Hibernate的整合。
他对Hibernate的整合真的是非常帮,很多时候只需要写一句话就可以了。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics