AOP切入同类调用方法不起作用,AopContext.currentProxy()帮帮你解决

    今天翻看公司之前代码时,无意中看到了如下一段代码:

(UserService)AopContext.currentProxy()).getWechatInfo()

  心里在想,好好的方法为啥不通过this.getWechatInfo()调用,而是通过AopContext.currentProxy()这个aop方式调用,于是乎一顿查找,并了解到:当在Service中定义了一个方法并且切入之后,从Controller里面调用该方法可以实现切入,但是当在同一个Service中实现另一方法并调用改方法时却无法切入。

   然后写了个例子亲测如下:

@Service
public class GreetingServiceImpl implements GreetingService {
    @Override public void sayMessage(String message) {
        System.out.println("GreetingService.sayMessage " + message);
        this.sayHello();//调用同个service下的方法
    }

    @Override
    public void sayHello() {
        System.out.println("GreetingService.sayHello()");
    }
}
@RequestMapping(value = "hello")
    @ResponseBody
    public String returnString(
        @RequestParam("userName") String userName,
        @RequestParam("password") String password,
        Model model) {
        greetingService.sayMessage("xiaoming ");
        return "hello return string 这是中文" + userName + "-" + password;
    }

spring-servlet.xml配置如下:


    

运行程序,控制台输出结果如下:

的确切面对sayHello()没有起作用。

现在修改service如下

@Service
public class GreetingServiceImpl implements GreetingService {
    @Override public void sayMessage(String message) {
        System.out.println("GreetingService.sayMessage " + message);
        ((GreetingService) AopContext.currentProxy()).sayHello();//获取切点,强转后调用
    }

    @Override
    public void sayHello() {
        System.out.println("GreetingService.sayHello()");
    }
}

浏览器报错如下:AOP切入同类调用方法不起作用,AopContext.currentProxy()帮帮你解决_第1张图片很明显,需要配置spring-servlet.xml,修改后如下(增加了expose-proxy="true"):


    

运行后控制台输出如下:

AOP切入同类调用方法不起作用,AopContext.currentProxy()帮帮你解决_第2张图片

说明切点起作用了。over, that's all....

你可能感兴趣的:(java)