文档章节

镜子的Sping 之旅 之AOP

镜子哥哥
 镜子哥哥
发布于 2016/08/07 12:51
字数 694
阅读 8
收藏 0

AOP术语

通知(Advice):切面的工作。(什么和何时)

5种类型:Before,After,After-returning,After-throwing,Around。

连接点(Joinpoint):应用执行过程中能够插入切面的一个点(时机)。

切点(Pointcut):定义匹配通知织入的一个或多个连接点。(何处)

切面(Aspect):通知和切点的结合, 完成功能。

引入(Introduction):向现有类添加新方法或属性。

织入(Weaving):将切面应用到代理对象来创建新的代理对象的过程。

编译期(目标类编译时AspectJ),类加载期(LTW),运行期(Spring AOP)

编写切点

Spring借助AspectJ的切点表达式(一部分,用其他的会抛出IllegalArguementException)来定义切面。

execution(* com.company.example.Example.play(..))&& within(com.company.example)

*表示不关心方法返回值类型,execution()指示器选择Example的play()方法, play(..)表示不限定入参,&&操作符表示and关系, within()限制匹配,表示example下的任意类调用时。

Spring的bean()指示器可用BeanID或者名称限制切点,也可使用!bean()。

在XML中声明切面

前置或后置通知

例子:

<aop:config>
  <aop:aspect ref=””>(ref为需要调用的bean)
<aop:before pointcut = “execution(* ..(..))” method=””/> (method为ref类中的方法)
<aop:after pointcut=”expression(* ..(..))” method=””/>
  </aop:aspect>
</aop:config>

为避免重复定义冗余,可先定义

<aop:pointcut id=”id” expression=”execution()”/>
<aop:before pointcut-ref=”id” method=“”/>
<aop:after-throwing pointcut-ref=”id” method=””/>

环绕通知

需要在通知方法中加入ProceedingJoinPoint作为方法的入参,如果需要把控制转给被通知的方法可以调用ProceedingJoinPoint的proceed()方法。

声明方法没有太大区别,只是把aop:before换成aop:around

为通知传参

在切点表达式中加入&& arg(参数),就可在<aop:before>等中加入 arg-names=”参数“调用。

通过切面引入(introduction)新功能

<aop:aspect>
<aop:declare-parents
       types-matching=”类型匹配路径”
       implement-interface=”实现接口路径”
       default-impl=”实现方法的bean路径” 或 delegate-ref=”bean id”
/>
<aop:aspect>

注解切面

在xml中更改配置

<aop:aspectj-autoproxy /> ;

在beans 中加入aop命名空间。

在类里 @Aspect 将任意类转化为切面;

@Pointcut 注解AspectJ切点表达式,下定义一个方法名,可供后续调用;

  @Pointcut(“execution(* ..)”)
  public void name(){}

@Before(“name()”)加方法;

@After @AfterReturning @AfterThrowing 使用方法同@Before

@Around(“name”)下方法中同样须使用ProcessingJoinPoint入参,并在对象中使用proceed()方法;

@DeclareParents(value=“”,default-impl=””)
 public static Interface interface;

value 等同于 type-matching,default-impl为接口实现,标注的static指定了被引入的接口。

注入AspectJ切面

可使用Spring的依赖注入将Bean装配入AspectJ切面中

<bean class=”” factory-method=”aspectOf”>
   <property name=”参数名” ref=”参数名”/>
</bean>
<bean id=”参数名” class=””>
   <peoperty name=”” …/>
</bean>

Spring 通过aspectOf()的工厂方法获得切面的引用然后像<bean>元素规定的那样依赖注入。

© 著作权归作者所有

共有 人打赏支持
镜子哥哥
粉丝 1
博文 19
码字总数 14425
作品 0
广州
私信 提问
Spring进行面向切面编程的一个简单例子

一、eclipse新建java项目取名SpringTest 二、导入sping包到构建路径 还需要aspectjweaver.jar 三、创建java类(当然先要创建各种包) IHelloService.java HelloServiceImpl.java SimpleHello...

wangxuwei
2016/01/04
3.7K
0
在STS中SpringBoot引入AOP时,启动报错。

STS版本:3.8.1 项目pom.xml 项目通过maven管理jar,引入AOP后项目自动添加下列jar文件: 项目文件application.properties STS运行Sping Boot App,日志报错:...

fishinhouse
2016/10/03
436
0
sping aop动态代理指定方法疑问

JDK动态代理和CGLIB的动态代理都会对目标类的所有方法进行加强处理,那么sping aop是如何将不需要加强的方法过滤的呢。

laigous
12/10
0
0
Quartz集成spring开发大全

一.固定xml调用quartz 准备工作: 1.导入quartz-1.x.x.x.jar到lib,可能还需要lib/sh4j-api-1.x.x.jar,log4g,sh4j.api,1,x,x,jar,sh4j.nop,1,x,x,jar 2.在src目录下创建quartz.properties......

长平狐
2013/01/06
2.1K
1
SpingAOP原理小实现

简单描述Sping的AOP就是动态代理加拦截器链实现面向切面编程。当然AOP肯定没有这么简单,但是如果能自己实现AOP然后再去看源码的话是不是会更轻松点呢。 众所周知,Sping中AOP之所以能起作用...

-wangming-
2016/03/14
20
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
48分钟前
1
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
51分钟前
1
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
1
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
1
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部