面向切面编程--AOP

AOP(Aspect Oriented Programming),程序员称之为面向切面编程,是Spring框架除了IOC之外的另一个核心概念。

AOP是对OOP(面向对象编程)的一个补充,在代码运行过程中,动态地将代码切入到某个类的指定方法、指定位置上。也就是面向切面编程。

AOP的优点

1.降低模块之间的耦合度。
2.使系统容易扩展。
3.更好的代码复用。
4.非业务代码更加集中,不分散,便于统一管理。
5.业务代码更简洁纯粹,没有其他代码的影响。

AOP的几个概念

切面:横切关注点被模块化的特殊对象。

通知:切面对象完成的工作。

目标:被通知的对象,即被横切的对象。

代理:切面通知目标混合之后的内容。

连接点:程序要执行的某个特定位置。

切点:AOP通过切点定位到连接点。

AOP增强

Weaving(织入):对方法进行增强

(1)前置增强(BeforeAdvice):在目标方法前调用。

(2)后置增强(AfterAdvice):在目标方法后调用。

(3)环绕增强(AroundAdvice):将 Before 和 After ,甚至抛出增强和返回增强合到一起。

(4)返回增强(AfterReturningAdvice):在方法返回结果后执行,该增强可以接收到目标方法返回结果。

(5)抛出增强(AfterThrowingAdvice):在目标方法抛出对应的类型后执行,可以接收到对应的异常信息。

Introduction(引入):对类进行增强

引入增强(DeclareParentsAdvice):想让程序在运行的时候动态去实现某个接口,需要引入增强。

代码解释

//创建一个借口
public interface Cal {
public int add(int num1,int num2);
public int sub(int num1,int num2);
public int mul(int num1,int num2);
public int div(int num1,int num2);
} //创建一个接口的实现类
@Component
public class CalImpl implements Cal{ @Override
public int add(int num1, int num2) {
// TODO Auto-generated method stub
int result = num1+num2;
return result;
} @Override
public int sub(int num1, int num2) {
// TODO Auto-generated method stub
int result = num1-num2;
return result;
} @Override
public int mul(int num1, int num2) {
// TODO Auto-generated method stub
int result = num1*num2;
return result;
} @Override
public int div(int num1, int num2) {
// TODO Auto-generated method stub
int result = num1/num2;
return result;
} }

创建一个切面类

@Aspect  //表示切面类
@Component //表示将该类注入到IOC容器
public class LoggerAspect { @Before("execution(public int com.test.aspect.CalImpl.*(..))")
public void before(JoinPoint joinPoint){
//获取方法名
String name = joinPoint.getSignature().getName();
//获取参数列表
String args = Arrays.toString(joinPoint.getArgs());
System.out.println(name+"的参数是:"+args);
} @After("execution(public int com.test.aspect.CalImpl.*(..))")
public void after(JoinPoint joinPoint){
//获取方法名
String name = joinPoint.getSignature().getName();
System.out.println(name+"方法结束");
} @AfterReturning(value="execution(public int com.test.aspect.CalImpl.*(..))",returning="result")
public void afterReturn(JoinPoint joinPoint,Object result){
//获取方法名
String name = joinPoint.getSignature().getName();
System.out.println(name+"方法的结果是"+result);
} @AfterThrowing(value="execution(public int com.test.aspect.CalImpl.*(..))",throwing="ex")
public void afterThrowing(JoinPoint joinPoint,Exception ex){
//获取方法名
String name = joinPoint.getSignature().getName();
System.out.println(name+"方法抛出异常:"+ex);
} }

注解的解释:

1.@Before:表示方法执行的时机。

2.execution(public int com.test.aspect.CalImpl.*(..)):表示切入点是com.southwind.aspect包下CalImpl类中的所有方法。

XML注解配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 自动扫描 -->
<context:component-scan base-package="com.test.aspect"/> <!-- 使Aspect注解生效,为目标类自动生成代理对象 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>

XML不使用注解的方式

<!--将切面交给spring管理-->
<bean id="myAspect" class="com.test.ProductService.MyAspect"></bean>
<aop:config ref="myAspect">
<!--切入点-->
<aop:pointcut id="logrPoint"
expression=
"execution(* com.service.ProductService.*(..)) "/> <aop:aspect id="logAspect" ref="logAspect">
<aop:after pointcut-ref="logrPoint" method="log"/>
</aop:aspect>
</aop:config>

AOP的通知类型

