创建一个Dog类,向其中加入eat()方法。使用 AOP在eat()方法前面和后面添加喝水的drink(方法,之后添加run()跑的方法。(使用注解 方式实现)相关分别建在哪些文件夹下,运行出结果
时间: 2023-06-13 11:05:56 浏览: 423
1. 首先,我们需要在项目中导入AOP相关的依赖。这里以Spring Boot项目为例,可以在pom.xml文件中加入以下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
```
2. 创建一个Dog类,向其中加入eat()方法。使用注解方式实现AOP,在eat()方法前后添加喝水的drink()方法和跑的run()方法。具体代码如下:
```java
package com.example.demo;
import org.springframework.stereotype.Component;
@Component
public class Dog {
@Drink
public void eat() {
System.out.println("Dog is eating.");
}
@Run
public void run() {
System.out.println("Dog is running.");
}
}
```
其中,@Drink和@Run是我们自定义的注解,在后面会进行定义。
3. 创建我们自定义的注解@Drink和@Run。代码如下:
```java
package com.example.demo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Drink {
}
```
```java
package com.example.demo;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Run {
}
```
4. 创建一个切面类,实现在eat()方法前后添加喝水的drink()方法和跑的run()方法的功能。代码如下:
```java
package com.example.demo;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class DogAspect {
@Pointcut("@annotation(com.example.demo.Drink)")
public void drinkPointcut() {}
@Pointcut("@annotation(com.example.demo.Run)")
public void runPointcut() {}
@Before("drinkPointcut()")
public void doDrinkBefore() {
System.out.println("Dog is drinking water.");
}
@After("drinkPointcut()")
public void doDrinkAfter() {
System.out.println("Dog has finished drinking water.");
}
@Before("runPointcut()")
public void doRunBefore() {
System.out.println("Dog is running.");
}
@After("runPointcut()")
public void doRunAfter() {
System.out.println("Dog has finished running.");
}
}
```
其中,@Pointcut注解定义了切入点,即需要被AOP增强的方法。@Before注解表示在切入点方法执行前执行,@After注解表示在切入点方法执行后执行。
5. 在Spring Boot的启动类上加上@EnableAspectJAutoProxy注解,开启AOP功能。
```java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
6. 运行程序,输出结果如下:
```
Dog is drinking water.
Dog is eating.
Dog has finished drinking water.
Dog is running.
Dog has finished running.
```
可以看到,在Dog类的eat()方法前后添加了喝水的drink()方法和跑的run()方法。
阅读全文