1.背景介绍

1、什么是AOP

1)在OOP(面向对象编程)中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加。

 2)AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为“切面”(Aspect)

3)切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性、提高了开发的效率和程序的可复用性。

2、AOP与OOP的区别

1)AOP可以说是OOP(面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。 

 2)不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系 

 3)例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting)。

4)在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

3、AOP的思想

1) AOP的核心思想是帮助我们在扩展功能(方法)时可以不依靠修改源代码来实现。

2)其采取横向抽取机制,规避了传统面向对象中纵向继承体系的重复性高耦合代码。

2.知识剖析

1、为什么要使用aop 

             1)为了方便,用了aop能让你少写很多代码 

             2)为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。 

             3)为了降低之前传统面向对象中采用纵向继承体系增强方法导致的耦合度过高的问题: 

             4)提高了代码的复用性

2、浅析AOP思想的发展及原理

发展:修改源代码————采用OOP纵向继承体系————采用AOP横向织入  

 实现原理:通过动态代理创建代理对象来实现,默认使用Java动态代理来创建AOP代理,当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理

3、aop专业术语

1.通知(Advice):通知定义了切面是什么以及何时使用;里面就是增强方法的逻辑,分为前置增强,后置增强,环绕增强,最终增强,异常增强。  

2.连接点(JoinPoint):连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时,抛出异常时,甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程中,并添加新的行为。 

3.切入点(Pointcut)*:切点有助于缩小切面所通知的连接点的范围。(何处)

4.切面(Aspect)*:切面是通知和切点的结合。通知和切点定义了切面的全部内容——它是什么,在何时何处完成其功能。 

5.目标(target):被增强的方法所在的那个类,也就是真正的业务逻辑,他可以在毫不知情的情况下,被织入切面。而自己专注于业务本身的逻辑。 

6.代理(proxy):目标类被增强后产生的代理类

7.织入(weaving):把增强应用到目标类的过程 

8:引入(Introduction) 引入允许我们向现有的类添加新方法或属性,从而无需修改这些现有类的情况下,让他们具有新的行为和状态

4、通知类型介绍

