Spring AOP 基于XML的应用程序 Spring AOP实现 Spring AOP 基于XML的PointCut方法 在本章中,我们将使用Spring AOP Framework编写实际的AOP应用程序。在开始使用Spring-WS框架编写第一个示例之前,必须确保已按照Spring 环境搭建一章中的说明正确设置Spring AOP环境。 现在,继续编写一个简单的控制台Spring AOP应用程序,它将演示AOP概念。 创建一个项目 步骤1 - 打开命令控制台,转到C:\ MVN目录并执行以下 mvn 命令。 C:\MVN>mvn archetype:generate -DgroupId = com.codingdict -DartifactId = Student -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false Maven将开始处理并将创建完整的Java应用程序项目结构。 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom -- - [INFO] Generating project in Batch mode Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar (5 KB at 1.1 KB/s ec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/ma ven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/mav en-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom (703 B at 1.2 KB/ sec) [INFO] ------------------------------------------------------------------------- --- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] ------------------------------------------------------------------------- --- [INFO] Parameter: groupId, Value: com.codingdict [INFO] Parameter: packageName, Value: com.codingdict [INFO] Parameter: package, Value: com.codingdict [INFO] Parameter: artifactId, Value: Student [INFO] Parameter: basedir, Value: C:\MVN [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: C:\MVN\Student [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:17 min [INFO] Finished at: 2017-02-19T21:11:14+05:30 [INFO] Final Memory: 15M/114M [INFO] ------------------------------------------------------------------------ 第2步 - 转到C:/ MVN目录。 您将看到一个名为student的Java应用程序项目(在artifactId中指定)。更新POM.xml以包含Spring- AOP依赖项。添加MainApp.java,Student.java和Logging.java文件。 的pom.xml <project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.codingdict</groupId> <artifactId>Student</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>Student</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.1.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency> </dependencies> </project> package com.codingdict; public class Logging { /** * This is the method which I would like to execute * before a selected method execution. */ public void beforeAdvice() { System.out.println("Going to setup student profile."); } /** * This is the method which I would like to execute * after a selected method execution. */ public void afterAdvice() { System.out.println("Student profile has been setup."); } /** * This is the method which I would like to execute * when any method returns. */ public void afterReturningAdvice(Object retVal){ System.out.println("Returning:" + retVal.toString() ); } /** * This is the method which I would like to execute * if there is an exception raised. */ public void AfterThrowingAdvice(IllegalArgumentException ex) { System.out.println("There has been an exception: " + ex.toString()); } } 以下是 Student.java 文件的内容。 package com.codingdict; public class Student { private Integer age; private String name; public void setAge(Integer age) { this.age = age; } public Integer getAge() { System.out.println("Age : " + age ); return age; } public void setName(String name) { this.name = name; } public String getName() { System.out.println("Name : " + name ); return name; } public void printThrowException(){ System.out.println("Exception raised"); throw new IllegalArgumentException(); } } 以下是 MainApp.java 文件的内容。 package com.codingdict; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getName(); student.getAge(); student.printThrowException(); } } 步骤3 - 在 src > main> resources 文件夹下添加配置文件 Beans.xml 。 <? xml version = "1.0" encoding = "UTF-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> <aop:config> <aop:aspect id = "log" ref = "logging"> <aop:PointCut id = "selectAll" expression = "execution(* com.codingdict.*.*(..))"/> <aop:before PointCut-ref = "selectAll" method = "beforeAdvice"/> <aop:after PointCut-ref = "selectAll" method = "afterAdvice"/> <aop:after-returning PointCut-ref = "selectAll" returning = "retVal" method = "afterReturningAdvice"/> <aop:after-throwing PointCut-ref = "selectAll" throwing = "ex" method = "AfterThrowingAdvice"/> </aop:aspect> </aop:config> <!-- Definition for student bean --> <bean id = "student" class = "com.codingdict.Student"> <property name = "name" value = "Zara" /> <property name = "age" value = "11"/> </bean> <!-- Definition for logging aspect --> <bean id = "logging" class = "com.codingdict.Logging"/> </beans> 步骤4 - 打开命令控制台,转到C:\MVN目录并执行以下 mvn 命令。 C:\MVN>Student> mvn package Maven将开始处理和下载所需的库。 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Student 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven -jar-plugin/2.4/maven-jar-plugin-2.4.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven- jar-plugin/2.4/maven-jar-plugin-2.4.pom (6 KB at 2.2 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven -jar-plugin/2.4/maven-jar-plugin-2.4.jar Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven- jar-plugin/2.4/maven-jar-plugin-2.4.jar (34 KB at 31.6 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop /4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/ 4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.pom (3 KB at 3.7 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.pom (3 KB at 4.1 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core /4.1.0.RELEASE/spring-core-4.1.0.RELEASE.pom (3 KB at 4.0 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-aop /4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-cor e/4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar Downloading: https://repo.maven.apache.org/maven2/org/springframework/spring-bea ns/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-aop/ 4.1.0.RELEASE/spring-aop-4.1.0.RELEASE.jar (351 KB at 43.9 KB/sec) Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-bean s/4.1.0.RELEASE/spring-beans-4.1.0.RELEASE.jar (685 KB at 37.5 KB/sec) Downloaded: https://repo.maven.apache.org/maven2/org/springframework/spring-core /4.1.0.RELEASE/spring-core-4.1.0.RELEASE.jar (982 KB at 47.1 KB/sec) [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Student -- - [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\Student\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ Student --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b uild is platform dependent! [INFO] Compiling 1 source file to C:\MVN\Student\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ St udent --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\Student\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ Student --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b uild is platform dependent! [INFO] Compiling 1 source file to C:\MVN\Student\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ Student --- [INFO] Surefire report directory: C:\MVN\Student\target\surefire-reports Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure fire-junit3/2.12.4/surefire-junit3-2.12.4.pom Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref ire-junit3/2.12.4/surefire-junit3-2.12.4.pom (2 KB at 1.3 KB/sec) Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/sure fire-junit3/2.12.4/surefire-junit3-2.12.4.jar Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/surefire/suref ire-junit3/2.12.4/surefire-junit3-2.12.4.jar (26 KB at 27.7 KB/sec) ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.codingdict.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ Student --- Downloading: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-al pha-2/classworlds-1.1-alpha-2.jar Downloaded: https://repo.maven.apache.org/maven2/classworlds/classworlds/1.1-alp ha-2/classworlds-1.1-alpha-2.jar (37 KB at 35.8 KB/sec) [INFO] Building jar: C:\MVN\Student\target\Student-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 38.441 s [INFO] Finished at: 2017-02-19T21:18:59+05:30 [INFO] Final Memory: 18M/109M [INFO] ------------------------------------------------------------------------ 在Eclipse中导入项目 第1步 - 打开Eclipse。 步骤2 - 选择 文件→导入→ 选项。 第3步 - 选择Maven项目选项。 单击“下一步”按钮。 第4步 - 选择项目位置,其中学生项目是使用Maven创建的。 第5步 - 单击“完成”按钮。 运行项目 完成源和配置文件的创建后,运行您的应用程序。右键单击应用程序中的MainApp.java,并使用 run as Java Application 命令。如果您的应用程序一切正常,它将打印以下消息。 Going to setup student profile. Name : Zara Student profile has been setup. Returning:Zara Going to setup student profile. Age : 11 Student profile has been setup. Returning:11 Going to setup student profile. Exception raised Student profile has been setup. There has been an exception: java.lang.IllegalArgumentException Exception in thread "main" java.lang.IllegalArgumentException at com.codingdict.Student.printThrowException(Student.java:25) at com.codingdict.Student$$FastClassBySpringCGLIB$$7dc55815.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:43) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) at com.codingdict.Student$$EnhancerBySpringCGLIB$$56a970f2.printThrowException(<generated>) at com.codingdict.MainApp.main(MainApp.java:16) Spring AOP实现 Spring AOP 基于XML的PointCut方法