SpringAOP-QuickStart

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


    }
}

  • 输出:
    在这里插入图片描述

可以看到该功能已经实现

D:\program\jdk17\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:D:\program\Java IDEA 2025.2.5\lib\idea_rt.jar=54619" -Dfile.encoding=UTF-8 -classpath D:\javacode\javaWeb\web_project\springboot-web-quickstart\target\classes;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-starter-webmvc\4.0.0\spring-boot-starter-webmvc-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-starter\4.0.0\spring-boot-starter-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-starter-logging\4.0.0\spring-boot-starter-logging-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\ch\qos\logback\logback-classic\1.5.21\logback-classic-1.5.21.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\ch\qos\logback\logback-core\1.5.21\logback-core-1.5.21.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\apache\logging\log4j\log4j-to-slf4j\2.25.2\log4j-to-slf4j-2.25.2.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\apache\logging\log4j\log4j-api\2.25.2\log4j-api-2.25.2.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\slf4j\jul-to-slf4j\2.0.17\jul-to-slf4j-2.0.17.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-autoconfigure\4.0.0\spring-boot-autoconfigure-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\jakarta\annotation\jakarta.annotation-api\3.0.0\jakarta.annotation-api-3.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\yaml\snakeyaml\2.5\snakeyaml-2.5.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-starter-jackson\4.0.0\spring-boot-starter-jackson-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-jackson\4.0.0\spring-boot-jackson-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\tools\jackson\core\jackson-databind\3.0.2\jackson-databind-3.0.2.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\com\fasterxml\jackson\core\jackson-annotations\2.20\jackson-annotations-2.20.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\tools\jackson\core\jackson-core\3.0.2\jackson-core-3.0.2.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-starter-tomcat\4.0.0\spring-boot-starter-tomcat-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-starter-tomcat-runtime\4.0.0\spring-boot-starter-tomcat-runtime-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\apache\tomcat\embed\tomcat-embed-core\11.0.14\tomcat-embed-core-11.0.14.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\apache\tomcat\embed\tomcat-embed-el\11.0.14\tomcat-embed-el-11.0.14.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\apache\tomcat\embed\tomcat-embed-websocket\11.0.14\tomcat-embed-websocket-11.0.14.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-tomcat\4.0.0\spring-boot-tomcat-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-http-converter\4.0.0\spring-boot-http-converter-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot\4.0.0\spring-boot-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-context\7.0.1\spring-context-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-web\7.0.1\spring-web-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-beans\7.0.1\spring-beans-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\io\micrometer\micrometer-observation\1.16.0\micrometer-observation-1.16.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\io\micrometer\micrometer-commons\1.16.0\micrometer-commons-1.16.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-webmvc\4.0.0\spring-boot-webmvc-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-servlet\4.0.0\spring-boot-servlet-4.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-webmvc\7.0.1\spring-webmvc-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-aop\7.0.1\spring-aop-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-expression\7.0.1\spring-expression-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\slf4j\slf4j-api\2.0.17\slf4j-api-2.0.17.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\spring-core\7.0.1\spring-core-7.0.1.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\commons-logging\commons-logging\1.3.5\commons-logging-1.3.5.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\jspecify\jspecify\1.0.0\jspecify-1.0.0.jar;D:\program\apache-maven-3.9.11-bin\mvn_repo\org\springframework\boot\spring-boot-web-server\4.0.0\spring-boot-web-server-4.0.0.jar com.ghx.SpringbootWebQuickstartApplication . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v4.0.0) 2025-11-26T21:27:58.081+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] c.g.SpringbootWebQuickstartApplication : Starting SpringbootWebQuickstartApplication using Java 17.0.12 with PID 16200 (D:\javacode\javaWeb\web_project\springboot-web-quickstart\target\classes started by 86152 in D:\javacode\javaWeb\web_project) 2025-11-26T21:27:58.085+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] c.g.SpringbootWebQuickstartApplication : No active profile set, falling back to 1 default profile: "default" 2025-11-26T21:27:58.739+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] o.s.boot.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2025-11-26T21:27:58.753+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2025-11-26T21:27:58.753+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/11.0.14] 2025-11-26T21:27:58.791+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] b.w.c.s.WebApplicationContextInitializer : Root WebApplicationContext: initialization completed in 659 ms 2025-11-26T21:27:59.086+08:00 WARN 16200 --- [springboot-web-quickstart] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop' 2025-11-26T21:27:59.095+08:00 INFO 16200 --- [springboot-web-quickstart] [ main] .s.b.a.l.ConditionEvaluationReportLogger : Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2025-11-26T21:27:59.105+08:00 ERROR 16200 --- [springboot-web-quickstart] [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that's listening on port 8080 or configure this application to listen on another port. Process finished with exit code 1
11-27
任务1:根据上课讲授【aop-aspectj】案例完成如下任务: (1) 创建空项目ex4, (2) 在ex4中使用Maven工具创建module: m1-aop, 使用:maven-archetype-quickstart脚本创建。 (3) 在pom.xml文件中引入Spring框架依赖,并同步pom.xml文件导入依赖包。依赖包如下: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.2.7</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>6.2.7</version> </dependency> </dependencies> (4) 在src\main\java下创建业务包com.service,在该包下创建业务接口UserService, (5) 在src\main\java下创建切面包com.aspect,在该包下创建切面类MyAspect (6) 在UserService中定义doSome()方法,创建UserService的子类StudentService,实现doSome()方法,方法内容参考示例代码。 (7) 在MyAspect中创建切面方法myBefore(),方法内容见参考示例。 (8) 给切面方法myBefore()添加@Before注解,编写切入点表示式,要过在doSome方法执行之前执行myBefore()方法。 (9) 在resource目录下编写spring的配置文件before.xml,内容参考示例代码,完成UserService、MyAspect的bean标签。添加<aop:aspectj-autoproxy />,代码参考示例代码。 (10) 编写测试代码,调试上述功能,代码参考Test.java文件。 请给出代码及运行结果截图。
10-03
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值