AOP简介:

  面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。面向对象编程是从【静态角度】考虑程序的结构,而面向切面编程是从【动态角度】考虑程序运行过程。AOP底层,就是采用【动态代理】模式实现的。采用了两种代理:JDK动态代理和CGLIB动态代理。

AOP是一种思想,而非实现AOP是基于OOP,而又远远高于OOP,主要是将主要核心业务和交叉业务分离。


前提:导入jar包

一:通过代理工厂ProxyFactoryBean进行以下配置。

   (1)前置后置增强

    首先创建一个接口:自定义方法 

public interface ISomeService {
//开启事务
public void doTran();
//记录日志
public String doLog();
}

  进行接口实现,书写业务。

//核心业务

@Override
public void doTran() {
System.out.println("开启事务");
} @Override
public String doLog() {
System.out.println("书写日志");
return "hehe";
}

  定义前置通知类,实现接口MethodBeforeAdvice。(前置)AfterReturningAdvice(后置)

  配置applicationContext.xml。

  测试类:

  实现效果:


(2)环绕通知  MethodInterceptor

   环绕增强在目标方法的前后都可以织入增强处理。环绕增强是功能最强大的强大处理。Spring把目标方法的控制权全部交给了他。在环绕增强处理中,可以获取或修改目标方法的参数、返回值、可以对它进行异常处理,甚至可以决定目标方法是否执行。 

配置applicationContext.xml。

实现效果:

通过MethodInterceptor接口实现了环绕增强。该接口要求实现invoke()方法,其参数MethodInvocation不但封装目标方法及其参数组,还封装了被代理目标对象。通过proceed()方法可以调用目标对象的相应方法,从而实现对目标方法的完全控制!


(3)异常通知:ThrowsAdvice

注意:实现该接口没有重写方法ThrowsAdvice,并且它的父类,再上一类都没有方法,我们要在他的自身约束中进行获取。

实现类书写错误信息:

配置applicationContext.xml。

测试类:  

若将异常抛给上级处理,则在控制台通过,单测报错,若将异常手动抛出,则相反


二、顾问Advisor

顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能。PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。
PointcutAdvisor接口有两个较为常用的实现类:
*:NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问
*:  RegexpMethodPointcutAdvisor 正则表达式匹配方法切入点顾问
<property name="pattern" value=".*do.*"></property> 表示方法全名(包名,接口名,方法名)
运算符名称意义:
.    点号 表示任意单个字符
+   加号 表示前一个字符出现一次或者多次
*    星号 表示前一个字符出现0次或者多次

如何实现:

同理:定义接口和实现类,并自定义方法。以及前置增强的类。关键点在Spring配置文件

①名称匹配方法切入点顾问

② 正则表达式匹配方法切入点顾问


三、自动代理生成器 

注意:默认Advisor自动代理生成器,切面只能是顾问,对所有的对象都增强 

 两种实现方式:

 ① 默认Advisor自动代理生成器 DefaultAdvisorAutoProxyCreator

 ② BeanName自动代理生成器 BeanNameAutoProxyCreator

 在这里 无需配置代理工厂bean,测试类getBean()取的id是配置文件的被代理对象

 切面只能是顾问的情况下:

 实现效果:

两者都兼得的情况下:

实现效果:

测试类:

public class Test01 {
@Test
public void proxyTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
ISomeService ser=(ISomeService) ctx.getBean("some");
ser.tran();
ser.log();

四、Spring的经典AOP配置方案、使用的是Aspectj第三方框架,实现了AOP思想。注解配置的AOP,纯POJO <aop:config>

具体步骤:
   ① 在项目中添加SpringAOP相关的JAR文件

   ②使用注解定义前置增强和后置增强实现日志功能

   ③编写Spring配置文件,织入注解定义的增强

   ④编写代码获取带有增强处理的业务对象

核心JAR包:

实现思路:

 1、定义接口实现类,并重写该方法

public interface ISomeService {
    public void list();
}
public class SomeService implements ISomeService{

    public void list() {
System.out.println("SomeService.list()");
} }

2、通过注解实现增强,自定义类

     使用@Aspect注解将该类定义为切面,并且使用@Before注解将该方法定义为前置增强,增强定义完后,就可以在Spring配置文件中织入使用注解定义的增强了

@Aspect
public class MyAspectj {
@Before(value = "execution(* *..service.*.*(..))")
public void MyBeforeAdvice(){
System.out.println("==before==");
}
}

3、applicationContext.xml配置文件

4、进行测试:

public class Test01 {
@Test
public void proxyTest(){
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
ISomeService ser=(ISomeService) ctx.getBean("someService");
ser.list(); }

实现效果: 


五:Aspectj第三方框架,使用xml进行配置

  

