六、面向切面的spring(2)

这个是承接五的,这部分主要的内容是在XML中声明切面。

一、在XML中声明切面

让我们先看一下spring中的AOP配置元素有哪些:

AOP配置元素 用途
<aop:advisor> 定义AOP通知器
<aop:after> 定义AOP后置通知(不管被通知的方法是否成功)
<aop:after-returning> 定义AOP返回通知
<aop:around> 定义AOP环绕通知
<aop:aspect> 定义一个切面
<aop:aspectj-autoproxy> 启用@AspectJ注解驱动切面
<aop:before> 定义一个
<aop:config> 顶层的AOP配置元素,大多数的
<aop:declare-parents> 以透明的方式为被通知的对象引入额外的接口
<aop:pointcut> 定义一个切点
 1 //声明的Audience类
 2 package concert;
 3 public class Audience {
 4   public void silenceCellPhones(){
 5     System.out.println("Silence cell phones");
 6   }
 7
 8   public void takeSeats(){
 9     System.out.println("Taking seats");
10   }
11
12    public void applause(){
13     System.out.println("CLAP CLAP CLAP!!!");
14   }
15
16    public void demadRefund(){
17     System.out.println("Demanding a refund");
18   }
19 }

1、声明前置和后置通知

通过XML方式将无注解的Audience声明为切面

 1  <aop:config>
 2     //引用audience bean
 3     <aop:aspect ref="audience">
 4       <aop:before
 5        pointcut="execution(** concert.Performance.perform(..))"
 6        method="silenceCellPhone" />
 7
 8       <aop:before
 9        pointcut="execution(** concert.Performance.perform(..))"
10        method="takeSeats" />
11
12       <aop:after-returning
13        pointcut="execution(** concert.Performance.perform(..))"
14        method="applause" />
15
16        <aop:after-throwing
17        pointcut="execution(** concert.Performance.perform(..))"
18        method="demandRefund" />
19    </aop:aspect>
20 </aop:config>
21
22 //使用<aop:pointcut> 定义命名切点
23  <aop:config>
24     //引用audience bean
25     <aop:aspect ref="audience">
26       <aop:point
27         id="performance"
28         expression="execution(** concert.Performance.perform(..))"
29       />
30       <aop:before
31         pointcut="performance"
32         method="silenceCellPhone" />
33
34       <aop:before
35         pointcut="performance"
36        method="takeSeats" />
37
38       <aop:after-returning
39        pointcut="performance"
40        method="applause" />
41
42        <aop:after-throwing
43       pointcut="performance"
44        method="demandRefund" />
45    </aop:aspect>
46 </aop:config>

2、声明环绕通知

 1 package concert;
 2 import org.aspectj.lang.PreceedingJoinPoint;
 3
 4 public class Audience{
 5   public void watchPerformance(PreceedingJoinPoint jp){
 6     try{
 7       System.out.println("Sliencing cell phones");
 8       System.out.println("Taking seats");
 9       jp.proceed();
10       System.out.println("CLAP CLAP CLAP!!!");
11     }catch(Throwable e){
12       System.out.println("Demanding a refund");
13     }
14   }
15 }
16
17 //xml中配置环绕通知
18 <aop:config>
19   <aop:aspect ref="audience">
20     <aop:pointcut id="performance" experssion="execution(** concert.Performance.perform(..))" />
21     <aop:around pointcut-ref="performance" method="watchPerformance" />
22   </aop:aspect>
23 </aop:config>

3、为通知传递参数

//使用参数化的通知来记录磁道播放的次数
package soundsystem;
import java.util.HashMap;
import java.util.Map;

public class TrackCounter {
  private Map<Integer,Integer> trackCounts = new HashMap<Integer,Integer>();

  public void trackPlayed(int trackNumber) {}

  public void countTrack(int trackNumber){
    int currentCount = getPlayCount(trackNumber);
    trackCounts.put(trackNumber, currentCount +1);
  }

  public int getPlayCount(int trackNumber){
    return trackCounts.countainsKey(trackNumber) ? trackCounts.get(trackNumber) : 0;
  }
}

//在XML 中将TrackCounter配置为参数化的切面
<bean id="trackCounter" class="soundsystem.TrackCounter " />
<bean id="cd" class="soundsystem.BlackDisc" >
  <property name="title" value="此时此刻" />
  <property name="artist" value="许巍" />
  <property name="tracks" >
    <list>
      <value>空谷幽兰</value>
      <value>爱情</value>
      <value>此时此刻</value>
      <value>灵岩</value>
      <value>救赎之旅</value>
      <value>心愿</value>
      <value>逍遥行</value>
      <value>喜悦</value>
      <value>世外桃源</value>
      <value>出离</value>
    </list>
  </property>
</bean>

<aop:config>
  <aop:aspect ref="trackCounter">
    <aop:pointcut id="trackPlayed" expression="execution(* soundsystem.CompactDisc.playerTrack(int)) and args(trackNumber)" />
    <aop:before pointcut-ref="trackPlayed" method="countTrack" />
  </aop:aspect>
