SpringAOP-QuickStart
项目要求: 在一个多个方法前或者后追加输出一段话
- 环境准备:
新建maven项目 配置pom.xml依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
- 创建一个接口声明两个方法
public interface Animal {
public void sleep();
public void eat();
}
- 创建实现类并且是实现接口中的方法
@Repository
public class Dog implements Animal {
@Override
public void sleep() {
System.out.println("睡觉");
}
@Override
public void eat() {
System.out.println("吃shit");
}
}
- 配置SpringConfig
@Configuration
@ComponentScan("com.symbo1")
public class SpringConfig {
public static class Advice {
public void before(){
System.out.println(".....");
}
}
}
- 创建App 测试类
public class App {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
Animal animal = applicationContext.getBean(Animal.class);
animal.eat();
animal.sleep();
}
}
以上是利用Spring注解开发的技术实现的
- 输出结果:

要求在不改动源码的前提下红线处打印一句话
步骤如下
- 新建通知类(Advice):
public class MyAdvice {
private void pt(){}
public void method(){
System.out.println("饿了");
}
}
- 定义切入点:
@Component //
@Aspect //这两个注解负责告诉Spring这里是用注解实现的AOP
public class MyAdvice {
// 切入点方法(识别输出通知方法的位置)
@Pointcut("execution(void com.symbo1.Animal.eat())")
private void pt(){}
//绑定
@Before("pt()")
public void method(){
System.out.println("动物们了.....");
}
}
- 在SpringConfig当自中配置@EnableAspectJAutoProxy
@Configuration
@ComponentScan("com.symbo1")
@EnableAspectJAutoProxy
public class SpringConfig {
public static class Advice {
public void before(){
System.out.println(".....");
}
}
}
- 输出:

可以看到该功能已经实现
本文介绍了如何在不修改源代码的情况下,利用Spring AOP注解实现方法执行前后的日志打印功能。首先配置了项目的Maven依赖,然后创建了一个Animal接口及其Dog实现类。接着,定义了一个通知类MyAdvice,包含切入点和Before通知,通过@Pointcut和@Before注解指定切入点和前置通知。最后,在SpringConfig中启用AspectJ自动代理,实现了在eat()和sleep()方法调用前后打印指定信息的功能。
617





