AOP为Aspect Oriented Programming的缩写,意为:面向切面编程

一 前期工作

1.新建一个java项目,我是使用的maven,所以我新建了一个简单的maven项目,因为maven项目可以省去到处找jar包的时间,还是比较方便的

2.引入需要的jar包,我的pom文件中的dependency为

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.16.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.16.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.16.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.2.11.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.2.1.RELEASE</version>
</dependency> <dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.1</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
<version>3.1.4.RELEASE</version>
</dependency> <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>

3.新建java文件

①接口,新建一个HelloService的接口

②实现类,新建一个HelloServiceImpl的类,实现上面的接口

③切面,新建一个HelloAspect的类,在aop中就叫做前面

④测试类,新建一个AopTest的测试类

4.在src/java/resource文件夹下面建立一个aopContext.xml的xml文件,schema为

<?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">

5.将bean资源引入xml

 <bean id="hello" class="com.qiao.aop.HelloServiceImpl"/>
<bean id="aspect" class="com.qiao.aop.HelloAspect" />

二 aop测试开始

1.前置通知

HelloService:  public void beforeSay(String param);

HelloServiceImpl: public void beforeSay(String
param) {

System.out.println(" beforeSay method  param="+param);

}

HelloAspect: public void beforeSayAspect(String
para){

System.out.println(" aspect before param = "+para);

}

aopTest : @Test

public void beforeAspectTest(){

ApplicationContext app = new ClassPathXmlApplicationContext("aopContext.xml");



HelloService hello = (HelloService) app.getBean("hello",HelloService.class);



hello.beforeSay("hello");

}

在xml文件中配置

    <aop:config>
<span style="white-space:pre"> </span> <aop:pointcut expression="<span style="font-family: Arial, Helvetica, sans-serif;">execution(* com.qiao.aop.*.*(..)) and args(param)</span>" id="pointcut"/>
<span style="white-space:pre"> </span> <aop:aspect ref="aspect">
<aop:before pointcut-ref="pointcut" method="beforeSayAspect(java.lang.String)" arg-names="param"/>
<span style="white-space:pre"> </span></aop:aspect>
</aop:config>

