特别是当你对transactional代理下定义时,你可以用大量类似的代理定义来结束。父类和子类bean,内部bean都可以实现更加干净和简洁的代理定义。
首先,我们为代理创建一个父类模板定义,如下所示:
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
上面的类并没有实例化,所以他并不是完整的。然后每个需要被创建的代理都是它的子类,它包装了定义为内部类的代理target,因为该target不会以他自己的方式使用。下面是一个子类的例子:
<bean id="myService" parent="txProxyTemplate"> <property name="target"> <bean class="org.springframework.samples.MyServiceImpl"> </bean> </property> </bean>
你可以覆盖父类的属性,如下所示:
<bean id="mySpecialService" parent="txProxyTemplate"> <property name="target"> <bean class="org.springframework.samples.MySpecialServiceImpl"> </bean> </property> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="store*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
注意在父类的例子中,我们显示的设置abstract为true,如上面所示,所以他并没有被初始化,Application contexts(而不是简单的bean factories),会默认初始化所有的singletons。因此,如果你有一个父bean的定义,你打算只把他作为模板,并且他是一个类,那么你必须将他的abstract属性设置为true。否则application context 会尝试预先实例化他。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8