在 Spring 中共有 5 类通知类型,用来分别表示切面在不同时候要做的工作。

  • 前置通知(Before Advice):在切入点选择的连接点处的方法之前执行的通知,该通知不影响正常程序执行流程(除非该通知抛出异常,该异常将中断当前方法链的执行而返回)。

  • 后置通知(After Advice):在切入点选择的连接点处的方法之后执行的通知(无论方法执行是否成功都会被调用)。

  • 后置返回通知(After returning Advice):在切入点选择的连接点处的方法正常执行完毕时执行的通知,必须是连接点处的方法没抛出任何异常正常返回时才调用。

  • 后置异常通知(After throwing Advice): 在切入点选择的连接点处的方法抛出异常返回时执行的通知,必须是连接点处的方法抛出任何异常返回时才调用异常通知。

  • 环绕通知(Around Advices):环绕着在切入点选择的连接点处的方法所执行的通知,环绕通知可以在方法调用之前和之后自定义任何行为,并且可以决定是否执行连接点处的方法、替换返回值、抛出异常等等。

Spring深入浅出(四)AOP面向切面的更多相关文章

  1. Spring Boot2(六):使用Spring Boot整合AOP面向切面编程

    一.前言 众所周知,spring最核心的两个功能是aop和ioc,即面向切面和控制反转.本文会讲一讲SpringBoot如何使用AOP实现面向切面的过程原理. 二.何为aop ​ aop全称Aspec ...

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

    一,AOP介绍 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开 ...

  3. Spring注解式AOP面向切面编程.

    1.AOP指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式.aop底层是动态代理. package com.bie.config; import org.aspectj.lan ...

  4. 【Spring 核心】AOP 面向切面编程

    一.什么是面向切面编程? 二.通过切点来选择连接点 三.使用注解创建切面 四.在XML中声明切面 五.注入AspectJ切面

  5. Spring Boot之AOP面向切面编程-实战篇

    目录 前言 编程范式主要有以下几类 引入pom依赖 aop注解 实现日志分割功能 前言 AOP是一种与语言无关的程序思想.编程范式.项目业务逻辑中,将通用的模块以水平切割的方式进行分离统一处理,常用于 ...

  6. spring总结————AOP面向切面总结

    spring总结————AOP面向切面 一.spring aop概念 spring aop面向切面编程,java是面向对象的语言. 真正的service层代码 业务逻辑层再处理业务之前和之后都要进行一 ...

  7. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  8. Spring:AOP面向切面编程

    AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. AOP是软件开发思想阶段性的产物,我们比较熟悉面向过程O ...

  9. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程   在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业.   ...

  10. 详细解读 Spring AOP 面向切面编程(二)

    本文是<详细解读 Spring AOP 面向切面编程(一)>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实 ...

随机推荐

  1. OC的动态继承编译机制

    [问]为什么OC不能sizeof一个对象的大小或一个类的大小?和类结构相近的结构体却能够. [再问]为什么OC不能将对象声明到静态空间,如栈中?和类结构相近的结构体却能够. [答]由于OC的动态继承编 ...

  2. ios学习--第三方框架-MBProgressHUD以及扩展

    MBProgressHUD提示框官网地址:https://github.com/jdg/MBProgressHUD 一. 模式 首先, MBProgressHUD有以下几种视图模式. typedef ...

  3. Pocket英语语法---四、should的同义词是谁

    Pocket英语语法---四.should的同义词是谁 一.总结 一句话总结:should表示劝告,建议,命令,其同义词是ought to,should强调主观看法,ought to强调客观要求.在疑 ...

  4. m_Orchestrate learning system---一、amazeui如何使用

    m_Orchestrate learning system---一.amazeui如何使用 一.总结 一句话总结:先花几分钟把所有功能稍微看一下,然后做的时候就会特别快,所以,多学习,学得越多做的越快 ...

  5. APP信息获取接口

    https://itunes.apple.com/lookup?id=APPID&callback=2 http://myapp.com/cgi-bin/mapp/mapp_info?type ...

  6. 如何在Windows下安装Linux子系统(Ubuntu,openSUSU,SUSU Linux Server)

    注意:只有win10才能安装,安装的linux没有图形界面. 1.首先在win10设置 --> 更新与安装 --> 针对开发人员 ,选择开发人员模式. 2.win10 Cortana -- ...

  7. 如何用一个app操作另外一个app.比如微信群控那样的

    如何实现一个app.控制另外的app,比如市面上群控微信的,是用测试工具的原理?还是什么模拟点击的原理? 如何用一个app操作另外一个app.比如微信群控那样的 >> android这个答 ...

  8. ASP.NET MVC 使用FluentScheduler做定时任务

    源代码地址: https://github.com/fluentscheduler/FluentScheduler 使用NuGet安装FluentScheduler 这是我实际项目中用到的代码,也可看 ...

  9. (五)Redux入门

    1 Redux概念简述 flux推出的时候有一些缺点.比如store可以存在多个,不是特别好用 于是逐渐进化为了redux. 2 Redux的工作流程 拿借书作举例: action creators是 ...

  10. POJ 2311 Cutting Game(SG函数)

    题目描述 意思就是说两个人轮流剪纸片,直到有一个人剪出1*1的方格就算这个人赢了.然后给出纸片的长和宽,求先手会赢还是会输 (1<=n,m<=200) 题解 看了一眼,这不是裸的SG吗 啪 ...