methodinterceptor接口 intercept方法什么时候调用
时间: 2024-05-27 07:11:25 浏览: 177
方法拦截器(MethodInterceptor)是AOP中的一个接口,用于在目标对象的方法执行前后添加自定义逻辑。
intercept方法会在代理对象调用方法时被调用,它接收三个参数:
1. Object对象:目标对象的实例
2. Method对象:目标方法的反射对象
3. Object[]数组:目标方法的参数
在intercept方法中,可以添加自定义的逻辑,比如日志打印、权限校验、性能监控等。最终需要使用MethodInvocation对象的proceed()方法来执行目标方法。
总之,intercept方法会在代理对象调用方法时被调用,用于添加自定义的逻辑。
相关问题
注解实现methodinterceptor
MethodInterceptor是CGLib提供的一个拦截器接口,它可以在执行目标方法前后进行一些额外的操作,比如记录日志、性能监控、事务管理等。下面是一个注解实现MethodInterceptor的例子。
首先定义一个注解@Interceptor,用来标识需要被拦截的方法:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Interceptor {
}
```
然后定义一个拦截器类MyInterceptor,实现MethodInterceptor接口:
```java
public class MyInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
if (method.isAnnotationPresent(Interceptor.class)) { // 判断方法是否被注解@Interceptor标识
// 在目标方法执行前进行一些额外的操作
System.out.println("Before method invocation: " + method.getName());
// 执行目标方法
Object result = proxy.invokeSuper(obj, args);
// 在目标方法执行后进行一些额外的操作
System.out.println("After method invocation: " + method.getName());
return result;
} else {
// 如果方法没有被注解@Interceptor标识,则直接执行目标方法
return proxy.invokeSuper(obj, args);
}
}
}
```
最后,在需要被拦截的方法上使用@Interceptor注解即可:
```java
public class UserService {
@Interceptor
public void saveUser(User user) {
// 保存用户信息
}
}
```
使用CGLib生成UserService的代理类,并调用代理类的saveUser方法:
```java
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new MyInterceptor());
UserService userService = (UserService) enhancer.create();
userService.saveUser(new User());
}
```
输出结果如下:
```
Before method invocation: saveUser
After method invocation: saveUser
```
cglib动态代理intercept
CGLIB是一个强大的开源代码生成库,它可以在运行时扩展Java类和实现接口。CGLIB动态代理是CGLIB库的一个重要特性,它通过生成目标类的子类来实现代理。
在CGLIB动态代理中,我们可以使用`MethodInterceptor`接口来定义代理逻辑。`MethodInterceptor`接口有一个`intercept`方法,该方法在目标方法被调用时被触发。在`intercept`方法中,我们可以编写自定义的逻辑来增强目标方法的功能。
下面是一个使用CGLIB动态代理的示例代码:
```java
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxyExample implements MethodInterceptor {
public Object createProxy(Object target) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// 在目标方法执行前的逻辑
System.out.println("Before method: " + method.getName());
// 调用目标方法
Object result = proxy.invokeSuper(obj, args);
// 在目标方法执行后的逻辑
System.out.println("After method: " + method.getName());
return result;
}
}
```
在上述示例中,我们首先创建了一个`CglibProxyExample`类,实现了`MethodInterceptor`接口。然后,我们通过`Enhancer`类创建了一个代理对象,并设置了目标类和代理逻辑。在`intercept`方法中,我们可以在目标方法执行前后添加自定义的逻辑。
使用CGLIB动态代理时,我们可以通过调用`createProxy`方法来创建代理对象。例如:
```java
SomeClass target = new SomeClass();
CglibProxyExample proxyExample = new CglibProxyExample();
SomeClass proxy = (SomeClass) proxyExample.createProxy(target);
```
这样,我们就可以通过`proxy`对象来调用目标类的方法,并在方法执行前后添加自定义的逻辑。