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 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
随机推荐
- [洛谷P5216]DLS 采花
题目大意:有$n$个数,任意排列,排列后第$i$个数会产生贡献当且仅当$1\sim i-1$中的数不是它的因子,问所有排列的贡献和 题解:发现一个数要产生贡献要求所有它的因子在它的右边,设有$cnt_ ...
- 【BZOJ1150】数据备份(动态规划,凸优化)
[BZOJ1150]数据备份(动态规划,凸优化) 题面 BZOJ 洛谷 题解 在不考虑\(K\)的情况下很容易\(dp\) 如果把\(K\)考虑进状态显然是\(O(n^2)\)级别. 所以凸优化一下即 ...
- Linux中的防火墙----iptables
防火墙,它是一种位于内部网络与外部网络之间的网络安全系统.一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过. 防火墙根据主要的功能可分为网络层防火墙.应用层防火墙.数据库防火墙. 网 ...
- Ecshop 2.x_3.x SQL注入和代码执行漏洞复现和分析
0x00 前言 问题发生在user.php的的显示函数,模版变量可控,导致注入,配合注入可达到远程代码执行 0x01 漏洞分析 1.SQL注入 先看user.php的$ back_act变量来源于HT ...
- Android中用GridView实现九宫格的两种方法(转)
Android中用GridView实现九宫格的两种方法http://blog.csdn.net/shakespeare001/article/details/7768455 1.传统办法:实现一个继承 ...
- C++ std::allocator<T> 与new对比效率使用
基础知识通道:http://blog.csdn.net/Xiejingfa/article/details/50955295 C/C++: #include <iostream> #inc ...
- Qt 查找功能
版权声明 该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处! 导语 这一篇我们来加上查找菜单的功能.因为要涉及Qt Creator的很多实用功 ...
- 抓包工具Charles
Charles Charles可以在windows,linux,mac各种操作系统上安装使用,它是java编写一款非免费工具:而fiddler只能在windows系统上使用 Charles抓包前,要确 ...
- K8S调度之节点亲和性
Node Affinity Affinity 翻译成中文是"亲和性",它对应的是 Anti-Affinity,我们翻译成"互斥".这两个词比较形象,可以把 po ...
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...