Spring的入门学习笔记 (AOP概念及操作+AspectJ)
AOP概念
1.aop:面向切面(方面)编程,扩展功能不通过源代码实现
2.采用横向抽取机制,取代了传统的纵向继承重复代码
AOP原理
假设现有
public class User{
//添加用户方法(1)
public void add(){
//添加逻辑(2)
//(3)
}
}
我们需要扩展其功能:
正常需要在3处添加逻辑,但这种方式不好,需要经常修改代码
纵向抽取机制解决:
public class BaseUser{
//创建方法
public void writelog(){
//添加逻辑
}
}
public class User extends BaseUser{
public void add(){
//添加逻辑
//添加功能扩展
//调用父类方法
suer.writelog();
}
}
但:如果父类方法名发生变化,子类调用方法也需要变化
横向抽取机制:
aop:底层使用动态代理的方式实现
第一种情况:
public interface Dao{
public void add();
}
//使用动态代理的方式,创建接口实现类代理对象(实现和daoimpl平级的对象,但不是个真正对象,但可以实现和其相同的功能)
public class DaoImpl implements Dao{
public void add(){
//添加逻辑
}
}
第二种情况:
public class User{
public void add(){
}
}
//动态代理实现
创建User类的子类的代理对象
子类中调用父类方法完成增强(super)
//使用cgllb动态代理,没有接口情况
AOP操作术语
public class User{
public void add(){}
public void delete(){}
public void update(){}
public void findAll(){}
}
切入点:类中的哪些方法可以被增强,这些方法就是连接点;如果只有update和add,则这实际增强方法为切入点
通知/增强:增强的逻辑,成为增强(前置/方法之前,后置/方法之后,异常/出现异常,最终/后置之后为最终,环绕增强/在方法之前和之后执行)
切面:把增强用于具体方法增强,过程为切面
在Spring里进行aop操作,使用aspectJ实现
AspectJ同Spring一起使用,但不属于Spring,一起进行aop操作
Spring2.0以后增加了对Aspectj的支持
使用aspectj实现aop实现的两种方式
1.基于aspectj的xml配置
2.基于aspectj的注解方式
Aop的操作准备
1.除基本的外,还有aop的相关jar包
2.创建spring核心配置文件,导入aop的约束

表达式配置切入点
1.切入点,实际增强切入点
2.常用表达式
1)execution(* cn.itcast.aop.Book.add(..))
2)execution(* cn.itcast.aop.Book.*(..))(
3)execution(* *.*(..))
4)execution(* save*(..))
xml配置:
<bean id="Book" class="cn.itcast.aop.Book"></bean>
<bean id="MyBook" class="cn.itcast.aop.MyBook"></bean> <aop:config>
<!--切入点>
<aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1">
</aop:pointcut>
<!--配置切面>
<aop:aspect ref="MyBook">
<!--配置增强类型 menthod为增强类里面使用哪个方法为前置 ahter-returning menthod后写后置>
<aop:before method="before1" pointcut-ref = "pointcut1"/>
</aop:aspect>
</aop:config>
另一部分:public class Book{ public void add( system.out.println("add......") }
}
public class MyBook{
public void before1(){
system.out.println("前置增强......");
}
//环绕写法
public void around1(ProceedingJoinPoint proceedingJoinPoint) throw Throwable{
System.out.printLn("方法之前...");
//执行被增强的方法
ProceedingJoinPoint.proceed();
System.out.printLn("方法之后...");
}}
aspectj注解操作(更简单):
public class Book{
public void add(){
}
}
@Aspect
public class MyBook{
@Before(value="execution(* 路径1.*(..))")
public void before1(){
}
}
<!--创建对象-->
<bean id ="book" class="路径1"></bean>
<bean id ="book" class="路径2"></bean> <!--开启aop-->
<aop:asceptj-autoproxy> </...>
Spring的入门学习笔记 (AOP概念及操作+AspectJ)的更多相关文章
- Spring.Net 入门学习笔记-----one
一. 基本概念 Spring.Net是一个轻量级的控制反转(Ioc)和面向切面的(Aop)的容器框架: Ioc:控制反转:简单的说就是将创建对象的控制权转交给外部容器(IApplicationC ...
- Spring的入门学习笔记 (注解)
Spring的bean管理(注解) 注解 1.代码里面特殊标记(ep:@Test),使用注解完成一些相关功能 2.注解写法 @注解名称(属性名称=属性值) 3.可以用在类,方法,属性上都可以 4.Sp ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Oracle RAC学习笔记:基本概念及入门
Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章] oracle 10g real applica ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- Three入门学习笔记整理
一.官方网站:https://threejs.org 二.关于Three.js 三.开始 四.实例 基本结构 结果 五.概念 坐标系 场景 相机 灯光 3D模型 六.简单动画 七.交互控制 结束 # ...
随机推荐
- 将ReportingService 2008配置为匿名访问 - 转载
众所周知在ReportingService 2008中微软取消了匿名访问,我们再也不能像2005时那样靠修改IIS来实现匿名访问了.但在微软MSDN BLOG中还是提供了以下这种设置匿名访问的方式. ...
- webgis开发-开始向JS转向
官方的一个blog Final Release and Support Plan for the ArcGIS APIs / Viewers for Flex and Silverlight 网址: ...
- daemontools检测进程,退出拉起
一.学习的原因: 为了实现在服务异常停止运行后,有一个监控程序能监控到它,并自动重新启动这个服务.以下以tomcat为例子 二.工具supervise Daemontools是一个包含了很多管理Uni ...
- webstorm中使用git
webstorm中使用git将代码放入tfs两种方式: 直接在tfs上建立仓库,复制仓库地址,然后在本地打开webstorm,然后git克隆这个仓库 使用git命令将本地项目上传到tfs git re ...
- devexpress chart 散点图加载并分组显示(可以自定义颜色 同组中的点颜色相同)
this.dChart.Diagram.Series.Clear();//清空图的内容 var groups = result.GroupBy(itm => itm["flag&quo ...
- .net Basic
Java's concurrent API https://code.google.com/p/netconcurrent/ java 之DelayQueue实际运用示例 阻塞任务队列DelayQue ...
- 修改virtual box中ubuntu lubuntu 的分辨率
Step1 先用xrandr命令查看能够支持的分辨率 Step2 xrandr --output VGA-1 --size 1280x800 Step3 重启电脑
- python UI自动化实战记录七:页面2用例编写
使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...
- codeforces 848B Rooter's Song
题目链接 正解:排序+模拟. 我们注意到两个点碰撞的必要条件,$pi+tj=pj+ti$,移项以后发现就是$pi-ti=pj-tj$,那么我们可以把$p-t$相同的点分为同一组. 然后我们还可以发现一 ...
- hdu 3068 最长回文_Manacher模板
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/neng18/article/details/24269469 pid=3068" rel= ...