</aop:config>

注意:我们使用了前面相同的aop命名空间XML元素,它们会将POJO声明为切面。唯一的区别是切点表达式中包含了一个参数,这个参数会传递到通知的方法中。

4、通过切面引入新功能

<aop:aspect>
  <aop:declare-parents types-matching="concert.Performance" implement-interface="concert.Encoreable" default-impl="concert.DefaultEncoreable" />
</aop:aspect>

<aop:declare-parents>声明了此切面所通知的bean要在它的对象层次结构拥有新的父类型。具体到本例中,类型匹配Performance接口(由types-matching属性指定)的那些bean在父类结构中会增加Encoreable接口(由implement-interface属性指定)。

二、注入Aspect切面

当springAOP不能满足需求时,我们必须转向更为强大的AspectJ。这里主要注意的是如何使用spring为AspectJ 切面注入依赖。这里就不写了,我感觉一般也用不到,用到的时候在补充吧。。。

原文地址:https://www.cnblogs.com/ssh-html/p/9747585.html

时间: 2024-11-11 11:21:19

六、面向切面的spring(2)的相关文章

spring(4)面向切面的Spring(AOP)

[0]README 1)本文部分文字描述转自:"Spring In Action(中/英文版)",旨在review  "spring(4)面向切面的Spring(AOP)" 的相关知识: 2)在软件开发中,散布于应用中多处的功能被称为横切关注点.通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑中).把这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题:(干货--引入横切关注点及其所要解决的问题) 3)

【Spring】【笔记】《Spring In Action》第4章 面向切面的Spring

前导: 在软件开发中,分布于应用中多处的功能称为:横切关注点(cross-cutting concerns). 横切关注点从概念上是与应用的业务逻辑相分离的,将横切关注点与业务逻辑相分离是面向切面编程AOP要解决的. 4.1 什么是面向切面编程 横切关注点可以被模块化为特殊的类,这些类被称为切面. 4.1.1 AOP术语 通知 Advice 切面的工作 被称为通知. 通知定义了切面是什么.何时使用. Spring切面可以应用5种类型的通知: Before:在方法被调用之前调用通知 After:在

面向切面的Spring

前言 转眼间,快到夏天了,又让我想起来往年盛夏时,被空调.西瓜.冰淇淋支配的恐惧,南方的天气是真的热,在这种天气下,西瓜.冰淇淋可以没有,但是空调是必不可少的.但是空调的缺点是耗电,而电需要钱(这不废话吗).为了享受凉爽和舒适,我们没有什么办法可以避免这种开销.这是因为每家每户都有一个电表来记录用电量,每个月都会有人来查电表(不是查水表就行),这样电力公司就知道应该收取多少费用了,用户也没办法赖账. 现在想象一下,如果没有电表,也没有人来查看用电量,假设现在由用户来联系电力公司并报告自己的用电量

Spring学习(四)--面向切面的Spring

一.Spring--面向切面 在软件开发中,散布于应用中多处的功能被称为横切关注点(cross- cutting concern).通常来讲,这些横切关注点从概念上是与应用的业 务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑之中).把 这些横切关注点与业务逻辑相分离正是面向切面编程(AOP)所要解决的问题.--什么是面向切面编程 切面能帮助我们模块化横切关注点.简而言之,横切关注 点可以被描述为影响应用多处的功能.例如,安全就是一个横切关注 点,应用中的许多方法都会涉及到安全规则: --如上

&lt;Spring实战&gt;4:面向切面的Spring

1 什么是面向切面编程 1.1 定义 AOP 术语 通知(Advice):切面的工作被称为通知,定义了切面是什么以及何时使用(Before.After.After-returning.After-throwing.Around). 连接点(Joinpoint):是在应用执行过程中能够插入切面的一个点,切面代码可以利用这些点插入到应用的正常流程中并添加新的行为. 切点(Pointcut):切点的定义会匹配通知所要织入的一个或多个连接点. 切面(Aspect):切面是通知和切点的结合. 引入(Int

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

RabbitMQ入门教程(十六):RabbitMQ与Spring集成

原文:RabbitMQ入门教程(十六):RabbitMQ与Spring集成 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78805591 分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 简介 集成示例基本目录结构 一:引入相关依赖 引入Spring核心的依赖和spring-rabbit依赖,注意sprin

二十六:Struts2 和 spring整合

二十六:Struts2 和 spring整合 将项目名称为day29_02_struts2Spring下的scr目录下的Struts.xml文件拷贝到新项目的scr目录下 在新项目的WebRoot---->WEB-INF目录下新建一个目录lib,用于存放jar包(Struts2和spring整合所需jar包) 将项目名称为day29_02_struts2Spring,WebRoot---->WEB-INF下的lib目录下的所有jar包拷贝到新项目对应的位置,同时将spring的配置文件appl

SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-007-定义切面的around advice

一.注解@AspectJ形式 1. package com.springinaction.springidol; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public cl