示例展示

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类

 package demoinfo.spring.aop;

 public interface Performer {
//表演歌曲
public void perform();
}

再建立一个接口实现类DukePerformer

 package demoinfo.spring.aop;

 public class DukePerformer implements  Performer{
private String name;
public void setName(String name) {
this.name=name;
}
public String getName() {
return this.name;
}
public void perform() {
System.out.println(this.name+" 开始演唱歌曲。");
}
}
Audience观众业务类
 package demoinfo.spring.aop;

 public class Audience {
public void takeSeat() {
System.out.println("观众坐在座位上。");
}
public void turnOffPhone() {
System.out.println("观众关闭手机。");
}
public void applaud() {
System.out.println("观众鼓掌,掌声经久不息...");
}
public void unHappy() {
System.out.println("观众不高兴.");
}
}

配置文件applicationContext.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-2.0.xsd">
<!-- AOP学习时的配置 -->
<bean id="DukePerformer" class="demoinfo.spring.aop.DukePerformer">
<property name="name" value="duke" />
</bean>
<bean id="audience" class="demoinfo.spring.aop.Audience" /> <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>
<!-- AOP学习时的配置 -->
</beans>

最后测试类代码如下:

 package demoinfo.spring.aop;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext; public class SpringDemo {
public static void main(String[] args) {
//获得Spring中定义的Bean实例(对象)
ApplicationContext ctx=new FileSystemXmlApplicationContext(
"classpath:demoinfo/spring/aop/applicationContext.xml");
Performer per=(Performer)ctx.getBean("DukePerformer");
per.perform();
}
}

Spring AOP整理的更多相关文章

  1. Spring AOP 整理笔记

    一.AOP概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 利用AOP可以对业务逻辑的各 ...

  2. Spring AOP 整理

    在 xml中加 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.o ...

  3. AOP面试知识整理,^_^-包括spring Aop

    讲到java企业级开发框架,就不可避免的讲到 IOC,AOP,MCV 今天面试时被问到AOP,讲的很乱,这里整理笔记,包括AOP,spring-AOP的部分知识,错误的地方请小伙伴指出来. 谈谈你对A ...

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

    2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; p ...

  5. Spring AOP 知识整理

    通过一个多月的 Spring AOP 的学习,掌握了 Spring AOP 的基本概念.AOP 是面向切面的编程(Aspect-Oriented Programming),是基于 OOP(面向对象的编 ...

  6. 用心整理 | Spring AOP 干货文章,图文并茂,附带 AOP 示例 ~

    Spring AOP 是 Java 面试的必考点,我们需要了解 AOP 的基本概念及原理.那么 Spring AOP 到底是啥,为什么面试官这么喜欢问它呢?本文先介绍 AOP 的基本概念,然后根据 A ...

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

    前言:上一篇博客自己动手编写spring IOC源码受到了大家的热情关注,在这里博客十分感谢.特别是给博主留言建议的@玛丽的竹子等等.本篇博客我们继续,还是在原有的基础上进行改造.下面请先欣赏一下博主 ...

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

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  9. 【Spring】Spring AOP实现原理

    Spring AOP实现原理 在之前的一文中介绍过Spring AOP的功能使用,但是没有深究AOP的实现原理,今天正好看到几篇好文,于是就自己整理了一下AOP实现的几种方式,同时把代理模式相关知识也 ...

随机推荐

  1. boost.asio源码剖析(五) ---- 泛型与面向对象的完美结合

    有人说C++是带类的C:有人说C++是面向对象编程语言:有人说C++是面向过程与面向对象结合的语言.类似的评论网上有很多,虽然正确,却片面,是断章取义之言. C++是实践的产物,C++并没有为了成为某 ...

  2. Linux开机执行顺序

      1. 加载 BIOS 的硬件信息,并取得第一个开机装置的代号: 2. 读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub 等等) 的开机信息: 3. 加载 K ...

  3. objective-c中使用cocoa的NSPredicate,谓词(十四)

    holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details ...

  4. 分享10款常用的jQuery焦点图插件

    爱编程一直在收集整理编程相关的知识和解决方案,今天小编为大家带来10款非常常用的jquery焦点图插件. 1.jQuery可自动播放动画的焦点图插件 之前我们已经分享过很多非常实用的jQuery焦点图 ...

  5. Joy of Programming: Understanding Bit-fields in C

    转:http://www.linuxforu.com/2012/01/joy-of-programming-understanding-bit-fields-c/ By S.G. Ganesh on ...

  6. chrome打不开12306

    chrome打不开12306怎么办?chrome怎么会打不开12306? chrome打不开12306: 1.没有安装12306网站的根证书. 2.打开https://dynamic.12306.cn ...

  7. JQuery实现回车代替Tab键(按回车跳到下一栏)

    一个提交按钮以后,用户如果按了键盘的回车键,默认情况下,就会提交这个表单了.这样对于用户输入各个表单项目,用户体验很不好,输入完一个项目,或者用鼠标选择下一个项目,或者用键盘的Tab键选中下一个项目. ...

  8. [转]SVN:This client is too old to work with working copy 的解决方案

    前一段时间,我在Eclipse碰到一个SVN错误,出现的原因是我的Eclipse的SVN插件是1.6,服务器的SVN版本是1.5.4,然后我在工程目录下做了一次提交操作(不是Eclipse里),到最后 ...

  9. [Java] 内部类总结

    内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权 ...

  10. property在括号中应该怎样写

    property 属性的定义,类似于get set assign: 简单的赋值,不更改索引计数 使用assign是针对基础的数据类型,比如NSinterger,CGFloat和c数据类型(int fl ...