前置通知为什么不需要实现MethodInterceptor?
时间: 2023-12-29 15:02:14 浏览: 25
前置通知不需要实现MethodInterceptor是因为它只需要在目标方法执行前执行一些额外的逻辑,不需要对目标方法进行拦截和修改。在AOP框架中,前置通知是通过实现前置通知接口来实现的,通常情况下前置通知接口只有一个BeforeAdvice。BeforeAdvice接口定义了一个before方法,该方法在目标方法执行之前执行,可以完成一些额外的逻辑,如日志记录、安全检查等。因此,相对于环绕通知,前置通知的实现更加简单。
相关问题
为什么环绕通知需要实现MethodInterceptor?
环绕通知需要实现MethodInterceptor是因为它需要在目标方法的前后进行一些额外的操作,比如日志记录、性能监测等。MethodInterceptor是AOP框架中的一个重要接口,它能够拦截目标对象的方法调用,并在目标方法执行前后做一些自定义的处理。通过实现MethodInterceptor接口,我们可以在目标方法执行前后实现一些额外的逻辑,从而实现环绕通知的功能。
注解实现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
```