spring 学习之二 AOP编程
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编程的更多相关文章
- spring 学习(二):spring bean 管理--配置文件和注解混合使用
		spring 学习(二)spring bean 管理--配置文件和注解混合使用 相似的,创建 maven 工程,配置pom.xml 文件,具体可以参考上一篇博文: sprint 学习(一) 然后我们在 ... 
- Spring学习笔记之aop动态代理(3)
		Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ... 
- spring学习总结二-----面向切面编程(AOP)思想
		上一篇spring博客简总结了spring控制反转和依赖注入的相关思想知识点,这篇博文对spring的面向切的编程思想进行简单的梳理和总结. 一.面向切面的思想 与面向对象的纵向关系概念不同,面向切面 ... 
- Spring学习(二)——Spring中的AOP的初步理解[转]
		[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ... 
- Spring学习(二)——Spring中的AOP的初步理解
		[前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ... 
- Spring学习笔记--面向切面编程(AOP)
		什么是AOP AOP(Aspect Oriented Programming),意为面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ... 
- Spring学习(二)
		1. AOP的思想(如何实现),AOP在哪些地方使用? 相关术语有哪些? AOP是面向切面编程,它是一种编程思想,采取横向抽取机制,取代了传统纵向继承体系重复性代码的方式 应用场景有: 记录日志 监控 ... 
- 使用spring方式来实现aop编程
		1:什么是aop? Aspect Oriented Programming 面向切面编程 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译 ... 
- Spring学习笔记4——AOP
		AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ... 
随机推荐
- 【刷题】洛谷 P3455 [POI2007]ZAP-Queries
			题目描述 Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency). He ha ... 
- [UVALive 3902] Network
			图片加载可能有点慢,请跳过题面先看题解,谢谢 一道简单的贪心题,而且根节点已经给你了(\(S\)),这就很好做了. 显然,深度小于等于 \(k\) 的都不用管了(\(S\) 深度为0),那么我们只需要 ... 
- 【poj3133】 Manhattan Wiring
			http://poj.org/problem?id=3133 (题目链接) 题意 $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$.要求把这两个$2$和两个$3$各用一条折线连起来.障碍里不 ... 
- 【poj3623】 Best Cow Line, Gold
			http://poj.org/problem?id=3623 (题目链接) 题意 给出一个字符串,每次可以取首或尾接到一个新的字符串后面,求构出的字典序最小的新字符串. Solution 首先可以发现 ... 
- 一、spark错误
			1. 17/07/17 15:34:55 ERROR yarn.ApplicationMaster: User class threw exception: java.lang.Unsupported ... 
- Hbase(七)hbase高级编程
			一.Hbase结合mapreduce 为什么需要用 mapreduce 去访问 hbase 的数据? ——加快分析速度和扩展分析能力 Mapreduce 访问 hbase 数据作分析一 ... 
- (转)编码规范系列(一):Eclipse Code Templates设置
			背景:长久以来,对java编程中的注释不甚理解.再次学习<疯狂JAVA讲义>基础,深深的感到自己基本功的不牢固.所以要做到事无巨细,好好修炼. 认识注释 常识 注释的作用: 回顾原有的代码 ... 
- python【数据类型:字典】
			字典的定义 infos = {'name':'张晓红','sex':'女','address':'上海','age':18} stus = {"name":"张三&quo ... 
- Ansible3: ansible.cfg配置说明
			常用配置 Ansible默认安装好后有一个配置文件/etc/ansible/ansible.cfg,该配置文件中定义了ansible的主机的默认配置部分,如默认是否需要输入密码.是否开启sudo认证. ... 
- Java质数求解
			质数概念 质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数).最小的素数是2,也是素数中唯一的偶数:其他素数都是奇数.质数有 ... 
