首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

spring事宜,方法拦截器各种配置

2012-08-29 
spring事务,方法拦截器各种配置1. 代理工厂Bean事务管理( *ProxyFactoryBean) + Service + DAO配置 我刚开

spring事务,方法拦截器各种配置

1. 代理工厂Bean事务管理( *ProxyFactoryBean) + Service + DAO配置

我刚开始看Spring时用的书是林信良的《Spring技术手册》,书中对声明式事务主要采用 TransactionProxyFactoryBean,业务Bean如 Service或BO类继承它来进行事务控制。代理工厂Bean( *ProxyFactoryBean)这一类Spring提供的工厂类,可将一个 bean 进行委托代理,从而达到控制方法行为的目的。

此类事务配置一般如下(因为我们未采用这种方式,就以书上的JDBC datasource举例说明。不同公司采用的格式可能有所不同):


Xml代码



<!--?前面的?dataSource等配置略?........?-->?



<!--?事务管理器?-->?

<bean?id="transactionManager"?/>
</property>
</bean>
<!-- 事务模板 -->
<bean id="baseTransactionProxy"
ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>   <!-- 本文仅简单用一种方式说明。所有方法起事务,可以修改以精细和区别性控制事务 -->
</props>
</property>
</bean>
<!-- 业务对象 -->
<bean id="authService" parent="baseTransactionProxy">
<property name="target">
<bean ref="authDao" />
</bean>
</property>
</bean>
<bean id="departmentService" parent="baseTransactionProxy">
<property name="target">
<bean ref="departmentDao" />
</bean>
</property>
</bean>
<!-- 数据访问对象 -->
<bean id="authDao" ref="dataSource" />
</bean>
<bean id="departmentDao" ref="dataSource" />
</bean>



这种代理工厂Bean的事务管理一般都要求将 Service 的 bean 配置为 , 上面的例子使用了 parent="baseTransactionProxy" 继承机制简化了原书中的配置。

代码中通过以下方式使用:




Java代码



AuthService?authService?=?(AuthService)?context.getBean("authService");?

boolean?b?=?authService.hasPermission("TOKEN_XXXXX");?





AuthService authService = (AuthService) context.getBean("authService");
boolean b = authService.hasPermission("TOKEN_XXXXX");



2. 自动代理事务(*AutoProxyCreator) + Service + DAO配置

*AutoProxyCreator这一类东东,能够自动为Spring容器中的bean进行 AOP 代理,配置起来能适当简化。一般需要用 BeanNameAutoProxyCreator 来配置对那些类进行自动代理, MethodPointcutAdvisor 来配置对哪些方法进行代理。

这种声明式事务配置采用拦截器(Interceptor)或通知器(Advisor) 进行事务控制,这里使用了Spring提供的 TransactionInterceptor 来管理事务。 (本质上 ProxyFactoryBean 也要生成被代理对象的字节码,不过每个类型的ProxyFactoryBean 只能固定处理一个 Aspect,不算真正的AOP)。

以下配置对 *Service 的所有方法进行事务控制。?

<bean id="transactionManager" />
</property>
</bean>?




Xml代码



<!--?事务管理拦截器?-->?

<bean?id="transactionInterceptor"?/>
</property>
</bean>
<!-- 配置要拦截哪些类,并使用那些拦截器 -->
<bean id="ServiceAutoProxyCreator" value="true"></property>
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<!-- 头三个是我们项目中用的其他 Advisor,这里展示了添加拦截器进行aspect控制的灵活性。省略他们的配置 -->
<value>monitorMethodPointcutAdvisor</value>
<value>asynmonitorMethodPointcutAdvisor</value>
<value>businessLogMethodPointcutAdvisor</value>
<value>trasactionMethodPointcutAdvisor</value> <!-- 事务拦截器, 直接配成 transactionInterceptor 去掉 trasactionMethodPointcutAdvisor bean 也可以, -->
</list>
</property>
</bean>



Service,DAO的配置方式稍微改变一下, Service不再作为ProxyFactoryBean的 target属性,而是一个顶级 bean,这样 Service bean看起来就更单纯一些。?


Xml代码



<!--?业务对象?-->?

<bean?class="com.xxxx.cms.service.AuthorityService">?

<property?name="authDao"?ref="authDao"?/>?

</bean>?

<bean?class="com.xxxx.cms.service.pojo.DepartmentService">?

<property?name="departmentDao"?ref="departmentDao"?/>?

</bean>?



<!--?数据访问对象?-->?

<bean?id="authDao"?class="com.xxxx.cms.dao.jdbc.AuthorityDao">?

<property?name="dataSource"?ref="dataSource"?/>?

</bean>?

<bean?id="departmentDao"?class="com.xxxx.cms.dao.jdbc.DepartmentDao">?

<property?name="dataSource"?ref="dataSource"?/>?

</bean>?

热点排行