注解实现methodinterceptor
时间: 2023-09-30 13:12:59 浏览: 45
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
```