浏览 10108 次
锁定老帖子 主题:Spring介绍:Bean的配置管理体系
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-04-17
将所有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的整合真的是非常帮,很多时候只需要写一句话就可以了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |