AOP概念

  AOP, aspect oriented programing,翻译过来就是面向切面编程的意思,那什么叫面向切面编程呢?相对于之前传统的纵向继承方式来对原有功能进行功能扩展,

面向切面编程的好处就是不需要增加源代码就可以进行功能扩展。

AOP术语

  --joinpint(连接点): 指那些被拦截到的点,在spring中,这些点指的是方法

  --pointcut(切入点) : 指要对哪些连接点进行拦截定义,即对哪些方法做扩展处理

  --advice(通知/增强) : 通知是指拦截到joinpoint之后所要做的事情,即扩展的功能本身。而通知根据其出现在相对于切入点(被扩展功能的方法)的位置,而被分为

    前置通知,后置通知,异常通知,最终通知,环绕通知

  --aspect(切面) : 切入点与通知的结合

一个例子

  从上面的术语和描述可能还不太理解AOP真正的作用,举一个直白的例子吧,先写一个Dao方法

public class UserDao {
//add方法就是切入点
public void add(User user){
System.out.print("在这里添加一个用户");
}
}

在发布第二版的时候,增加了一个功能,就是在添加用户的时候,打印出添加的用户信息,那该怎么实现呢?看下面代码

public class UserDao {
//add方法就是切入点
public void add(User user){
System.out.print("新增的用户是 " + user.name); //新扩展的功能
System.out.print("在这里添加一个用户");
}
}

很显然 这样的做法不是很好,耦合太强,现在我们看看AOP是怎么做到这一点的呢?在AOP时,userDao中的add()方法是我们需要加强功能的方法,也就是术语中的切入点。再

看AOP中的增强代码(扩展的那部分功能),它并不没有直接与被扩展的方法userDao.add()关联起来,而是单独的代码块。

public class UserService {
//增强,扩展的功能
public void extendm(User user){
System.out.print("新增的用户是 " + user.name); //新扩展的功能
}
}

  接着在配置文件中进行aop配置,在执行add方法时,会自动将增强代码加在其前后,从而达到了不修改源代码而扩展功能的效果。配置文件写法

<bean id="userDao" class="com.blueto.aop.UserDao"></bean>
<bean id="userDaoService" class="com.blueto.aop.UserDaoService"></bean> //aop配置
<aop:config>
//切入点,被扩展的方法
<aop:pointcut expression="execution(* com.blueto.aop.UserService.*(..))" id="pointcut1"/>
//切面
<aop:aspect ref="userDaoService">
//扩展的方法
<aop:before method="extendm" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>

  上面配置文件中的切入点的表达式的语法为:

    execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)

  表示对哪些方法进入功能扩展,即AOP中的增强,写法有下面几种,只要理解了意思就好记了

  1)execution(* com.blueto.aop.UserService.add(..))    对add方法增强

  2)execution(* com.blueto.aop.UserService.*(..))    对UserService类中所有方法增强

  3)execution(* *.*(..))    对所有包下面所有类的所有方法增强

  配置文件中的aop:before对应的是前置增强,其他的增强方式有环绕增强(after-returning),后置增强(around)等

  到此,通过例子说明,AOP的配置文件方式就完成了,整个过程还是显得有点复杂,不过和Ioc一样,这种技术还有一种简单的实现方式,那就是注解式

注解方式实现AOP

  第一步 配置文件中创建类

<bean id="userDao" class="com.blueto.aop.UserDao"></bean>
<bean id="userDaoService" class="com.blueto.aop.UserDaoService"></bean> //开启aop操作
<aop:aspect-autoproxy></aop:aspect-autoproxy>

  第二步,在增强类(扩展功能方法)上面添加注解

@Aspect
public class UserService {
@Before(value="execution(* com.blueto.aop.UserDao.*(..))")
public void extendm(User user){
System.out.print("新增的用户是 " + user.name); //新扩展的功能
}
}

spring 学习之二 AOP编程的更多相关文章

  1. spring 学习(二):spring bean 管理--配置文件和注解混合使用

    spring 学习(二)spring bean 管理--配置文件和注解混合使用 相似的,创建 maven 工程,配置pom.xml 文件,具体可以参考上一篇博文: sprint 学习(一) 然后我们在 ...

  2. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  3. spring学习总结二-----面向切面编程(AOP)思想

    上一篇spring博客简总结了spring控制反转和依赖注入的相关思想知识点,这篇博文对spring的面向切的编程思想进行简单的梳理和总结. 一.面向切面的思想 与面向对象的纵向关系概念不同,面向切面 ...

  4. Spring学习(二)——Spring中的AOP的初步理解[转]

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  5. Spring学习(二)——Spring中的AOP的初步理解

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  6. Spring学习笔记--面向切面编程(AOP)

    什么是AOP AOP(Aspect Oriented Programming),意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ...

  7. Spring学习(二)

    1. AOP的思想(如何实现),AOP在哪些地方使用? 相关术语有哪些? AOP是面向切面编程,它是一种编程思想,采取横向抽取机制,取代了传统纵向继承体系重复性代码的方式 应用场景有: 记录日志 监控 ...

  8. 使用spring方式来实现aop编程

    1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ...

  9. Spring学习笔记4——AOP

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

随机推荐

  1. 51nod 1563 坐标轴上的最大团(今日gg模拟第一题) | 线段覆盖 贪心 思维题

    51nod 1563 坐标轴上的最大团 坐标轴上有n个点,每个点有一个权值.第i个点的坐标是 xi ,权值是 wi .现在对这些点建图.对于点对 (i,j) ,如果 |xi−xj|≥wi+wj ,那么 ...

  2. 【树论 1】 prim算法的学习和使用

    进阶版神犇可以看看本题解的姊妹篇 Kruskal算法的学习和使用 下面的内容是prim算法 但是最小生成树是什么呢? 标准定义如下:在边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值 ...

  3. 安装和使用 PyInstaller 遇到的问题

    写在前面 在学习 Python语言程序设计 的时候,其中有一节课提到了 PyInstaller 第三方库.PyInstaller 可以用来打包 python 应用程序,打包完的程序就可以在没有安装 p ...

  4. Java EE之通过表单上传文件

    public class Ticket { private String customerName; private String subject; private String body; priv ...

  5. 「CodePlus 2017 11 月赛」Yazid 的新生舞会(树状数组/线段树)

    学习了新姿势..(一直看不懂大爷的代码卡了好久T T 首先数字范围那么小可以考虑枚举众数来计算答案,设当前枚举到$x$,$s_i$为前$i$个数中$x$的出现次数,则满足$2*s_r-r > 2 ...

  6. Java入门:创建多个对象

    当使用一个类实例化多个对象时,多个对象之间是什么关系?他们各自的数据会不会发生混淆?这次课跟大家讲解一下这个问题.学完本次课,大家应该对对象在内存中的表示方式有一个初步的了解,为理解更深入的面向对象概 ...

  7. python【文件操作:修改文件】

  8. 视音频数据处理入门:UDP-RTP协议解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

  9. Spring MVC原理介绍

    1.Spring Web MVC是什么 spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解 ...

  10. Codeforces 877 C. Slava and tanks

    http://codeforces.com/problemset/problem/877/C   C. Slava and tanks time limit per test 2 seconds me ...