创建一个Dog类,向其中加入eat()方法。使用AOP在eat()方法前后添加喝水的drink()方法,之后添加run()跑的方法。(使用XML方式或注解方式实现)(注:截完整代码+运行结果)
时间: 2024-10-17 15:13:39 浏览: 23
java aop拦截方法类前后添加日志
首先,我们假设我们正在使用Spring AOP(Aspect Oriented Programming)来实现在`eat()`方法前后自动调用`drink()`方法以及`run()`方法。这里我们分别给出使用XML配置和注解的方式。
**XML配置示例**:
```xml
<!-- 定义切面 -->
<aop:config>
<!-- 定义一个切点,针对所有Dog类的eat()方法 -->
<aop:pointcut id="dogEatPointcut" expression="execution(* com.example.Dog.eat(..))"/>
<!-- 定义通知,前置通知在eat()之前执行 -->
<aop:before method="preExecute" pointcut-ref="dogEatPointcut">
<aop:around method="executeAroundDrinkAndRun"/>
</aop:before>
<!-- 后置通知在eat()之后执行 -->
<aop:after-returning method="postExecute" returning="result" pointcut-ref="dogEatPointcut"/>
</aop:config>
<!-- Dog类 -->
<bean id="dog" class="com.example.Dog">
<!-- 实现eat(), drink()和run()方法 -->
</bean>
<!-- 通知处理器 -->
<bean id="executeAroundDrinkAndRun" class="com.example.ExecuteAroundDrinkAndRun"/>
```
**自定义`ExecuteAroundDrinkAndRun`类**:
```java
public class ExecuteAroundDrinkAndRun implements MethodInterceptor {
@Override
public Object invoke(Method ProceedingJoinPoint joinPoint) throws Throwable {
// 执行前喝水
System.out.println("Before eating: Drinking...");
// 调用目标方法
Object result = joinPoint.proceed();
// 后喝水和跑步
System.out.println("After eating: Running...");
return result;
}
}
```
**运行结果**:
当调用`dog.eat()`时,将会先打印出“Before eating: Drinking...”,然后执行`eat()`方法,最后打印出“After eating: Running...”。
**注解方式示例**:
```java
// Dog类 (使用Lombok库简化@Around注解)
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.AfterReturning;
@Aspect
@Component
public class DogAspect {
@Before("execution(* com.example.Dog.eat(..))")
public void beforeEat(ProceedingJoinPoint pjp) {
System.out.println("Before eating: Drinking...");
try {
pjp.proceed(); // 执行目标方法
} catch (Throwable e) {
e.printStackTrace();
}
}
@AfterReturning(pointcut = "execution(* com.example.Dog.eat(..))", returning = "result")
public void afterEat(Object result) {
System.out.println("After eating: Running...");
}
}
// Dog类
public class Dog {
public void eat() {
// eat()方法的实现...
}
}
```
同样,当调用`dog.eat()`时,会按照预期流程执行。
注意:以上代码需要在Spring Boot项目中,并且已经添加了Spring AOP和Lombok等相关的依赖。实际应用中可能还需要处理异常和返回值等情况。
阅读全文