Spring AOP整理

示例展示

AOP(Aspect Oriented Programming),是面向切面编程的技术。AOP基于IoC基础,是对OOP的有益补充。
AOP之所以能得到广泛认可,主要是因为它将应用系统拆分分了2个部分:核心业务逻辑及横向的通用逻辑,也就是所谓的切面。例如,所有大中型应用都要涉及到的持久化管理、事务管理、权限管理、日志管理和调试管理等。使用AOP技术,可以让开发人员只专注核心业务,而通用逻辑则使用AOP技术进行横向切入,由专人去处理这些通用逻辑,会使得任务简单明了,提高开发和调试的效率。

下面我们来举个例子(具体代码参见右侧源码,只适合菜鸟看)

示例场景

场景:歌手演唱音乐,演唱之前观众要坐在座位上并且关闭手机,演唱结束后,观众们满意就鼓掌,不满意就抛出不高兴的异常。
分析这个场景,某歌手演唱音乐是核心业务逻辑,而演唱之前和之后观众们的动作都是通用的,属于横向的通用逻辑。

示例原理图

实现步骤

1.首先建立一个歌手接口 Performer。
2.再建立爵士音乐歌手类 DukePerformer 来实现这个接口,类中包括了歌手的个人信息。
3.然后定义观众类 Audience,包含观众的行为通知。
4.完成之后,我们便可以在配置文件 applicationContext.xml 中进行aop切面配置。关键代码如下:

<aop:config>
	<!-- 定义切入点 -->
	<aop:pointcut id="sing" expression="execution(* *.perform(..))"/>
	<!-- 定义切面 -->
	<aop:aspect ref="audience">
		<!-- 前置通知 -->
		<aop:before method="takeSeat" pointcut-ref="sing" />
		<aop:before method="turnOffPhone" pointcut-ref="sing" />
		<!-- 返回后通知 -->
		<aop:after-returning method="applaud" pointcut-ref="sing" />
		<!-- 抛出后通知 -->
		<aop:after-throwing method="unHappy" pointcut-ref="sing" />
	</aop:aspect>
</aop:config>

5.编写测试类代码,获得Spring中定义的Bean对象,执行perform表演方法,查看后台是如何运行的。
正常情况下,控制台会打印如下的信息:

观众坐在座位上。
观众关闭手机。
duke 开始演唱歌曲。
观众鼓掌,掌声经久不息...

知识准备

什么是AOP?
AOP: (Aspect Oriented Programming) 面向切面编程。是目前软件开发中的一个热点,也是Spring框架中容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。

什么是OOP?AOP与其有什么区别?
AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
通俗来讲,OOP面向名词领域,AOP面向动词领域。

如何理解AOP?
举个简单例子,比如你想在每次写字之前都检查一下笔里有没有墨水了,通常的做法是:在写字这个Action里调用判断是否有墨水的方法。这样做的不好一个方面是,写字的Action和是否有墨水的方法产生了依赖,如果你有十几支不同的笔写字,每一个笔的Action里都要调用判断是否有墨水的方法;另一个方面是:就面向对象的程序设计来说,写字和判断是否有墨水的方法是同一等级的,如果你让写字这个动作来判断是否有墨水不够人性化,有违面向对象的程序设计的思想。
如果用Spring的AOP,是把写字的Action作为一个切面,在每次调用不同的笔来写字的方法之前,调用判断是否有墨水的方法。它是由<aop:config/>标签在Spring配置文件里定义的。

资源准备

1:jar包下载地址:spring jar包
2.详细学习参考spring参考手册spring参考手册

示例

AOP的实现可以使用注解和xml配置文件两种方式,这里使用xml配置文件方式。示例的过程见左侧的“示例展示”,下面是源码:
首先建立一个接口Performer类

1 package demoinfo.spring.aop;
2
3 public interface Performer {
4     //表演歌曲
5     public void perform();
6 }

再建立一个接口实现类DukePerformer

 1 package demoinfo.spring.aop;
 2
 3 public class DukePerformer implements  Performer{
 4     private String name;
 5     public void setName(String name)  {
 6         this.name=name;
 7     }
 8     public String getName()  {
 9         return this.name;
10     }
11     public void perform() {
12         System.out.println(this.name+" 开始演唱歌曲。");
13     }
14 } 

Audience观众业务类

 1 package demoinfo.spring.aop;
 2
 3 public class Audience {
 4     public void takeSeat()  {
 5         System.out.println("观众坐在座位上。");
 6     }
 7     public void turnOffPhone()   {
 8         System.out.println("观众关闭手机。");
 9     }
10     public void applaud()  {
11         System.out.println("观众鼓掌,掌声经久不息...");
12     }
13     public void unHappy()  {
14         System.out.println("观众不高兴.");
15     }
16 }  

