这里都使用 Java 注解的方式来做配置。
1. @enableAspectJAutoProxy 必须放到被切面的类的配置类(@ComponenScan)处才生效。
开始我把 @enableAspectJAutoProxy 放在定义切面的配置类这边,发现不起作用。 必须放到配置 “被切” 的类的配置类里面才生效。
2. @Before @After @Around 这几种Pointcut 可以并存吗?我试了,可以,但是被执行顺序的顺序有点古怪,不太理解:
3. 切点方法怎么带参数:
方法playMovement带一个String类型的参数。
playMove(String move) 与 args(move) 这两处参数名"move"需保持一致;但与原方法的参数名不需要保持一致。
切点的占位方法playMove 的签名“playMove(String move)”, 需与原来的类的方法保持一致, 包括所有参数和返回类型;当然,可以用 “..” 来省略后续的参数。
注解与方法也都必须带参数,且两者参数名要保持一致:"move";与原方法的参数名或切点定义处的参数名不用保持一致。
4. 只有被Spring 容器管理的bean才能被注入切面。 所以被切入的对象必须用 Spring 的方法注入,不能直接 new .
虽然 no5 被申明为一个 bean,但是它是用 new 来生成的,上面也不会生成代理,所以切面无法切入。
5. 同一个类内部方法 A 调用方法 B,则方法B的切面不被执行。只有从外部直接调用 方法B 才会使得 B 上的切面被触发。
参看这篇:http://blog.youkuaiyun.com/a1063916463/article/details/53761243
6. 用"Symphony+"表示匹配任何 Symphony的子类,或者如果 Symphony是借口,那么实现该接口的类也能匹配。
1. @enableAspectJAutoProxy 必须放到被切面的类的配置类(@ComponenScan)处才生效。
开始我把 @enableAspectJAutoProxy 放在定义切面的配置类这边,发现不起作用。 必须放到配置 “被切” 的类的配置类里面才生效。
2. @Before @After @Around 这几种Pointcut 可以并存吗?我试了,可以,但是被执行顺序的顺序有点古怪,不太理解:
AOP.@Around: before
AOP.@Before
...
AOP.@Around: after
AOP.@After
3. 切点方法怎么带参数:
@Pointcut("execution(* samsa.tests.aop.Symphony+.playMovement(String)) && args(move)")
public void playMove(String move) {};
方法playMovement带一个String类型的参数。
playMove(String move) 与 args(move) 这两处参数名"move"需保持一致;但与原方法的参数名不需要保持一致。
切点的占位方法playMove 的签名“playMove(String move)”, 需与原来的类的方法保持一致, 包括所有参数和返回类型;当然,可以用 “..” 来省略后续的参数。
@Before("playMove(move)")
public void introduceMovement(String move) {
System.out.println("Let me introduce movement " + move + " to you!");
}
注解与方法也都必须带参数,且两者参数名要保持一致:"move";与原方法的参数名或切点定义处的参数名不用保持一致。
4. 只有被Spring 容器管理的bean才能被注入切面。 所以被切入的对象必须用 Spring 的方法注入,不能直接 new .
比如:
@Before("playMove(move)")
public void introduceMovement(String move) {
System.out.println("Let me introduce movement " + move + " to you!");
}
虽然 no5 被申明为一个 bean,但是它是用 new 来生成的,上面也不会生成代理,所以切面无法切入。
5. 同一个类内部方法 A 调用方法 B,则方法B的切面不被执行。只有从外部直接调用 方法B 才会使得 B 上的切面被触发。
参看这篇:http://blog.youkuaiyun.com/a1063916463/article/details/53761243
6. 用"Symphony+"表示匹配任何 Symphony的子类,或者如果 Symphony是借口,那么实现该接口的类也能匹配。
@Pointcut("execution(* samsa.tests.aop.Symphony+.playMovement(String)) && args(move)")