以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-with-spring.html

为了使用aop命名空间标签,需要导入spring-aop架构,如下所示:

<?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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
"> </beans>

还需要增加而外的jar包用于支持AspectJ:

    <!-- aspectjrt.jar -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency> <!-- aspectjweaver.jar -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>

集成步骤:

1、声明一个aspect(方面)

一个aspect是使用<aop:aspect>元素声明的,并使用ref属性引用bean,如下所示:

<aop:config>
<aop:aspect id="myAspect" ref="aBean">
...
</aop:aspect>
</aop:config> <bean id="aBean" class="...">
...
</bean>

这个“aBean”将被配置和依赖注入就像其他Spring bean一样。

2、声明一个pointcut(切入点)

切入点有助于确定用不同建议执行的关联点(即方法)。在使用基于XML Schema的配置时,切入点将定义如下:

<aop:config>
<aop:aspect id="myAspect" ref="aBean">
  <aop:pointcut id="businessService" expression="execution(* com.xyz.myapp.service.*.*(..))"/>
  ...
</aop:aspect>
</aop:config>
<bean id="aBean" class="...">
  ...
</bean>

以下示例定义了一个名为“businessService”的切入点,该切入点将匹配在com.tutorialspoint包中的Student类中可用的getName()方法:

<aop:config>
<aop:aspect id="myAspect" ref="aBean">
  <aop:pointcut id="businessService" expression="execution(*com.tutorialspoint.Student.getName(..))"/>
  ...
</aop:aspect>
</aop:config> <bean id="aBean" class="...">
...
</bean>

提示:

①类似:“execution(*com.tutorialspoint.Student.getName(..))”这样的语法叫做AspectJ切入点语法,参考:http://www.cnblogs.com/EasonJim/p/6901806.html

②官方文档关于AspectJ的介绍:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-ataspectj

3、声明建议(通知类型)

可以使用<aop:{ADVICE NAME}>五个建议中的任何一个元素在<aop:aspect>内声明,如下所示:

<aop:config>
<aop:aspect id="myAspect" ref="aBean">
<aop:pointcut id="businessService" expression="execution(* com.xyz.myapp.service.*.*(..))"/> <!-- a before advice definition -->
<aop:before pointcut-ref="businessService" method="doRequiredTask"/> <!-- an after advice definition -->
<aop:after pointcut-ref="businessService" method="doRequiredTask"/> <!-- an after-returning advice definition -->
<!--The doRequiredTask method must have parameter named retVal -->
<aop:after-returning pointcut-ref="businessService" returning="retVal" method="doRequiredTask"/> <!-- an after-throwing advice definition -->
<!--The doRequiredTask method must have parameter named ex -->
<aop:after-throwing pointcut-ref="businessService" throwing="ex" method="doRequiredTask"/> <!-- an around advice definition -->
<aop:around pointcut-ref="businessService" method="doRequiredTask"/>

    ...
</aop:aspect>
</aop:config> <bean id="aBean" class="...">
...
</bean>

可以对不同的建议使用相同的doRequiredTask或不同的方法。这些方法将被定义为方面模块的一部分。

至此集成完毕。

基于AOP的XML架构的示例:

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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.jsoft.testspring</groupId>
<artifactId>testaopxml</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>testaopxml</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <!-- Spring Core -->
<!-- http://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.4.RELEASE</version>
</dependency> <!-- Spring Context -->
<!-- http://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.4.RELEASE</version>
</dependency> <!-- String AOP -->
<!-- http://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.1.4.RELEASE</version>
</dependency> <!-- aspectjrt.jar -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency> <!-- aspectjweaver.jar -->
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
</project>

Logging.java:

package com.jsoft.testspring.testaopxml;

public class Logging {

    public void beforeAdvice() {
System.out.println("Going to setup student profile.");
} public void afterAdvice() {
System.out.println("Student profile has been setup.");
} public void afterReturningAdvice(Object retVal) {
System.out.println("Returning:" + retVal.toString());
} public void AfterThrowingAdvice(IllegalArgumentException ex) {
System.out.println("There has been an exception: " + ex.toString());
}
}

Student.java:

package com.jsoft.testspring.testaopxml;

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();
}
}

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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
"> <aop:config>
<aop:aspect id="log" ref="logging">
<aop:pointcut id="selectAll" expression="execution(* com.jsoft..*.*(..))"/>
<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> <bean id="student" class="com.jsoft.testspring.testaopxml.Student">
<property name="name" value="Zara" />
<property name="age" value="11"/>
</bean> <bean id="logging" class="com.jsoft.testspring.testaopxml.Logging"/> </beans>

App.java:

package com.jsoft.testspring.testaopxml;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Student student = (Student) context.getBean("student");
student.getName();
student.getAge();
student.printThrowException();
}
}

测试结果:

测试工程:https://github.com/easonjim/5_java_example/tree/master/springtest/test16/testaopxml

最新文章

  1. python code
  2. Windows Azure Service Bus (3) 队列(Queue) 使用VS2013开发Service Bus Queue
  3. maven 项目配置
  4. [奇葩 bug]视图在 ipad5 上正常显示,在 iPad3上超出了边界
  5. JS-009-屏幕分辨率、浏览器显示区域、元素位置获取
  6. Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
  7. Find the Difference
  8. html5生成柱状图(条形图)
  9. 如何利用C生成.so供Mono调用
  10. 枚举(分类讨论):BZOJ 1177: [Apio2009]Oil
  11. table操作:边框-斑马线-多表头-焦点高亮-自动求和
  12. iOS国际化和genstrings所有子文件夹本地化字符串
  13. PAT (Advanced Level) 1084. Broken Keyboard (20)
  14. V3 微信支付-预支付C#
  15. checkbox对齐-复选框图标
  16. 在统一软件开发过程中使用UML
  17. C#Winfrom数据库读取日期(年月日格式转换)
  18. CSAPP lab2 二进制拆弹 binary bombs phase_4
  19. FastDFSClient工具类 文件上传下载
  20. python的字符串格式化

热门文章

  1. Django请求,响应,ajax以及CSRF问题
  2. TensorFlow中屏蔽warning的方法
  3. uva1610 Party Games
  4. eclipse生成spring boot jar包
  5. table、tr、td表格的行、单元格等属性说明
  6. CPP-基础:inline
  7. python之道02
  8. CF666E Forensic Examination SAM+倍增,线段树和并
  9. Luogu-P1020(导弹拦截)(DP,LIS ,二分优化)
  10. 交互式数据可视化-D3.js(四)形状生成器