spring学习笔记——面向切面编程AOP二

上一篇介绍了一些概念,这篇我们开始进行编写代码。

1、编写切点:

如图所示的切点表达式表示当Instrument的play()方法执行时会触发通知。方法表达式以*号开始,标识了我们不关心方法返回值的类型。然后,我们指定了全限定类名和方法名。对于参数列表,我们使用(..)标识切点选择任意的play()方法,无论该方法的入参是什么。当我们需要配置切点仅匹配com.springinaction.springidol包,可以使用within()指示器来限制匹配。

除此之外,spring 2.5还引入一个新的bean()指示器,该指示器允许我们在切点表达式中使用Bean的ID来标识Bean。bean()使用Bean Id或者Bean名称作为参数来限制切点只匹配特定的Bean:

例1:execution(* com.springinaction.springidol.Instrument.play()) and bean(eddie)

例2:execution(* com.springinaction.springidol.Instrument.play()) and !bean(eddie)

AOP匹配元素 描述
<aop:advisor> 定义AOP通知器
<aop:after> 定义AOP后置通知(不管被通知的方法是否执行成功)
<aop:after-returning> 定义AOP after-returning通知
<aop:after-throwing> 定义after-throwing通知
<aop:after-around> 定义AOP环绕通知
<aop:aspectj-autoproxy> 启用@AspectJ注解驱动的切面
<aop:aspect> 定义切面
<aop:before> 定义AOP前置通知
<aop:config> 顶层的AOP配置元素,大多数的<aop:*>元素必须包含在<aop:config>元素内
<aop:declare-parents> 为被通知的对象引入额外的接口,并透明地实现
<aop:pointcut> 定义切点

样例:

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>spring</groupId>
  <artifactId>study.spring.aop</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>study.spring.aop</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>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.1.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>3.1.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.11</version>
    </dependency>
  </dependencies>
</project>

spring.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">

    <bean id = "audience" class="spring.study.spring.aop.Audience" />
    <bean id = "player" class = "spring.study.spring.aop.Player" />

    <aop:config>
        <aop:aspect ref = "audience">
            <aop:before pointcut = "execution(* spring.study.spring.aop.Player.song(..))" method = "taskSeats" />
            <aop:before pointcut = "execution(* spring.study.spring.aop.Player.song(..))" method = "turnOffCellPhones"/>
            <aop:after-returning pointcut = "execution(* spring.study.spring.aop.Player.song(..))" method = "applaud" />
            <aop:after-throwing pointcut = "execution(* spring.study.spring.aop.Player.song(..))" method = "demandRefund"/>
        </aop:aspect>
    </aop:config>
</beans>

java类:

package spring.study.spring.aop;

public class Audience {

    public void taskSeats(){
        System.out.println("the audience is taking their seats");
    }

    public void turnOffCellPhones(){
        System.out.println("the audience is turning off their cellphones");
    }

    public void applaud(){
        System.out.println("clap clap clap");
    }

    public void demandRefund(){
        System.out.println("boo! we want our money back!");
    }
}
package spring.study.spring.aop;

public class Player {

    public void song(){
        System.out.println("la la la la la la");
    }
}
package spring.study.spring.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Hello world!
 *
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
        Player p = (Player)ctx.getBean("player");
        p.song();
    }
}

执行结果:

the audience is taking their seats
the audience is turning off their cellphones
la la la la la la
clap clap clap

ps:上述的切点每次都定义,太麻烦了,可以先定义一个切点,然后引用这个切点即可

<aop:config>
        <aop:aspect ref = "audience">
            <aop:pointcut expression="execution(* spring.study.spring.aop.Player.song(..))" id="song"/>
            <aop:before method="taskSeats" pointcut-ref="song"/>
            <aop:before method="turnOffCellPhones" pointcut-ref="song"/>
            <aop:after-returning method="applaud" pointcut-ref="song"/>
            <aop:after-throwing method="demandRefund" pointcut-ref="song"/>
        </aop:aspect>
    </aop:config>
