Spring5.1.x官方参考指南中文版

 主页   资讯   文章   代码   电子书 

6.5简介的代理定义

特别是当你对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 会尝试预先实例化他。