(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可

 (2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值 

(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名 来访问目标方法中所抛出的异常对象

(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式 

   (5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

3、常见问题

1、实现AOP的方式有哪些?

2、实现增强的方法有那些?

3、在确定好需要增强的方法之后,切入点的定位是如何完成的  

4、使用@Aspect对SSM进行切入,统计运行时间。

4.解决方案

1):实现AOP的方式有哪些?

            在sring里面进行aop操作,使用aspectJ(AspectJ是一种扩展Java)来实现。aspectJ本身是一个单独的面向切面的框架,里面定义了AOP语法,不是spring的一部分,和spring协同完成springAOP的操作,使用aspectJ来实现springAOP的操作有两种方式

            1:继承的类的方式(不推荐)

            2:基于aspectJ的xml文件

            3.基于aspectJ注解

2):实现增强的方法有那些?

            织入

            引入

3):在确定好需要增强的方法之后,切入点的定位是如何完成的 

            可以用execution表达式来解决(常用)

            也可以用xml配置,使用RegexpMethodPointcutAdvisor,来定义切点。

            1.execution(* com.aop.add(..))

            2.匹配所有save开头的方法:execution(* save*(..))

4):使用@Aspect对SSM进行切入,统计运行时间。

            在编码实战的时候讲讲。

5.编码实战

基于xml配置文件配置

需要创建aop对象,设置切入点、增强类、方法等。

基于注解方式配置文件

 
  1. <context:component-scan base-package="anno"/>

  2. <aop:aspectj-autoproxy />

注意这里尽可能使用闭合标签,不要使用,否则无法正常切入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

这里上传一个简单的基于注解方式的aop demo

applicationContext.xml
 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  4. xmlns:context="http://www.springframework.org/schema/context"

  5. xmlns:aop="http://www.springframework.org/schema/aop"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

  7. <context:component-scan base-package="anno"/>

  8. <aop:aspectj-autoproxy />

  9. </beans>

UserService.java
 
  1. package anno;

  2. import org.springframework.stereotype.Service;

  3. @Service

  4. public class UserService {

  5. public void add(){

  6. System.out.println("UserService add()");

  7. }

  8. public boolean delete(){

  9. System.out.println("UserService delete()");

  10. return true;

  11. }

  12. public void edit(){

  13. System.out.println("UserService edit()");

  14. int i = 5/0;

  15. }

  16. }

Operator.java
 
  1. package anno;

  2. import org.aspectj.lang.JoinPoint;

  3. import org.aspectj.lang.ProceedingJoinPoint;

  4. import org.aspectj.lang.annotation.*;

  5. import org.springframework.stereotype.Component;

  6. @Component

  7. @Aspect

  8. public class Operator {

  9. @Pointcut("execution(* anno..*.*(..))")

  10. public void pointCut(){}

  11. @Before("pointCut()")

  12. public void doBefore(JoinPoint joinPoint){

  13. System.out.println("AOP Before Advice...");

  14. }

  15. @After("pointCut()")

  16. public void doAfter(JoinPoint joinPoint){

  17. System.out.println("AOP After Advice...");

  18. }

  19. @AfterReturning(pointcut="pointCut()",returning="returnVal")

  20. public void afterReturn(JoinPoint joinPoint,Object returnVal){

  21. System.out.println("AOP AfterReturning Advice:" + returnVal);

  22. }

  23. @AfterThrowing(pointcut="pointCut()",throwing="error")

  24. public void afterThrowing(JoinPoint joinPoint,Throwable error){

  25. System.out.println("AOP AfterThrowing Advice..." + error);

  26. System.out.println("AfterThrowing...");

  27. }

  28. @Around("pointCut()")

  29. public void around(ProceedingJoinPoint pjp){

  30. System.out.println("AOP Aronud before...");

  31. try {

  32. pjp.proceed();

  33. } catch (Throwable e) {

  34. e.printStackTrace();

  35. }

  36. System.out.println("AOP Aronud after...");

  37. }

  38. }

Test.java
 
  1. package anno;

  2. import org.springframework.context.ApplicationContext;

  3. import org.springframework.context.support.ClassPathXmlApplicationContext;

  4. public class Test {

  5. public static void main(String[] args) {

  6. ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

  7. UserService userService = (UserService) ctx.getBean("userService");

  8. userService.add();

  9. }

  10. }

运行结果

扩展思考

1、 基于注解与基于配置文件的优缺点.

            优点:

            注解能减少配置的工作,而且配置信息和JAVA代码放在一起,有助于增强程序的内聚性。相对于XML配置文件进行配置文件和程序文件的切换,用注解方式,能提高开发的连贯性,和提成开发效率。

            缺点:

            程序复杂的话,还是使用xml配置文件的方式,这样可读性和可维护性比较强。

7.    参考文献

https://www.cnblogs.com/liuruowang/p/5711563.html

https://www.cnblogs.com/hongwz/p/5764917.html

https://blog.csdn.net/zghwaicsdn/article/details/50957474

8.    更多讨论

1、 基于注解与基于配置文件的优缺点有哪些?

            优点:

            注解能减少配置的工作,而且配置信息和JAVA代码放在一起,有助于增强程序的内聚性。相对于XML配置文件进行配置文件和程序文件的切换,用注解方式,能提高开发的连贯性,和提成开发效率。

            缺点:

            程序复杂的话,还是使用xml配置文件的方式,这样可读性和可维护性比较强。

2、实现AOP的方式有哪些?

            在sring里面进行aop操作,使用aspectJ(AspectJ是一种扩展Java)来实现。aspectJ本身是一个单独的面向切面的框架,里面定义了AOP语法,不是spring的一部分,和spring协同完成springAOP的操作,使用aspectJ来实现springAOP的操作有两种方式

            1:继承的类的方式(不推荐)

            2:基于aspectJ的xml文件

            3.基于aspectJ注解

3、实现增强的方法有那些?

            织入

            引入

两种方式

初探AOP的更多相关文章

  1. 漫谈AOP开发之初探AOP及AspectJ的用法

    一.为什么需要AOP技术 AOP 是一个很成熟的技术. 假如项目中有方法A.方法B.方法C……等多个方法, 如果项目需要为方法A.方法B.方法C……这批方法增加具有通用性质的横切处理.   下图可以形 ...

  2. 对Spring.Net的AOP一些思考及应用

    前言      这几天在配置Spring.NET,配到AOP的时候发现自己现在还是没有理解到Spring AOP的实现,只是认识到了一个思想,以前配的时候,看的是给好的例子用,真正用的时候还是要想一下 ...

  3. Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...

  4. Aop的基本介绍

    基本概念 通知  就是你想要的功能,也就是我们常说的安全.事物.日志等.先定义好这些,然后再想用的地方用一下.包含Aspect的一段处理代码 注意:其实这些功能(通知)并不是我们业务逻辑所必须的,只是 ...

  5. spring---aop(1)---AOP概念

    写在前面 由于spring的事务系列,可以带出spring的aop.spring的事务只是spring的一个具体实现 名词解释 通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物 ...

  6. [转]AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充 ...

  7. AOP术语分析

    初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂. 通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物.日子等.你给先定义好,然后再想用的地方用一下.包含Aspect的一段 ...

  8. Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)(转)

    1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...

  9. Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

    Spring  AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect)   1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...

  10. Java核心知识体系4:AOP原理和切面应用

    1 概述 我们所说的Aop(即面向切面编程),即面向接口,也面向方法,在基于IOC的基础上实现. Aop最大的特点是对指定的方法进行拦截并增强,这种增强的方式不需要业务代码进行调整,无需侵入到业务代码 ...