时间: 2024-12-17 21:33:01

spring学习笔记——面向切面编程AOP二的相关文章

spring学习笔记——面向切面编程AOP一

1.基本术语: 横切关注点:分布于应用中多处的功能被称为横切关注点,比如日志.安全.事务管理 切面:横切关注点可以被模块化为特殊的类,这些类被称为切面 通知:spring切面可以应用5种类型的通知 a.Before——在方法被调用之前调用通知 b.After——在方法完成之后调用通知,无论方法执行是否成功 c.After-returning——在方法成功执行之后调用通知 d.After-throwing——在方法抛出异常后调用通知 f.Around——通知包裹了被通知的方法,在被通知的方法调用之

spring学习笔记——面向切面编程AOP三

前面介绍了aop的xml的简单配置和使用,下面介绍一下aop的注解使用方式的例子,可以对照第二篇的 pom文件是相同的: spring.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XML

spring学习 八 面向切面编程(AOP)概述

注:本文大部分参考   --------------------- 本文来自 -望远- 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yanquan345/article/details/19760027?utm_source=copy 先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲,Spring是一个库,一个Java库,所以我个人觉得应该这样

Spring(四):面向切面编程AOP

横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通用功能,但是可以通过声明的方式定义这个功能以何种方式在何处应用,而无需修改受影响的类. 横切关注点可以被模块化为特殊的类,这些类被称为切面. 好处: 每个关注点集中于一处,而不是分散到多处代码中 服务模块更加简洁,因为它们只包含主要关注点的代码,次要关注点被转移到切面中了 1.定义AOP术语 1.1.通知(Advice) 切面的工作被称为通知. 通知定义了切面是什么以及何

Spring之面向切面编程AOP(二)

简介 当积累的知识点到一定量的时候,学新知识就变得容易多了.希望再接下来的学习顺利进行下去.今天知识也是挺简单的,主要就是AOP面向切面编程.其中牵涉到了JDKProxy和CGLIB两个代理类,如何使用好,加以深刻理解.学起Spring切面编程也就简单多了 代理模式 1. 代理模式介绍 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对

spring中面向切面编程(AOP)的个人理解

面向切面编程AOP,是spring的一大特点 Aspect切面:封装共性功能的(增强功能的)类 Advice通过:切面类中封装的增强功能的方法. PointCut:切入点,是一个集合的概念,该集合的表达使用一个正则表达式表达 所有核心业务对象的所有方法的前后(事务处理AOP典型的应用) JoinPoint:连接点,程序中需要加入advice的地方,而且正在执行的ponitCut 织入(Weaving):将aspect和核心业务对象,进行整合的过程. 通过特定接口实现AOp Aop通知的类型: B

Web项目中静态代理和动态代理为基础的面向切面编程AOP

本来每天更新的,我一般喜欢夜里过了十二点的时候发文章,结果难道是愚人节吗?学校的网也很有意思,断了,把我给耍了...好吧-开始今天的话题AOP.AOP太重要了,所以放到第二篇文章来谈这个话题,AOP是Spring中的重要概念.如果这个不理解Web开发中的三大框架的原理,那就呵呵了.时常听到同学和网友议论Web程序员大部分时间都是在考皮XML配置,我当时听到也是醉了,所以我要用心学习Web,其实这里面蕴含的设计模式.算法.架构思想在源码中体现的淋漓尽致啊,一个大宝库竟然视而不见可惜了.下面就一起品

面向切面编程——Aop

一.概念 AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的方法论,它是对传统OOP编程的一种补充. 二.Aop原理 1.面向对象编程模型 OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分.面向对象编程是关注将需求功能划分为不同的并且相对独立,封装良好的类,并让它们有着属于自己的行为,依靠继承和多态等

【串线篇】面向切面编程AOP

面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据库 2).AOP做权限验证,filter能做的它都能 3).AOP做安全检查 4).AOP做事务控制 AOP专业术语: 原文地址:https://www.cnblogs.com/yanl55555/p/11744089.html