注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考。欢迎留言讨论,持续更新中~

(该部分是Spring的面向切面编程AOP)

第四章 通知Bean

在软件编程中,散布于程序中多个地点的函数被称为“交叉事务”(日志管理、权限控制等)。从概念上来说,它们一般是与程序业务逻辑分开的,但经常却是直接嵌入其中的。把这些交叉事务与业务逻辑分离开正式面向切面编程(AOP)的作用所在,由此引入面向切面编程...

Spring AOP的实现原理是:创建一个代理Bean,绑定通知者类(通知者类包含切面代码切点),匹配相应的方法,在目标代码中嵌入执行切面的代码。


1. 通过配置来详细说明下Spring AOP的流程:(为了弄清楚原理,所以从配置讲起,虽然目前这种方式已经不常用了,Spring 2.0提供了更加优雅的解决方案。)

代理Bean的配置,ProxyFactoryBean

<bean id="duke" class="org.springframework......ProxyFactoryBean">
    <property name="target" ref="dukeTarget" />
    <property name="interceptorNames" value="audienceAdvisor" />
    <property name="proxyInterfaces" value="com.....Performer" />
</bean>

  • target:这个属性告诉ProxyFactoryBean哪个Bean需要被代理,通俗点就是哪个Bean需要运用切面代码,target配置的就是目标代码。
  • interceptorNames:配置通知者,通知者可以按照如下方式配置:
<bean id="audienceAdvisor" class="org.springframe....AspectJExpressionPointcutAdvisor">
    <property name="advise" ref="audienceAdvice" /> //通知者Bean,主要包含切面代码,需要实现MethodBeforeAdvice等接口,用来表示在目标代码执行前、后、抛出异常时候的切面代码
    <property name="expression" value="execution(* *.perform(..))" /> //AspectJ的切点匹配表达式,用来监测当目标代码执行perform操作时候,触发切面代码
</bean>

  • proxyInterfaces:应该代理目标代码中的哪个接口(这个属性其实有点重复,切点表达式基本可以匹配了,自动代理就是基于这个的升级)

2. AspectJ通过注解提供了另外一个把POJO类注解成切面的方式,比较简洁,直接在Java代码中写注解,额外的配置就是在Spring的上下文中声明一个自动代理的Bean,这样才能知道如何把@AspectJ注解的Bean转化为代理通知。

import org.aspectJ.lang.annotation.Aspect;@Aspect //声明切面
public class Audience {@Pointcut("execution(* *.perform(..))") //定义切点
public void performance() {}@Before("performance()")  //切点之前执行
public ....      @AfterReturning("performance()")  //切点之后执行
public ...@AfterThrowing("performance()")  //切点抛出异常后执行
public ...
}

3. Aspect这种切面声明的方式已经直接在代码中修改,如果要把一个普通的POJO转化成切面,那就必须获得源代码,然后改变源代码,这点是我们不希望看到的。有没有办法,让我们可以引用任何Bean,作为切面呢? Spring 2.0提供了<aop:aspect>,是一个把POJO转化为切面的优雅方案。

<aop:config>
<aop:aspect ref="audience">  //切面代码Bean
<aop:pointcut id="performance" expression="excution(* *.performance(..))"  />   //定义切点<aop:before  method="..."  pointcut-ref="performance" />  //切面代码具体方法,在切点前执行(下同)
<aop:after-returnning  method="..."  pointcut-ref="performance" />
<aop:after-throwing  method="..."  pointcut-ref="performance" /></aop:aspect>
</aop:config>


总结:虽然Spring AOP对于大多数切面程序来说是足够了,但Java的构造函数与普通方法是有区别的(不能被继承),这使得Spring基于代理的AOP不能实现对象创建过程的通知。AspectJ实现的切面控制独立于Spring,提供了Spring AOP不可能实现的多种切点类型,这方面特性一般也没用到,有需要的朋友可以深入研究。

