今天仔细想了想,终于找到解决方案了。
首先对BO进行声明性事务代理。
然后在配置环绕通知时将目标对象设为事务代理对象。
例如:
<bean id="bo" class="com.bo.BO">
<property name="dao" ref="dao"> </property>
</bean>
<bean id="proxyBo" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bo"> </property>
<property name="transactionManager" ref="htm"> </property>
<property name="transactionAttributes">
<props>
<prop key="*"> PROPAGATION_REQUIRED </prop>
</props>
</property>
</bean>
上面是给bo装备事务代理,target指明了目标对象是我1个id为bo的bean.
<bean id="interceptor" class="com.util.MyBoLogger">
</bean>
<bean id="myadvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="interceptor"> </property>
<property name="pattern" value="com.bo.BO.*"> </property>
</bean>
<bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="proxyBo"> </property>
<property name="interceptorNames">
<list>
<value> myadvisor </value>
</list>
</property>
<property name="proxyInterfaces">
<list>
<value> com.bo.BOIF </value>
</list>
</property>
</bean>
这是添加环绕通知,在 <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
中, <property name="target" ref="proxyBo"> </property> 目标对象是前面设置好的事务代理bean.
前提是要使用jdk的动态代理,不能用cglib,让BO类实现1个接口就可以了,我的接口是com.bo.BOIF,
需要用 <property name="proxyInterfaces"> 指明。
让需要注入bo这个bean的时候,
<bean name="/login" class="com.ness.struts.action.LoginAction">
<property name="bo" ref="logProxy"> </property>
</bean>
直接注入环绕通知bean.我的是logProxy。现在调用bo这个bean的时候就有了事务和环绕2种代理。
spring中联合使用声明事务代理和环绕通知
最新推荐文章于 2023-03-15 22:44:14 发布