随机推荐

  1. 手写g++编译命令行工具笔记

    基本想法 为什么要写 CPPRUN: 如果要开警告开关,敲完整的编译代码还挺麻烦的 想要编译与运行一次性完成 Windows 的控制台本来是 cmd,后来有了 Powershell,但是后者不能用 & ...

  2. Task :app:lintVitalRelease FAILED

    错误信息:Task :app:lintVitalRelease FAILED 问题原因:dl.google.com 无法连接 解决办法: 修改hosts(推荐)通过在线查询ip网站,找到dl.goog ...

  3. ubuntu 20.04使用kubeadm安装k8s集群

    本文主要用于记录,步骤参考了:https://blog.csdn.net/weixin_44559544/article/details/123381441 一.设备相关准备 1.修改节点主机名,这样 ...

  4. anaconda新建的虚拟环境更改默认位置

    anaconda虚拟环境默认安装位置 https://blog.csdn.net/weixin_48373309/article/details/127830801 vscode中切换路径问题 在vs ...

  5. oracle导出csv文件后导入mysql

    场景: oracle数据库中有与mysql同名表,需要将oracle表数据导入mysql,需要手工操作 工具: navicat premium 解决方案: 1.使用plsql工具从oracle导出cs ...

  6. c语言创建线程的函数封装

    头文件xxx.h #include <stdlib.h> #include <pthread.h> #include <string.h> typedef int ...

  7. 实验1task4

    <实验结论> #include <stdio.h> #include <stdlib.h> int main() { int x, t, m; x = 123; p ...

  8. ts(typescript)讲解for , for...in..., for...of..., while, every, some, map, filter

    for  一般用于已知循环次数 var num:number = 5; var i:number; var factorial = 1; for(i = num;i>=1;i--) { fact ...

  9. 解决: 无法打开明确指定的数据库“SSISDB”, 用户 'NT Service\SSISScaleOutMaster150' 登录失败.

    环境: WindowsServer2019Datacenter  SQL Server2019  SSMSv18 事情: SQL安装完成后, 发现系统日志中有如下报错:   解决: 无法打开明确指定的 ...

  10. 安装oracle出现环境不满足最低要求

    安装win64_11gR2_database_1of2的时候出现这个,百度了下解决方法 在oracle安装包找到stage文件夹 然后找到cvu 然后在cvu里面找到cvu_prereq,用记事本打开 ...