Spring AOP的一些初级坑

这里都使用 Java 注解的方式来做配置。

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)")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值