初探AOP
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对象,设置切入点、增强类、方法等。
基于注解方式配置文件
<context:component-scan base-package="anno"/><aop:aspectj-autoproxy />
注意这里尽可能使用闭合标签,不要使用,否则无法正常切入<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
这里上传一个简单的基于注解方式的aop demo
applicationContext.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:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"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"><context:component-scan base-package="anno"/><aop:aspectj-autoproxy /></beans>
UserService.java
package anno;import org.springframework.stereotype.Service;@Servicepublic class UserService {public void add(){System.out.println("UserService add()");}public boolean delete(){System.out.println("UserService delete()");return true;}public void edit(){System.out.println("UserService edit()");int i = 5/0;}}
Operator.java
package anno;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;@Component@Aspectpublic class Operator {@Pointcut("execution(* anno..*.*(..))")public void pointCut(){}@Before("pointCut()")public void doBefore(JoinPoint joinPoint){System.out.println("AOP Before Advice...");}@After("pointCut()")public void doAfter(JoinPoint joinPoint){System.out.println("AOP After Advice...");}@AfterReturning(pointcut="pointCut()",returning="returnVal")public void afterReturn(JoinPoint joinPoint,Object returnVal){System.out.println("AOP AfterReturning Advice:" + returnVal);}@AfterThrowing(pointcut="pointCut()",throwing="error")public void afterThrowing(JoinPoint joinPoint,Throwable error){System.out.println("AOP AfterThrowing Advice..." + error);System.out.println("AfterThrowing...");}@Around("pointCut()")public void around(ProceedingJoinPoint pjp){System.out.println("AOP Aronud before...");try {pjp.proceed();} catch (Throwable e) {e.printStackTrace();}System.out.println("AOP Aronud after...");}}
Test.java
package anno;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");UserService userService = (UserService) ctx.getBean("userService");userService.add();}}
运行结果
扩展思考
1、 基于注解与基于配置文件的优缺点.
优点:
注解能减少配置的工作,而且配置信息和JAVA代码放在一起,有助于增强程序的内聚性。相对于XML配置文件进行配置文件和程序文件的切换,用注解方式,能提高开发的连贯性,和提成开发效率。
缺点:
程序复杂的话,还是使用xml配置文件的方式,这样可读性和可维护性比较强。
7. 参考文献
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的更多相关文章
- 漫谈AOP开发之初探AOP及AspectJ的用法
一.为什么需要AOP技术 AOP 是一个很成熟的技术. 假如项目中有方法A.方法B.方法C……等多个方法, 如果项目需要为方法A.方法B.方法C……这批方法增加具有通用性质的横切处理. 下图可以形 ...
- 对Spring.Net的AOP一些思考及应用
前言 这几天在配置Spring.NET,配到AOP的时候发现自己现在还是没有理解到Spring AOP的实现,只是认识到了一个思想,以前配的时候,看的是给好的例子用,真正用的时候还是要想一下 ...
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...
- Aop的基本介绍
基本概念 通知 就是你想要的功能,也就是我们常说的安全.事物.日志等.先定义好这些,然后再想用的地方用一下.包含Aspect的一段处理代码 注意:其实这些功能(通知)并不是我们业务逻辑所必须的,只是 ...
- spring---aop(1)---AOP概念
写在前面 由于spring的事务系列,可以带出spring的aop.spring的事务只是spring的一个具体实现 名词解释 通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物 ...
- [转]AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充 ...
- AOP术语分析
初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂. 通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物.日子等.你给先定义好,然后再想用的地方用一下.包含Aspect的一段 ...
- Spring AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)(转)
1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难.当我看进去以后, ...
- Spring 梳理 - AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)
Spring AOP那些学术概念—通知.增强处理连接点(JoinPoint)切面(Aspect) 1.我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是 ...
- Java核心知识体系4:AOP原理和切面应用
1 概述 我们所说的Aop(即面向切面编程),即面向接口,也面向方法,在基于IOC的基础上实现. Aop最大的特点是对指定的方法进行拦截并增强,这种增强的方式不需要业务代码进行调整,无需侵入到业务代码 ...
随机推荐
- drools规则的入门使用
1:pom文件 <!--drools--><dependency> <groupId>org.drools</groupId> <artifact ...
- java将Word转换成PDF方法
转载1:java将Word转换成PDF三种方法_pdfoptions_Zhsh-7的博客-CSDN博客 转载2:POI 实现 word转成pdf - 挽留匆匆的美丽 - 博客园 (cnblogs.co ...
- 使用 FreeSSL 申请免费证书
官网 https://freessl.cn/ 首先,注册一个账户 然后登录 输入自己的域名,选择第2个"亚洲诚信"(1年),然后点击"创建免费SSL证书"按钮 ...
- springboot gradle 加速问题
初始化项目使用阿里云 seriver url : https://start.spring.io 直接修改为: https://start.aliyun.com 关键的gradle 修改安装包地址 g ...
- 批量修改excel中超链接
打开需要处理的excel文件 alt + F11打开VB编辑器 双击打开对应的sheet 编辑如下代码 Dim oldfile As String Dim Newfile As String Sub ...
- make vscode portable together with its extensions
0. the goal make vscode poratable together with its extensions, so that the offline pc could make us ...
- go 使用mysql
package main /* 下划线(如:import _ hello/imp)的作用:当导入一个包时,该包下的文件里所有init()函数都会被执行, 然而,有些时候我们并不需要把整个包都导入进来, ...
- windows2012安装.net4.7.2
第一步,下载.net4.7.2安装包 离线包:https://download.visualstudio.microsoft.com/download/pr/1f5af042-d0e4-4002-9c ...
- 如何完整卸载sketchup草图大师?
如何完整卸载sketchup草图大师?完全彻底卸载删除干净sketchup各种残留注册表和文件的方法和步骤.如何卸载sketchup呢?有很多同学想把sketchup卸载后重新安装,但是发现sketc ...
- SpringBoot启动流程简要分析
声明 源码基于Spring Boot 2.3.12.RELEASE 背景 此文的目的主要想弄明白为什么在Spring Boot中注册Servlet.Filter.Listener组件时需要加上@Ser ...