Transaction Interceptor is an appropriate solution when you want as much control over the transaction processing as possible. Because this solution uses a regular AOP proxyFactoryBean, it allows us to use additional interceptors for other purposes.
The interceptor is specified as a bean named TransactionInterceptor. This interceptor bean has a proprty called transactionAttributeSource that specified as MethodMapTransactionAttributeSource continning the fully qualified method names of the target class and the transaction nattributes that should be in effect for this transaction.The method names can contains an * as a wildcard either at the end or the beginning of the name. Afte the method name you can specify propagation behavior, isolation level, timeout value , and a readonly flag in any order.
In addition to the mentioned transaction attributes, you can also specify additional rollback and no-rollback attributes based on an exception class. These attributes indicate the desired behavior in terms of transaction commit/rollback when the specified exception is thrown during the transaction processing.
<!-- The DBCP DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
<!-- The DAO class -->
<bean id="dao"
class="org.springframework.prospring.ticket.dao.jdbc.JdbcBoxOfficeDao">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- The transactionmanager to use for regular non JTA datasource -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- TransactionInterceptor -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<value>
org.springframework.prospring.ticket.service.BoxOffice.get*=PROPAGATION_SUPPORTS,re
adOnly
org.springframework.prospring.ticket.service.BoxOffice.allocate*=PROPAGATION_REQUIR
ED
</value>
</property>
</bean>
<!-- Transactional proxy for the primary business object -->
<bean id="boxOffice"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="boxOfficeTarget"/>
</property>
<property name="proxyInterfaces">
<value>org.springframework.prospring.ticket.service.BoxOffice</value>
</property>
<property name="interceptorNames">
<value>transactionInterceptor</value>
</property>
</bean>
<!-- Business Object -->
<bean id="boxOfficeTarget"
class="org.springframework.prospring.ticket.service.BoxOfficeImpl">
<property name="boxOfficeDao">
<ref local="dao"/>
</property>
</bean>
The interceptor is specified as a bean named TransactionInterceptor. This interceptor bean has a proprty called transactionAttributeSource that specified as MethodMapTransactionAttributeSource continning the fully qualified method names of the target class and the transaction nattributes that should be in effect for this transaction.The method names can contains an * as a wildcard either at the end or the beginning of the name. Afte the method name you can specify propagation behavior, isolation level, timeout value , and a readonly flag in any order.
In addition to the mentioned transaction attributes, you can also specify additional rollback and no-rollback attributes based on an exception class. These attributes indicate the desired behavior in terms of transaction commit/rollback when the specified exception is thrown during the transaction processing.
<!-- The DBCP DataSource -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url"><value>${jdbc.url}</value></property>
<property name="username"><value>${jdbc.username}</value></property>
<property name="password"><value>${jdbc.password}</value></property>
</bean>
<!-- The DAO class -->
<bean id="dao"
class="org.springframework.prospring.ticket.dao.jdbc.JdbcBoxOfficeDao">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- The transactionmanager to use for regular non JTA datasource -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<!-- TransactionInterceptor -->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<value>
org.springframework.prospring.ticket.service.BoxOffice.get*=PROPAGATION_SUPPORTS,re
adOnly
org.springframework.prospring.ticket.service.BoxOffice.allocate*=PROPAGATION_REQUIR
ED
</value>
</property>
</bean>
<!-- Transactional proxy for the primary business object -->
<bean id="boxOffice"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="boxOfficeTarget"/>
</property>
<property name="proxyInterfaces">
<value>org.springframework.prospring.ticket.service.BoxOffice</value>
</property>
<property name="interceptorNames">
<value>transactionInterceptor</value>
</property>
</bean>
<!-- Business Object -->
<bean id="boxOfficeTarget"
class="org.springframework.prospring.ticket.service.BoxOfficeImpl">
<property name="boxOfficeDao">
<ref local="dao"/>
</property>
</bean>
Comments
Post a Comment