萌萌的IT人,IT人的乐园

转载于:https://www.cnblogs.com/yanghuahui/archive/2012/11/02/2750970.html

Spring in Action 入门之面向切面编程AOP相关推荐

  1. Spring之面向切面编程AOP(八)

    介绍&步骤 视频教程: https://www.bilibili.com/video/BV1WZ4y1P7Bp?p=121 官方笔记链接:https://pan.baidu.com/s/1dn ...

  2. Spring.NET学习笔记12——面向切面编程(基础篇) Level 300

    AOP即面向切面编程(Aspect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式.是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添 ...

  3. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  4. Spring(四):面向切面编程AOP

    2019独角兽企业重金招聘Python工程师标准>>> 横切关注点:分布于应用中多处的功能 面向切面编程AOP:将横切关注点与业务逻辑相分离 在使用面向切面编程时,仍在一个地方定义通 ...

  5. java 切面 注解_Java自学之spring:使用注解进行面向切面编程(AOP)

    学习目的:学会使用注解进行面向切面编程(AOP),实现在面向切面编程(AOP)中,使用XML配置完成的操作. Part 1 修改cn.vaefun.dao.UserServiceImpl.java,在 ...

  6. 九、面向切面编程AOP

    本栏博客目录 一.Spring的IOC和DI 二.IoC和DI注解开发 三.SpringMVC入门 四.SpringMVC的请求和响应 五.JdbcTemplate 六.Spring练习 七.Spri ...

  7. 服务端第三次课程:面向切面编程AOP

    3:面向切面编程AOP 1:回顾 bean的组装方式 规划的装配 component autowired sacn是在configuration底下的 Java config 使用configurat ...

  8. Spring-学习笔记08【面向切面编程AOP】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  9. java切面编程 切面概念,面向切面编程(AOP)初探

    面向对象编程通过设计和语言本身提供的模块化.封装.继承.多态来实现软件复用.尽管OOP在建模以及实现复杂软件方面非常成功,它仍然有一些问题.面向切面编程(AOP)被认为是一项有前途的新技术,它通过对交 ...

最新文章

  1. python中的linearregression_【python+机器学习(2)】python实现Linear Regression
  2. struts2 学习记录 之 国际化
  3. μCUnit,微控制器的单元测试框架
  4. 绕过web认证学习总结
  5. oracle数据库渐变色,CSS3背景颜色渐变(gradients),适用于微信小程序
  6. SQL组合查询union
  7. 获取客户端浏览器信息
  8. sq工程师是做什么的_算法工程师为什么成天做数据,都做哪些数据?
  9. 蓝桥杯:试题 历届真题 修改数组【第十届】【省赛】【研究生组】Java实现
  10. 服务器网卡有什么作用,服务器网卡的作用
  11. byte数组转字符串_字符串性能优化不容小觑
  12. PCB多层板的一些资料
  13. 数学建模美赛写作技巧
  14. telegram群组管理机器人
  15. 电脑USB接口实现鼠标和键盘功能
  16. Android Shape渐变色
  17. 微软准备再次裁员2850人 一年之内完成
  18. NMEA-GPS协议
  19. php开心农场游戏源码,解密开源版开心农场游戏小程序分享
  20. HTML在指定位置画一个矩形,CAD如何在指定位置绘制矩形?

热门文章

  1. BZOJ3534:[SDOI2014]重建(矩阵树定理)
  2. linux下编译动态和静态链接库
  3. UVa11427 Expect the Expected
  4. Uva 10562 看图写树
  5. 为Jfinal-weixin SDK添加微信连WiFi成功通知事件
  6. 01. 把存储过程结果集SELECT INTO到临时表
  7. Exchange Server 2003 Cluster
  8. POJ2528 计算可见线段(线段树)
  9. json如何把键名作为变量?
  10. 2017年英特尔在其数据中心业务和AI方面下大注