Spring框架的核心是依赖注入和面向切面编程
面向切面(AOP)的术语是理解AOP的重要内容:
一.通知(Advice):通知定义了切面是什么,定义了切面的功能代码以及什么时候使用。
Spring切面可以应用五种类型的通知:
1.前置通知(Before):在目标方法被调用之前调用通知功能。
2.后置通知(After):在目标方法被调用之后调用通知功能。
3.返回通知(After-returning):在目标方法成功执行之后才调用通知功能。
4.异常通知(After-throwing):在目标方法抛出异常之后才调用通知功能。
5.环绕通知(Round):通知包裹了被通知方法,在被通知方法调用前后执行自定义行为。
二.连接点:连接点是在应用执行过程中可以插入切面的一个点,这个点可以是调用方法时,抛出异常时,甚至是修改一个字段时。
三.切点:切点定义了在何处,切点的定义会匹配通知所要织入的一个或多个连接点。
四.切面:切面是通知和切点的结合,定义了在何时何处做什么。
五.引入:引入允许我们在现有的类中添加新方法或者属性。
六.织入:织入是把切面应用到目标对象并创建新代理对象的过程。切面在指定的连接点被织入到目标对象当中。
有三个时机可以进行织入:
1.编译期:切面在目标类被编译时织入,需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入得。
2.类加载期:切面在目标类加载到JVM时织入。
3.运行期:切面在应用运行时的某个时刻被织入,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是这种方式。


Spring AOP构建于动态代理基础上,因此Spring AOP仅局限于方法拦截上。
如果你的AOP需求超过了简单的方法调用,那么你需要考虑使用AspectJ来实现切面。


编写切点:
我们使用接口Performance:

package com;
public interface Performance
{public void perform();
}
创建切点:
execution(* com.Performance.perform(..))

execution:关键字,用于在方法执行时触发。
*:表示接受任意的返回类型。
com.Performance.perform(..):方法的全限定名,..表示接受任何参数。

可以使用指示器来限制匹配:
指示器有:
1.args(类型):限制连接点匹配参数为指定类型的执行方法。
2.@arg():限制连接点匹配参数由指定注解标注的执行方法。
3.this():限制连接点匹配AOP代理的Bean引用为指定类型的类。
4.within():限制连接点指定的类型。
5.bean(bean id):限制切点只匹配特定的bean。
用and(&&),or(||),not(!)连接。


创建切面:

package com;
import org.aspectj.lang.annotation.*;
@Aspect      //表明该Bean是一个切面
public class Audience
{@Pointcut("execution(** com.Performance.perform(..))")public void performance(){}       //声明切点,可重用。@Before("performance()")//通知方法代码,在切点方法执行之前调用。@After("performance()")//通知方法代码,在切点方法执行后调用,不论执行方法是否成功执行。@AfterReturning("performance()")//通知方法代码,在切点方法成功执行,返回之后,才调用。@AfterThrowing("performance()")//通知代码,在切点方法抛出异常时调用。
}

需要为切面创建Bean。


需要将切面启用自动代理功能,才能成为真正的切面:

package com;
import org.springframework.context.annotation.*;
@Configuration
@EnableAspectJAutoProxy  //为切面启用自动代理
@ComponentScan   //自动扫描组件,会扫描@Aspect注解的类
public class MyConfig
{@Beanpublic Audience audience(){return new Audience();}
}

创建环绕通知:环绕通知是最强大的通知

package com;
import org.aspectj.lang.annotation.*;
@Aspect
public class Audience
{@Pointcut("execution(** com.Performance.perform(..))")public void performance(){}       //声明切点,可重用。@Around("performance()")public void aroundWatch(ProceedingJoinPoint jp){try{//一些逻辑语句,在切点方法执行前调用。相当于@Beforejp.proceed();   //执行切点方法。//一些逻辑语句,在切点方法执行后调用。相当于@After}catch(Throwable e){//一些逻辑语句,在切点方法抛出异常后调用.相当于@AfterThrowing。}}
}

处理通知中的参数:

@before(execution(** com.Performance.perform(int)) and args(参数名)
public void getParam(int 参数名1)  //切点生命了传递给通知方法的参数
{
}

Spring学习之旅(四):面向切面编程(AOP)相关推荐

  1. Spring in Action 入门之面向切面编程AOP

    注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考.欢迎留言讨论,持续更新中~ (该部分是Spring的面向切面编程AOP) 第四章 通知Bean 在软件编程中,散布于 ...

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

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

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

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

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

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

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

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

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

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

  7. 九、面向切面编程AOP

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

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

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

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

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

  10. 【Spring】面向切面编程AOP

    AOP基础 什么是AOP [废话解释]在软件业,AOP全称Aspect Oriented Programming 即:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AO ...

最新文章

  1. Java 游泳时长计算
  2. 面了三次字节,他的一些感悟
  3. 在java web工程中jsp页面中使用kindeditor
  4. 吴恩达深度学习编程作业:TensorFlow
  5. h3c服务器显示非法的文件,H3C License server 故障处理手册-5W201
  6. mysql如何进行宿舍分配_手把手教你做一个Jsp Servlet Mysql实现的学生宿舍管理系统...
  7. 数据库系统的三级模式结构
  8. Html点击复制文本内容
  9. 微信跳转APP最全解析
  10. 起底资金盘GGT:一场早有预谋的跑路
  11. 安卓初学之基准线实战
  12. MFC实现基本图形绘制、变换、自由曲线绘制、图形裁剪和填充
  13. 均值、方差和标准差计算的python代码
  14. 前端面试题(背题中)
  15. Alcatel-Lucent 命令记录
  16. 屠呦呦入围BBC“20世纪最伟大科学家”,和爱因斯坦、居里夫人、图灵并列【中国科讯】...
  17. K线类型识别—单K线之阳线
  18. 面对 ESM 的开发模式,webpack 还有还手之力吗?(转载)
  19. 小白借助视频云平台搭建企业级连锁监控平台
  20. 如何快速提升网站百度权重

热门文章

  1. 大数据学习笔记30:搭建高可用Hadoop集群
  2. 【hdu3441】Rotation,Polya套Polya
  3. 【BZOJ4521】手机号码,数位dp
  4. 【BZOJ4300】绝世好题,位运算相关DP
  5. Pentium 4处理器架构/微架构/流水线 (7) - NetBurst前端详解 - 分支预测
  6. linux下判断网络是否连接
  7. python特征选择后显示选取的特征名_python实现求特征选择的信息增益
  8. python 文件管理_python 文件操作
  9. 虚幻4属性系统(反射)翻译
  10. 现代 CMake 简明教程(一)- CMake 基础