配置文件applicationContext.xml代码如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
 6            http://www.springframework.org/schema/aop
 7            http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
 8     <!-- AOP学习时的配置 -->
 9     <bean id="DukePerformer" class="demoinfo.spring.aop.DukePerformer">
10         <property name="name" value="duke" />
11     </bean>
12     <bean id="audience" class="demoinfo.spring.aop.Audience" />
13
14     <aop:config>
15         <!-- 定义切入点 -->
16         <aop:pointcut id="sing" expression="execution(* *.perform(..))"/>
17         <!-- 定义切面 -->
18         <aop:aspect ref="audience">
19             <!-- 前置通知 -->
20             <aop:before method="takeSeat" pointcut-ref="sing" />
21             <aop:before method="turnOffPhone" pointcut-ref="sing" />
22             <!-- 返回后通知 -->
23             <aop:after-returning method="applaud" pointcut-ref="sing" />
24             <!-- 抛出后通知 -->
25             <aop:after-throwing method="unHappy" pointcut-ref="sing" />
26         </aop:aspect>
27     </aop:config>
28     <!-- AOP学习时的配置 -->
29 </beans>

最后测试类代码如下:

 1 package demoinfo.spring.aop;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.FileSystemXmlApplicationContext;
 5
 6 public class SpringDemo {
 7     public static void main(String[] args) {
 8         //获得Spring中定义的Bean实例(对象)
 9         ApplicationContext ctx=new FileSystemXmlApplicationContext(
10                 "classpath:demoinfo/spring/aop/applicationContext.xml");
11         Performer per=(Performer)ctx.getBean("DukePerformer");
12         per.perform();
13     }
14 }  

时间: 2024-10-10 10:52:41

Spring AOP整理的相关文章

spring aop 整理

aop常见概念 1.切面 事务.日志.安全性框架.权限等都是切面(就是类,事务有事务类,日志有日志类,权限有权限类) 2.通知 切面中的方法就是通知(类中针对目标方法所要插入的方法,即事务类中执行事务的方法,日志类中执行日志操作的方法) 3.目标类 (你想要侵入修改的方法所在的类,诸如我们想在查询存款时加入一些其他操作,存款管理类就是目标类) 4.切入点 只有符合切入点,才能让通知和目标方法结合在一起 (就是你想要加强的方法,就是查看工资的方法showSalary()) 5.织入: 形成代理对象

Spring AOP 整理(1)

这篇文章受到了以下作者的帮助,非常感谢! http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html ---> 在不修改原有代码情况下,在目标方法执行期间,插入需要的代码(增加的业务代码)的方法:静态代理模式.JDK1.5后动态代理.Cglib 子类继承覆盖增强三种,分析了三种方法优劣,代码层次上理解AOP有很大的帮助. Tip:如果bean实现了接口,Sping调用动态代理:否则用Cglib的方式实现(Spring出于自身需要

Spring AOP使用整理:各种通知类型的介绍

2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void info() { System.out.println("\t我叫&qu

Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

原创整理不易,转载请注明出处:Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解 代码下载地址:http://www.zuidaima.com/share/1772661373422592.htm 本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifi

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

利用反射手写代码实现spring AOP

前言:上一篇博客自己动手编写spring IOC源码受到了大家的热情关注,在这里博客十分感谢.特别是给博主留言建议的@玛丽的竹子等等.本篇博客我们继续,还是在原有的基础上进行改造.下面请先欣赏一下博主画的一张aop简图(没有艺术天分,画的不好莫见怪) 解析:往往在我们的系统的多个核心流程中会有一部分与之关系不大的相同的横切流程,例如权限认证,事务管理.因此我们一般会抽象出这些相同的比较次要的交给spring aop的Handler来统一处理这些横切流程也就是上图中绿色部分.接下来我们看一下本例结

spring AOP + 自定义注解实现权限控制小例子

今天看了一下黑马程序员的视频,上面讲到一个使用spring AOP + 自定义注解的方式来实现权限控制的一个小例子,个人觉得还是可以借鉴,整理出来与大家分享. 需求:service层有一些方法,这些方法需要不同的权限才能访问. 实现方案:自定义一个PrivilegeInfo的注解,使用这个注解为service层中的方法进行权限配置,在aop中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标方法,没有则给出提示. 关键技术:自定义注解及注解解析,spring

Spring AOP四种实现方式Demo详解与相关知识探究

一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~. 我亲手实现了一遍,重新整理,加上了一些不易关注到的细节.漏掉的知识,以及自己对AOP的一些理解,写成这篇博客. 二.AOP相关概念 (1)AOP是什么?AOP与拦截器的区别? 太抽象的不说,如果你知道Struts2的拦截器,拦截器就是应用的AOP的思想,它用于拦截Action以进行一些预处理或结果处理.而

[Spring框架]Spring AOP基础入门总结一.

前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务