  首先建立一个纯净的MyAspect类。

  唯一不同的就是在applicationContext.xml配置文件中进行配置。

  

  测试类:

  


※※※补充点:

切入点表达式:
 execution(【modifiers-pattern?】 访问修饰符
 ret-type-pattern 返回值类型
【declaring-type-pattern?】 全限定性类名
 name-pattern(param-pattern) 方法名(参数名) 包名.类型名.方法名
【throws-pattern?】) 抛出异常类型

切入点表达式要匹配的对象就是目标方法的方法名。所以,execution表达式中明显就是方法的签名。

注意:表达式中加[]的部分表示可省略部分,各部分间用空格分开。在其中可以使用以下符号:
符号意义:
*    0至多个任意字符
..    用在方法参数中,表示任意多个参数
      用在包名后,表示当前包及其子包路径
+    用在类名后,表示当前类及其子类
      用在接口后,表示当前接口及其实现类
案例:
execution(public * *(..)) 指定切入点为:任意公共方法
execution(* set*(..)) 指定切入点为:任何一个以"set"开始的方法 


拥有梦想只是一种智力,实现梦想才是一种能力。

               ---告诫自己

Spring中Aop的扩展及剖析的更多相关文章

  1. 框架源码系列十:Spring AOP(AOP的核心概念回顾、Spring中AOP的用法、Spring AOP 源码学习)

    一.AOP的核心概念回顾 https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/core.html#a ...

  2. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  3. Spring中AOP相关的API及源码解析

    Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...

  4. Spring中AOP原理,源码学习笔记

    一.AOP(面向切面编程):通过预编译和运行期动态代理的方式在不改变代码的情况下给程序动态的添加一些功能.利用AOP可以对应用程序的各个部分进行隔离,在Spring中AOP主要用来分离业务逻辑和系统级 ...

  5. Spring中AOP简介与切面编程的使用

    Spring中AOP简介与使用 什么是AOP? Aspect Oriented Programming(AOP),多译作 "面向切面编程",也就是说,对一段程序,从侧面插入,进行操 ...

  6. Spring 中aop切面注解实现

    spring中aop的注解实现方式简单实例   上篇中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了. 注解方式实现aop我们 ...

  7. Spring中AOP相关源码解析

    前言 在Spring中AOP是我们使用的非常频繁的一个特性.通过AOP我们可以补足一些面向对象编程中不足或难以实现的部分. AOP 前置理论 首先在学习源码之前我们需要了解关于AOP的相关概念如切点切 ...

  8. AOP 与 Spring中AOP使用(上)

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

  9. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

随机推荐

  1. appium 滑动

    前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html   知乎Android客户端登陆:htt ...

  2. urlencode遇到中文编码问题

    urlencode并不会改变输入的编码格式, 默认会将中文输出为 gbk 编码, 类似的, quote 会对中文进行 gbk 编码 不过, 当遇到嵌套多层的字典时, 问题就来了, 中文会被 utf8 ...

  3. 安卓真机调试 出现Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE....

    [2016-08-20 14:38:39 - hybrid-android] Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE[2016-0 ...

  4. 存储过程 Row_number() 分页

    ---恢复内容开始--- 自己之前一直是使用的通用的存储过程 ,也是封装好的只要传表名 + 条件 等等 来到新环境 让自己写一个存储过程, 没办法 自己就需要写一个咯 之前写的比较多的是 按 top ...

  5. ubuntu下命令杂项

    一. 1.用sudo apt-get install python3-numpy之后,会默认把numpy安装到  /usr/lib/python3/dist-packages目录下,而且版本比较低. ...

  6. 移动wap隐藏的坑

    非原创,只做转载 ------------------------------------------------------------------------------------------- ...

  7. ubuntu下设置数据库字符集

    就linux环境下出现的数据库乱码的问题,以ubuntu为例进行的总结 ubuntu环境设置的字符集utf8,windows默认字符集是GBK,Ubuntu的默认字符集为utf-8,这使 得在用tel ...

  8. XML 特殊字符

    XML转义字符 以下为XML标志符的数字和字符串转义符 "     (" 或 ") '     (' 或 &apos;) &     (& 或 & ...

  9. C#基础,C#基础知识点,基础知识点迅速巩固

    一.方法(结构.数组.冒泡排序.3个参数重载) 1将string转换为int类型 Convert.ToInt32(); int.Parse() ; int.TryParse()三种方式. 2 结构:可 ...

  10. oracle undo回滚段详解

    1.Undo是干嘛用的?   在介绍undo之前先说一下另外一个东西 transaction ,翻译成交易或事务.我们在进行一个事务的过程中需要申请许多资源,一个复杂的事务也需要很多步来完成.那么一个 ...