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. C#操作XML总结

    1.using System.Xml; using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xm ...

  2. iOS 私有变量 私有方法

    实例变量既可以在@interface中定义 也可以在@implementation中定义 在@implementation中的成员变量默认是私有的成员变量 并且和利用@private修饰的不太一样 在 ...

  3. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

  4. October 31st Week 45th Monday 2016

    While there is life there is hope. 一息若存,希望不灭. Go on living even if there is no hope. Knowing is not ...

  5. JAVA的模式对话框和非模式对话框

    周末的时候,一位网友让我帮他把他的无模式对话框改成有模式对话框. 界面是由swing制作的,都是JFrame,我从来没有接触过swing编程.大致的代码还是看的懂,很多都和C#很相似. 然后就去查资料 ...

  6. EditView 输入限制(软键盘限制)

    众所周知EditView有个inputType 属性可以设置输入的类型. 如下设置,则只能输入数字: android:inputType="number" 但是有时候需要自定义输入 ...

  7. “div+css”下拉菜单

    <style> html, body { margin: 0; padding: 0; } .btn-group{ font-size: 14px; position: relative; ...

  8. php抽奖代码

    1.经典概率算法抽奖 $tmpItems = ['电脑'=>10, '相机'=>50, '100元现金'=>500]; $proSum = array_sum($tmpItems); ...

  9. Jenkins 2.16.3默认没有Launch agent via Java Web Start,如何配置使用

    问题:Jenkins 2.16.3默认没有Launch agent via Java Web Start,如下图所示,而这种启动方式在Windows上是最方便的. 如何设置才能让出来呢? 打开&quo ...

  10. Linux内核--内核数据类型

    转自:http://www.linuxidc.com/Linux/2013-12/93637.htm 将Linux 移植到新的体系结构时,开发者遇到的若干问题都与不正确的数据类型有关.坚持使用严格的数 ...