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 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
随机推荐
- java中poi进行execl导出
首先贴出最终导出的execl截图吧: 前台界面如下: 点击导出时,为其按钮的onclick事件添加exportDate()函数: function exportDate(){ var begin_Da ...
- myeclipse2015修改web项目部署名
在旧版本的myeclipse中修改web项目部署名很方便,直接右键在properties中查找web就能进行修改. 但是myeclipse2015中发现不能直接修改了. 我们可以点击config,或者 ...
- Codeforces Educational Round 57
这场出题人好像特别喜欢998244353,每个题里都放一个 A.Find Divisible 考察选手对输入输出的掌握 输出l 2*l即可(为啥你要放这个题,凑字数吗 #include<cstd ...
- 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)
i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...
- fzyzojP2291 -- 小添添的庄园之道路修复
直接换根dp f[i]表示,i为根的子树的方案 f[i]=Π(f[son]+1)(就是考虑这个边修不修(不修,子树中只有一种方案)) 这里是乘法 换根的时候,直接算的话,为了消除x对fa的贡献,要乘上 ...
- Docker入门与应用系列(二)镜像管理
1.1 什么是镜像 简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统. 1.2 镜像从哪里来 Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容 ...
- linux命令总结之lsof命令
简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...
- JAVA 线程池基本总结
合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第三:提高线程 ...
- 科学计算三维可视化---TVTK入门(数据加载)
一:数据加载 大多数可视化应用的数据并非是在TVTK库中构建的,很多都是通过接口读取外部数据文件 (一)使用vtkSTLReader来读取外部文件 .stl 文件是在计算机图形应用系统中,用于表示三角 ...
- css table 合并单元格
1. css table 合并单元格 colspan:合并列, rowspan:合并行, 合并行的时候,比如rowspan="2",它的下一行tr会少一列: 合并列的时候,比如co ...