invocation.proceed()拦截链代码
时间: 2024-01-24 11:17:42 浏览: 178
`invocation.proceed()`是一个拦截器中的方法,用于执行下一个拦截器或目标方法。拦截器链是由多个拦截器组成的链式结构,每个拦截器都可以在目标方法执行前后进行一些操作,如参数校验、日志记录、权限校验等。当调用`invocation.proceed()`方法时,会将控制权交给下一个拦截器或目标方法,执行完后再返回到当前拦截器中继续执行。
以下是一个简单的拦截器链示例:
```java
public class MyInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
// 在目标方法执行前进行一些操作
System.out.println("Before method " + invocation.getMethod().getName());
// 执行下一个拦截器或目标方法
Object result = invocation.proceed();
// 在目标方法执行后进行一些操作
System.out.println("After method " + invocation.getMethod().getName());
return result;
}
}
// 创建拦截器链
List<MethodInterceptor> interceptors = new ArrayList<>();
interceptors.add(new MyInterceptor());
// 创建目标对象
HelloService helloService = new HelloServiceImpl();
// 创建代理对象
ProxyFactory proxyFactory = new ProxyFactory(helloService);
proxyFactory.setInterfaces(HelloService.class);
// 设置拦截器链
proxyFactory.setMethodInterceptors(interceptors.toArray(new MethodInterceptor[0]));
HelloService proxy = (HelloService) proxyFactory.getProxy();
// 调用代理对象方法
proxy.sayHello();
```
在上述代码中,我们实现了一个`MyInterceptor`拦截器,用于在目标方法执行前后进行一些操作。通过`invocation.proceed()`方法,我们将控制权交给了下一个拦截器或目标方法。最终,我们创建了一个代理对象`proxy`,并调用了它的`sayHello()`方法。在调用过程中,代理对象会依次执行拦截器链中的拦截器和目标方法,并输出以下内容:
```
Before method sayHello
Hello, world!
After method sayHello
```
阅读全文