在项目中采用Spring2.5+Hibernate+Struts2.0开发中采用Maven管理和构建,由于有一个Common项目中各种项目中采用代码和公用的配置,但是在其中一个项目中需要添加一个针对某个类的Hibernate的监听器,如果将这个公共的监听器的代码添加到Commons项目中,不仅增加的项目的代码,又不符合项目中的Commons项目的设计的真实意图,思索在采用重写Spring的bean的方法实现的SessionFactory的重写。
在Commons项目中原有Spring Hibernate 等的一些公用的配置,重写的用法:
在公共项目(Commons项目)中将要重写的Spring bean 添加name的属性,在特殊需要的项目中添加Spring bean 将他的name属性名字命名和需要重写的Spring bean中name一致即可。Spring 发现Bean的名称相同采用最后加载的bean的覆盖原来的bean的,从而实现从写。
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd">
取代了之前通过FieldRetrevingFactoryBean获取bean静态常量的FactoryBean!
老的用法
- <bean id="..." class="...">
- <property name="isolation">
- <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE"
- class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
- </property>
- </bean>
新用法
- <bean id="..." class="...">
- <property name="isolation">
- <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/>
- </property>
- </bean>
2,<util:property-path/>
取代了之前通过PropertyPathFactoryBean来指定属性路径获取属性值的FactoryBean!
老的用法
- <bean id="testBean" class="org.springframework.beans.TestBean" singleton="false">
- <property name="age" value="10"/>
- <property name="spouse">
- <bean class="org.springframework.beans.TestBean">
- <property name="age" value="11"/>
- </bean>
- </property>
- </bean>
- <bean id="testBean.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/>
新的用法
- <bean id="testBean" class="org.springframework.beans.TestBean" singleton="false">
- <property name="age" value="10"/>
- <property name="spouse">
- <bean class="org.springframework.beans.TestBean">
- <property name="age" value="11"/>
- </bean>
- </property>
- </bean>
- <util:property-path id="name" path="testBean.age"/>
3,<util:properties/>
替代了之前通过PropertiesFactoryBean来获取properties配制文件数据的FactoryBean!
老用法
- <bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- <property name="location" value="classpath:com/foo/jdbc-production.properties"/>
- </bean>
新用法
- <util:properties id="jdbcConfiguration" location="classpath:com/foo/jdbc-production.properties"/>
4,<util:list/>
替代了之前通过<list><value></value></list>的内置配制方式,让多个bean调用同一list成为可能!
老的用法
- <bean id="emails" class="org.springframework.beans.factory.config.ListFactoryBean">
- <property name="sourceList">
- <list>
- <value>pechorin@hero.org</value>
- <value>raskolnikov@slums.org</value>
- <value>stavrogin@gov.org</value>
- <value>porfiry@gov.org</value>
- </list>
- </property>
- </bean>
新的用法
- <util:list id="emails" list-class="java.util.LinkedList">
- <value>pechorin@hero.org</value>
- <value>raskolnikov@slums.org</value>
- <value>stavrogin@gov.org</value>
- <value>porfiry@gov.org</value>
- </util:list>
5,<util:map/>
替代了之前适用<map><entry key=""><value></value></entry></map>的配置方式,让多个bean调用同一map成为可能!
老的用法
- <bean id="emails" class="org.springframework.beans.factory.config.MapFactoryBean">
- <property name="sourceMap">
- <map>
- <entry key="pechorin" value="pechorin@hero.org"/>
- <entry key="raskolnikov" value="raskolnikov@slums.org"/>
- <entry key="stavrogin" value="stavrogin@gov.org"/>
- <entry key="porfiry" value="porfiry@gov.org"/>
- </list>
- </property>
- </bean>
新的用法
- <util:map id="emails" map-class="java.util.TreeMap">
- <entry key="pechorin" value="pechorin@hero.org"/>
- <entry key="raskolnikov" value="raskolnikov@slums.org"/>
- <entry key="stavrogin" value="stavrogin@gov.org"/>
- <entry key="porfiry" value="porfiry@gov.org"/>
- </util:map>
6,<util:set/>
替代了之前适用<set><value></value></set>的配置方式,
让多个bean调用同一set成为可能!
老的用法
- <bean id="emails" class="org.springframework.beans.factory.config.SetFactoryBean">
- <property name="sourceSet">
- <set>
- <value>pechorin@hero.org</value>
- <value>raskolnikov@slums.org</value>
- <value>stavrogin@gov.org</value>
- <value>porfiry@gov.org</value>
- </set>
- </property>
- </bean>
新的用法
- <util:set id="emails" set-class="java.util.TreeSet">
- <value>pechorin@hero.org</value>
- <value>raskolnikov@slums.org</value>
- <value>stavrogin@gov.org</value>
- <value>porfiry@gov.org</value>
- </util:set>
7,<jee:jndi-lookup/>
替代了之前使用JndiObjectFactoryBean指定配制获取容器JNDI资源的FactoryBean!
老的用法
- <bean id="simple" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName" value="jdbc/MyDataSource"/>
- <property name="cache" value="true"/>
- <property name="resourceRef" value="true"/>
- <property name="lookupOnStartup" value="false"/>
- <property name="expectedType" value="com.myapp.DefaultFoo"/>
- <property name="proxyInterface" value="com.myapp.Foo"/>
- </bean>
新用法
- <jee:jndi-lookup id="simple"
- jndi-name="jdbc/MyDataSource"
- cache="true"
- resource-ref="true"
- lookup-on-startup="false"
- expected-type="com.myapp.DefaultFoo"
- proxy-interface="com.myapp.Foo"/>
8,<jee:local-slsb/>
替代了之前使用LocalStatelessSessionProxyFactoryBean来获取无状态会话BEAN的FactoryBean!
老的用法
- <bean id="complexRemoteEjb"
- class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean">
- <property name="jndiName" value="ejb/MyRemoteBean"/>
- <property name="businessInterface" value="com.foo.service.RentalService"/>
- <property name="cacheHome" value="true"/>
- <property name="lookupHomeOnStartup" value="true"/>
- <property name="resourceRef" value="true"/>
- <property name="homeInterface" value="com.foo.service.RentalService"/>
- <property name="refreshHomeOnConnectFailure" value="true"/>
- </bean>
新的用法
- <jee:remote-slsb id="complexRemoteEjb"
- jndi-name="ejb/MyRemoteBean"
- business-interface="com.foo.service.RentalService"
- cache-home="true"
- lookup-home-on-startup="true"
- resource-ref="true"
- home-interface="com.foo.service.RentalService"
- refresh-home-on-connect-failure="true">
AOP,事务方面,添加的标签还是比较实用的!
- <aop:config>
- <aop:advisor pointcut="execution(* *..PetStoreFacade.*(..))" advice-ref="txAdvice"/>
- </aop:config>
- <tx:advice id="txAdvice">
- <tx:attributes>
- <tx:method name="insert*"/>
- <tx:method name="update*"/>
- <tx:method name="*" read-only="true"/>
- </tx:attributes>
- </tx:advice>