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类
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+" 开始演唱歌曲。");
}
}
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整理的更多相关文章
- Spring AOP 整理笔记
一.AOP概念 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 利用AOP可以对业务逻辑的各 ...
- Spring AOP 整理
在 xml中加 xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.o ...
- AOP面试知识整理,^_^-包括spring Aop
讲到java企业级开发框架,就不可避免的讲到 IOC,AOP,MCV 今天面试时被问到AOP,讲的很乱,这里整理笔记,包括AOP,spring-AOP的部分知识,错误的地方请小伙伴指出来. 谈谈你对A ...
- Spring AOP使用整理:各种通知类型的介绍
2.PersonImpl类的源码 public class PersonImpl implements Person { private String name; private int age; p ...
- Spring AOP 知识整理
通过一个多月的 Spring AOP 的学习,掌握了 Spring AOP 的基本概念.AOP 是面向切面的编程(Aspect-Oriented Programming),是基于 OOP(面向对象的编 ...
- 用心整理 | Spring AOP 干货文章,图文并茂,附带 AOP 示例 ~
Spring AOP 是 Java 面试的必考点,我们需要了解 AOP 的基本概念及原理.那么 Spring AOP 到底是啥,为什么面试官这么喜欢问它呢?本文先介绍 AOP 的基本概念,然后根据 A ...
- 利用反射手写代码实现spring AOP
前言:上一篇博客自己动手编写spring IOC源码受到了大家的热情关注,在这里博客十分感谢.特别是给博主留言建议的@玛丽的竹子等等.本篇博客我们继续,还是在原有的基础上进行改造.下面请先欣赏一下博主 ...
- [Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
- 【Spring】Spring AOP实现原理
Spring AOP实现原理 在之前的一文中介绍过Spring AOP的功能使用,但是没有深究AOP的实现原理,今天正好看到几篇好文,于是就自己整理了一下AOP实现的几种方式,同时把代理模式相关知识也 ...
随机推荐
- 可以将一些配置信息已json格式存在数据库中读取的时候序列化。
public partial class json序列化 : System.Web.UI.Page { protected void Page_Load(object sender ...
- android学习日记14--网络通信
一.Android网络通信 android网络通信一般有三种:java.net.*(标准Java接口).org.apache接口(基于http协议)和android.net.*(Android网络接口 ...
- 如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)
关键词: -Wl,--gc-sections -ffunction-sections 链接 elf 库 有时我们会遇到这种情况,可执行程序需要链接一些静态库,但是静态库中的函数并没有全部使 ...
- C#求所有可能的排列组合
static System.Collections.Specialized.StringCollection MakeStrings(string[] characters, int finalStr ...
- mysql避免插入重复数据
我们在进行数据库操作的时候,有时候需要插入不重复的数据.所谓不重复的数据,可以是某个字段不重复,也可以是某几个字段重复.当然我们可以在插入之前先将数据库的数据查询出来,然后与将要插入的数据进行对比,如 ...
- leetcode题解:Tree Level Order Traversal II (二叉树的层序遍历 2)
题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...
- Java、Android中Math详解
java.math.Math类常用的常量和方法: Math.PI 记录的圆周率 Math.E记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 Mat ...
- iOS 程序启动原理
很多工作一段时间的iOS程序员,总是每天沉浸在代码里,大家总是按照xcode的规定生成项目,然后就开始码代码了,但是大家知道app背后的启动过程吗?当点击程序图标启动程序开始到退出,程序在运行过程中到 ...
- 条件控制(if ) ( case)
一:IF应用格式 (1) (2) (3) IF 条件 THEN IF 条件 THEN IF 条件1 THEN --代码块 --代码块 --代码块1 commit; commit; ...
- jquery plugins —— Chosen
官网地址:http://harvesthq.github.io/chosen/ Chosen (v1.4.2) Chosen has a number of options and attribute ...