简化Spring--配置文件1

 

关键词: Spring    配置                                          

 

                              

 

    人人都爱SpringHibernate
    
Spring MVC+hibernateSampleAppfuse的代码却算不得最简洁优美好读,如果在自己的项目中继续发挥我们最擅长的依样画葫芦大法,美好愿望未必会实现。
    
所以,Pramatic精神不灭。这个系列就是探寻最适合自己的Spring+Hibernate模式。
                                  I-
配置文件简化

 

     我厌倦一切配置文件繁重的框架。
    
最好的情况是,框架提供极端灵活复杂的配置方式,但只在你需要的时候
      Spring
提供了三种可能来简化XML。随着国内用户水平的提高,这些基本的简化技巧大家都已掌握。
     
大家可以直接看第3,第4--Spring 1.2, Spring 2.0的后继改进。

 

1.1.autowire="byName" /"byType"

 

     假设Controller有一个属性名为customerDAOSpring就会在配置文件里查找有没有名字为CustomerDAObean, 自动为Controller注入。
     
如果bean有两个属性,一个想默认注入,一个想自定义,只要设定了autowire,然后显式的声明那个想自定义的,就可以达到要求。这就应了需求,在需要特别配置的时候就提供配置,否则给我一个默认注入。
    
还有一个更懒的地方,在最最根部的 节点写一句default-autovwrie="byName",可以让文件里的所有bean 都默认autowrie
   
不过Rod认为开发期可以这样,但Production Server上不应该使用Autowire。而我觉得那些自定义一次的地方比如TranscationManager应该详细定义,而Dao,Controller这种大量重复定义的bean就可以偷点懒了。

 

1.2. 节点之间抽象公共定义和 Inner Bean

 

    这太方便懒人了,想不到两个独立的XML节点都可以玩继承和派生,子节点拥有父节点的全部属性。
   
最好用的地方就是那个Transtion Proxy的定义。先定义一个又长又冗的父类,然后用子类去继承它。
      
另外,还有一个Inner Bean的机制,可以把DAO写成Proxy的内部类。为什么要写成内部类?为了让Proxy冒名顶替它去让Controller Autowire(详见后面的示例)

 

1.3. 宽松的配置, To XML or Not to XML 
    据说SpringStruts的配置宽松了很多,这就给人把东西从配置文件中撤回原码中的机会。
   
不赞成什么都往配置文件里晒,造成了Rich Information的配置文件,修改或者查看的时候,要同时打开配置文件和原码才能清楚一切。
   
而我希望配置文件就集中做一些整体的配置,还有框架必须的、无需管理的冗余代码。而一些细节的变化不大的配置和逻辑,就尽量别往里塞了。因此,Success/Fail View 的配置,不建议放在里面。

 

2.简化后的配置文件

 

1.Controller只剩下一句

 

<bean name="customerController" class="org.springside.bookstore.web.CustomerController" autowire="byName"/>

 

2.DAO也只剩一句

 

<bean id="customerDAO" class="org.springside.bookstore.dao.CustomerDao"/>

 

3.Service类只剩下5

 

  <bean id="customerManager" parent="baseTxService">
        
<property name="target">
            
<bean class="org.springside.bookstore.service.CustomerManager"/>
        
property>
    
bean>

 

3.Spring 1.2xml语法简化
 
最主要的简化是把属性值和引用bean子节点变回了属性值,对不喜欢autowire的兄弟比较有用。
 
当然,如果valueCDATA的时候还是要用子节点。另外,list的值可以用空格隔开也比较实用。

 

1.属性值

 

  <property name="foo">
     
<value>fooValuevalue>
  property>
  简化为
  <property name="foo" value="fooValue"/>

 

2.引用 bean

 

<property name="foo">
   
<ref bean="fooBean">
property>
简化为
<property name="foo" ref="fooBean"/>

 

3. list可以简化为空格分开的字符串

 

<property name="myFriendList">
  
<list>
     
<value>gigixvalue>
        <value>wuyuvalue>
  
list>
property>
简化为
<property name="myFriendList" value="gigix wuyu"/>

 

   4.Spring 2.0来了
  
如果没什么外力刺激,spring xml 可能就这样不会变了。但现在xml成了过街老鼠,被ror的默认配置和JDK5annotation逼得不行,当然就要继续求变。
  
比如有好事者认为,节点名必须以bean打头,附加一个属性id来表示bean名;属性值必须搞一个property子节点,子节点上有个属性name来表示属性名,是给机器看的很不直观的东西。

 

<bean id="customerDAO" class="org.springside...CustomerDAO">
 
<property name="maxCount" value="10">
bean>

 

给人看的东西应该就写成

 

<customerDAO class="org.springside....CustomerDAO" maxCount="10"/>

 

Spring 2.0正用schema实现类似的语法,具体请看它的JPetStore sample

 

5.使用Spring自带的DTD使编辑器Smart.

 

如果没有用EclipseSpring插件,那至少也要使用spring自带的dtd使XML编辑器smart一些,能够自动为你生成属性,判断节点/属性名称有没有拼错等。
6.
还有更变态的简化配置方法
    
比如autoproxy,不过我觉得更简化就不可控了,所以没有采用。

 

因为Spring自带的sample离我们的实际项目很远,所以官方一点的model层模式展现就靠Appfuse了。
    
Appfusemodel层总共有一个DAO接口、一个DAOImpl类、一个Service接口、一个ServiceImpl类、一个DataObject.....大概只有受惯了虐待的人才会欣然接受吧。
   
另外,Domain-Driven逢初一、十五也会被拿出来讨论一遍。

   
其实无论什么模式,都不过是一种人为的划分、抽象和封装。只要在团队里理解一致,自我感觉优雅就行了。
    
我的建议是,一开始DOManager一生一旦包演全场,DO作为纯数据载体,而Manager类放置商业方法,用getHibernateTemplate()直接访问数据库,不强制基于接口编程。当某天系统复杂到你直觉上需要将DAO层和Service层分开时,再分开就好了。
 

你可能感兴趣的:(简化Spring--配置文件1)