Spring <aop:config> 疑问 -- 完全由spring代理对象才能被事务管理
来源:互联网 发布:软件产品包装方案 编辑:程序博客网 时间:2024/06/05 15:58
我想通过Spring AOP实现日志功能,及在每个类的每个方法开始调用和退出时,打印日志。
但是,我发现一个问题,同一个类中的方法A调用方法B时,确不能在方法B调用植入日志。
代码如下:
1) 需要植入日志的类 aop.AopTest
2) interceptor, aop.InterceptorTest
3) Spring 配置文件 ApplicationContext.xml
4) 测试代码 main.Main
5) 运行输出
程序运行后,输入如下:
[DEBUG]startInvoke ----------------->[aop.AopTest.methodAB]
[DEBUG]AopTest.methodAB()
[DEBUG]AopTest.methodA()
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodAB]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]
[DEBUG]AopTest.methodA()
[DEBUG]endInvoke *******************>[aop.AopTest.methodA]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodB]
6) 但实际上,我想要的输出是:
[DEBUG]startInvoke ----------------->[aop.AopTest.methodAB]
[DEBUG]AopTest.methodAB()
[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]
[DEBUG]AopTest.methodA()
[DEBUG]endInvoke *******************>[aop.AopTest.methodA]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodB]
[DEBUG]endInvoke *******************>[aop.AopTest.methodAB]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]
[DEBUG]AopTest.methodA()
[DEBUG]endInvoke *******************>[aop.AopTest.methodA]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodB]
红色的文字为,缺少的输出
问题是:
1) 为什么会这样?
2) 怎样在不改动源代码 aop.AopTest.java和aop.InterceptorTest.java的情况下,实现我期待的输出?
但是,我发现一个问题,同一个类中的方法A调用方法B时,确不能在方法B调用植入日志。
代码如下:
1) 需要植入日志的类 aop.AopTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public
class
AopTest {
private
static
final
Logger logger = Logger.getRootLogger();
public
void
methodA() {
logger.debug(
"AopTest.methodA()"
);
}
public
void
methodB() {
logger.debug(
"AopTest.methodB()"
);
}
public
void
methodAB() {
logger.debug(
"AopTest.methodAB()"
);
methodA();
methodB();
}
}
2) interceptor, aop.InterceptorTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public
class
InterceptorTest {
private
static
final
Logger logger = Logger.getRootLogger();
public
void
startInvoke(JoinPoint joinPoint) {
String methodName = String.format(
"%s.%s"
, joinPoint.getSignature().getDeclaringTypeName()
, joinPoint.getSignature().getName() );
logger.debug(
"startInvoke ----------------->["
+ methodName +
"]"
);
}
public
void
endInvoke(JoinPoint joinPoint) {
String methodName = String.format(
"%s.%s"
, joinPoint.getSignature().getDeclaringTypeName()
, joinPoint.getSignature().getName() );
logger.debug(
"endInvoke *******************>["
+ methodName +
"]"
);
}
}
3) Spring 配置文件 ApplicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?
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:aop
=
"http://www.springframework.org/schema/aop"
xmlns:tx ="http://www.springframework.org/schema/tx"
xmlns:context
=
"http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire
=
"byName"
>
<!-- support spring annotation -->
<
context:annotation-config
/>
<
bean
id
=
"aopTest"
class
=
"aop.AopTest"
/>
<
bean
id
=
"interceptorTest"
class
=
"aop.InterceptorTest"
/>
<
aop:config
proxy-target-class
=
"true"
>
<
aop:aspect
id
=
"testAspect"
ref
=
"interceptorTest"
>
<
aop:pointcut
id
=
"testPointcut"
expression
=
"execution(* aop..*.*(..))"
/>
<
aop:before
pointcut-ref
=
"testPointcut"
method
=
"startInvoke"
/>
<
aop:after
pointcut-ref
=
"testPointcut"
method
=
"endInvoke"
/>
</
aop:aspect
>
</
aop:config
>
</
beans
>
4) 测试代码 main.Main
1
2
3
4
5
6
7
8
9
10
public
class
Main {
public
static
final
ApplicationContext ctx =
new
ClassPathXmlApplicationContext(
"applicationContext.xml"
);
public
static
void
main(String[] args) {
AopTest aopTest = (AopTest)ctx.getBean(
"aopTest"
);
aopTest.methodAB();
aopTest.methodA();
aopTest.methodB();
}
}
5) 运行输出
程序运行后,输入如下:
[DEBUG]startInvoke ----------------->[aop.AopTest.methodAB]
[DEBUG]AopTest.methodAB()
[DEBUG]AopTest.methodA()
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodAB]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]
[DEBUG]AopTest.methodA()
[DEBUG]endInvoke *******************>[aop.AopTest.methodA]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodB]
6) 但实际上,我想要的输出是:
[DEBUG]startInvoke ----------------->[aop.AopTest.methodAB]
[DEBUG]AopTest.methodAB()
[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]
[DEBUG]AopTest.methodA()
[DEBUG]endInvoke *******************>[aop.AopTest.methodA]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodB]
[DEBUG]endInvoke *******************>[aop.AopTest.methodAB]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodA]
[DEBUG]AopTest.methodA()
[DEBUG]endInvoke *******************>[aop.AopTest.methodA]
[DEBUG]startInvoke ----------------->[aop.AopTest.methodB]
[DEBUG]AopTest.methodB()
[DEBUG]endInvoke *******************>[aop.AopTest.methodB]
红色的文字为,缺少的输出
问题是:
1) 为什么会这样?
2) 怎样在不改动源代码 aop.AopTest.java和aop.InterceptorTest.java的情况下,实现我期待的输出?
0 0
- Spring <aop:config> 疑问 -- 完全由spring代理对象才能被事务管理
- Spring事务管理(4)-AOP创建代理
- Spring-AOP 前置代理对象
- spring事务管理,AOP模式
- spring aop事务管理配置
- Spring Aop事务管理
- Spring AOP 事务管理
- spring aop事务管理
- spring aop xml事务管理
- spring aop 事务管理
- Spring事务管理、Aop
- Spring AOP动态代理 /声明式事务管理与配置介绍
- Spring AOP demo 和获取被CGLIB代理的对象
- Spring:AOP(一)生成代理对象
- Spring AOP 代理对象的生成 part3
- Spring aop config
- Spring AOP config
- Spring AOP Schema aop:config
- NSURLCache内存缓存
- spring hibernate BaseDAO
- 中国国家气象局天气预报信息接口
- 通过TabActivity创建底部菜单栏
- HTML5边玩边学(5):图像、图案和字体 一、创建图像对象
- Spring <aop:config> 疑问 -- 完全由spring代理对象才能被事务管理
- Android系统自带样式(android:theme)(转)
- android 垂直的进度条实现
- POJ-1200(N进制字符串hash)
- 函数后面加const
- 利用Fragment实现Tab页
- 面过的那些题
- 求最小的前n个数
- ORACLE 10G imp error: ORA-12899