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. BZOJ 1283: 序列

    1283: 序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 272  Solved: 151[Submit][Status][Discuss] D ...

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

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

  3. Metasploit+python生成免杀exe过360杀毒

    Metasploit+python生成免杀exe过360杀毒 1在kali下生成一个反弹的msf的python脚本,命令如下: msfvenom -p windows/meterpreter/reve ...

  4. 解题:POI 2009 Ticket Inspector

    题面 看起来很水,然而不会DP的蒟蒻并不会做,PoPoqqq orz 设$f[i][j]$表示当前在第$i$个点和第$i+1$个点之间查票,已经查了$j$次的最大收益.然后就是那种很常见的枚举前一个结 ...

  5. sublime_Text3中snippet设置信息头(包括作者、日期)

    1.tool->new snippet(工具->新代码段) 创建一个新的snippet,并保存为author.sublime-snippet(最好在该目录(User)下再创建一个MySni ...

  6. MySQL 第一篇:初识数据库

    一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问,一个文件仅仅只能存在于某一台机器上. 如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件 ...

  7. Socket通信的简单例子

    客户端代码: package com.bobohe.socket; import java.io.*; import java.net.*; public class TalkClient { pub ...

  8. csu1377Putter && HOJ12816

    链接:(csu)http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1377 (HOJ)http://49.123.82.55/online/?actio ...

  9. Nginx反向代理websocket配置实例(官网)

    https://www.nginx.com/blog/websocket-nginx/ Blog Tech Rick Nelson of NGINX, Inc.   May 16, 2014   NG ...

  10. python的内置模块time和datetime的方法详解以及使用(python内的time和datetime时间格式)

    time内置模块的方法 1.time() 时间戳 time() -> floating point number  浮点数 Return the current time in seconds ...