(<aop:pointcut> 是定义切入点表达式,execution是切入点表达式,第一个*表示任意返回类型,第二个* 表示com.qiao.aop下面的所有的类,第三个*表示类下的所有方法,括号中的“..”表示方法中的任意参数

<aop:aspect> ref指向的是切面,在xml文件中配置的切面的id

<aop:before> 表示这个是前置通知,pointcut-ref指向的是上面pointcut的id,就是使用其中的表达式,也可以在pointcut中直接赋值,即pointcut="execution(* com.qiao.aop.*.*(..)) and args(param)"  在本身直接定义切入点表达式,注意,pointcut和pointcut-ref只能使用一个,两个都使用就会报错。

注意:在aop:pointcut中的args的参数名必须和aop:before中的arg-names的中的参数必须一样,这样,调用切入点是的时候,才会将切入点方法里面的参数传入通知方法中。即。

运行aoptest中的beforeAspectTest,最后输出

在这里面,HelloAspect就是切面,HelloAspect中的方法beforeSayAspect就是通知,HelloService中的方法beforeSay就是切入点。

2.后置返回通知

HelloService:public boolean afterSayReturning();

HelloServiceImpl : public boolean afterSayReturning() {



System.out.println("after return");



return true;

}

HelloAspect:public void afterAspectReturning(Object val){

System.out.println(" after aspect returning val = "+val);

}

AopTest : @Test

public void afterReturningAspectTest(){

ApplicationContext app = new ClassPathXmlApplicationContext("aopContext.xml");



HelloService hello = (HelloService) app.getBean("hello",HelloService.class);

hello.afterSayReturning();

}

xml

		<aop:config>
<span style="white-space:pre"> </span><aop:pointcut expression="execution(* com.qiao.aop.*.*(..))" id="pointcut"/>
<span style="white-space:pre"> </span><aop:aspect ref="aspect">
<aop:after-returning pointcut-ref="pointcut" method="afterAspectReturning" arg-names="val" returning="val"/>
<span style="white-space:pre"> </span> </aop:aspect>
<span style="white-space:pre"> </span> </aop:config>

最后输出

这个我估计实在切入点方法执行之后,将返回值放在后置方法中,然后输出。个人猜测啊。

3.后置异常通知

HelloService
:  public void afterException();

HelloServiceImpl
:   public void afterException() {

System.out.println("after excetion");

throw new RuntimeException();

}

HelloAspect :  public void afterExceptionAspect(Exception e){

System.out.println(" after Exception and e is "+e);

}

AopTest : @Test

public void afterExceptionAspectTest(){

ApplicationContext app = new ClassPathXmlApplicationContext("aopContext.xml");



HelloService hello = (HelloService) app.getBean("hello",HelloService.class);



hello.afterException();

}

xml :

	<aop:config>
<aop:pointcut expression="execution(* com.qiao.aop.*.*(..))" id="pointcut"/>
<span style="white-space:pre"> </span> <aop:aspect ref="aspect">
<aop:after-throwing pointcut-ref="pointcut" method="afterExceptionAspect" arg-names="e" throwing="e"/>
</aop:aspect>
</aop:config>

结果: 

(这个应该是吧通知放到了catch里面)

4.后置最终通知:在切入点选择的方法返回时执行,不管是正常返回还是抛出异常都执行

HelloService
: public void afterFinally();

HelloServiceImpl
: public void afterFinally() {

System.out.println("after finally ");

throw new RuntimeException();

}

HelloAspect : public void afterFinallyAspect(){

System.out.println("after fianlly aspect");

}

AopTest  :  @Test

public void afterFinallyAspectTest(){

ApplicationContext app = new ClassPathXmlApplicationContext("aopContext.xml");



HelloService hello = (HelloService) app.getBean("hello",HelloService.class);



hello.afterFinally();

}

xml :

		<aop:config>
<aop:pointcut expression="execution(* com.qiao.aop.*.*(..))" id="pointcut"/>
<aop:aspect ref="aspect">
<aop:after pointcut-ref="pointcut" method="afterFinallyAspect" />
</aop:aspect>
</aop:config>

(这个难道是放在try catch中的finally里面执行的?)

5.环绕通知:环绕着在切入点选择的连接点处的方法所执行的通知,环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值

HelloService:   public
void sayAround(String param);

HelloServiceImpl : public
void sayAround(String param) {



System.out.println(" around  "+param);



}

HelloAspect : 

public Object aroundAspect(ProceedingJoinPoint pjp) throws Throwable{

System.out.println(" around before ");



Object val = pjp.proceed(new Object[]{"replace"});



System.out.println(" around after ");



return val;

}

AopTest  :   @Test

public void aroundAspectTest(){

ApplicationContext app = new ClassPathXmlApplicationContext("aopContext.xml");



HelloService hello = (HelloService) app.getBean("hello",HelloService.class);



hello.sayAround("haha");

}

xml :

		<aop:config>
<aop:pointcut expression="execution(* com.qiao.aop.*.*(..))" id="pointcut"/>
<aop:aspect ref="aspect">
<aop:around method="aroundAspect" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>

最后输出:

以上只是个人观点,不一定,正确。

最后推荐大神的博客 : http://www.iteye.com/blogs/subjects/spring3?page=2 ,最近在学习大神的博客,可以看看

spring的aop 基于schema的更多相关文章

  1. spring aop 基于schema的aop

    AOP的基本概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP ...

  2. 第三章 AOP 基于Schema的AOP

    基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已. 3.7.1一般增强的使用 a.目标类 public class Target { public void ...

  3. Spring的AOP基于AspectJ的注解方式开发3

    上上偏博客介绍了@Aspect,@Before 上篇博客介绍了spring的AOP开发的注解通知类型:@Before,@AfterThrowing,@After,@AfterReturning,@Ar ...

  4. Spring 使用AOP——基于注解配置

    首先,使用注解实现AOP是基于AspectJ方式的. 创建包含切点方法的类 package cn.ganlixin.test; import org.aspectj.lang.annotation.P ...

  5. Spring的AOP基于AspectJ的注解方式开发2

    参考自黑马培训机构 上一篇博客提到了在配置文件中开启aop的注解开发,以及简单使用了@Before,@Aspect 这是为了告诉spring为前置通知和切面类 接下来介绍aop的注解的通知类型,和切入 ...

  6. Spring的AOP基于AspectJ的注解方式开发1

    参考自黑马培训机构 创建项目,引入jar包 编写目标类,切面类并完成配置 package spring.day2_aop2; /* * 编写目标类 */ public class OrderDao { ...

  7. 开涛spring3(6.3) - AOP 之 6.3 基于Schema的AOP

    6.3  基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...

  8. spring3: 基于Schema的AOP

    6.3  基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...

  9. 基于Schema的AOP 配置使用详解

    原文地址:http://jinnianshilongnian.iteye.com/blog/1418598 基于Schema的AOP从Spring2.0之后通过"aop"命名空间来 ...

随机推荐

  1. ArchLinux 下 VirtualBox 增强设置

    0.前言: 其实这个标题本来不是我的本意,因为我的ArchLinux开机启动报错了!. 原本是一个服务报错,解决就行了对不对.后来我各种搜索大法发现了一个常识错误. 1.报错: 2.过程(赶时间的朋友 ...

  2. 网络CCNA基础了解

    关于网络 CCNA.CCNP.CCIE 中的 CCNA 一.逻辑与.或.非 AND --> "与"计算 1 AND 1 = 1(取严) 1 AND 0 = 0 0 AND 1 ...

  3. 浅谈Ionic2

    http://www.cnblogs.com/zhouming-web/p/6226323.html 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScrip ...

  4. Django 学习资源

    相关的分享: 开发者头条:http://toutiao.io/search?utf8=%E2%9C%93&q=django 极客头条及Django资讯:http://www.csdn.net/ ...

  5. 2016级算法第四次上机-C.AlvinZH的1021实验

    975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...

  6. Echo团队Alpha冲刺随笔 - 第七天

    项目冲刺情况 进展 服务器部署完成.小程序改了几个BUG,WEB端大部分完成,后端主体功能大致完成. 问题 交接的时候出现很多新问题 心得 软工实践真棒!yeah!!! 今日会议内容 黄少勇 今日进展 ...

  7. 接口自动化 之 unittest+ddt+openpyxl 综合

    前面写过python 之 unittest初探 和 python 之 unittest+ddt 两篇文章.在之前的文章中,写过可以再次优化.今天写第三篇的目的,就是在原有基础上,基于 openpyxl ...

  8. 基础篇:4.1)规范化:3d工程图纸出图步骤详解

    本章目的:按照工程图出图步骤,更方便出具规范的工程图. 1.工程出图步骤 这是作者个人归纳的步骤,供同行业工程师参考完善. 以solidworks为例,工程出图步骤如下:1.1)打开绘制的3d零件图, ...

  9. 数组去重 && 快速排序 && 数组中重复元素最多的 && 深拷贝

    var arr0 = [1,3,3,3,4,4,4,4,5,5]; var arr1 = [10,9,2,5,7,34,65,48,90,103]; var newArr=[]; /* for(var ...

  10. 在win7系统设置SQL Server2014 express为远程数据

    如何设置远程访问到SQLserver服务器(局域网内的设置) 1.首先,使用Windows+R键 输入services.msc 打开本地服务. *说明:①MSSQLSERVER是正式使用的SQL创建实 ...