);
}
//③ static是类级别的方法,无法被子类覆盖
public static void method3() {
System.out.println("method3");
}
//④ public方法可以被子类覆盖,因此可以被动态字节码增强
public void method4() {
System.out.println("method4");
}
}
Spring事务管理高级应用难点剖析: 第2部分(5)
时间:2012-04-26 IBM 陈雄华
Spring 通过 CGLib 动态代理技术对 UserService Bean 实施 AOP 事 务增强的配置如下所示:
清单 7.applicationContext.xml:对 UserService 用 CGLib 实施事务增强
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 省略声明数据源及DataSourceTransactionManager事务管理器-->
…
<aop:config proxy-target-class="true">
<!-- ①显式使用CGLib动态代理 -->
<!-- ②希望对UserService所有方法 实施事务增强 -->
<aop:pointcut id="serviceJdbcMethod"
expression="execution(* user.special.UserService.*(..))"/>
<aop:advisor pointcut-ref="serviceJdbcMethod"
advice- ref="jdbcAdvice" order="0"/>
</aop:config>
<tx:advice id="jdbcAdvice" transaction-manager="jdbcManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
</beans>
在 ① 处,我们通过 proxy-target-class="true"显式使用 CGLib 动态代理技术,在 ② 处通过 AspjectJ 切点表达式表达 UserService 所有的方法,希 望对 UserService 所有方法都实施 Spring AOP 事务增强。
在 UserService 添加一个 可执行的方法,如下所示:
清单 8.UserService.java 添加 main 方法
package user.special;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserService {
…
public static void main(String[] args) {
Application
|