springAOP中的基本概念

2024-08-26 15:58
文章标签 基本概念 springaop

本文主要是介绍springAOP中的基本概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   引言

   spring在近几年是一个非常流行的技术,其中的AOP的思想更是将spring推向了巅峰,有了AOP的思想我们在解决一些比较复杂的时候会变得比较简单,比如我们项目中的错误处理,权限控制等。下面小编会写几篇博客来总结一下AOP中的一些点,在这篇博客中主要介绍几个比较重要的概念,我们从一个比较原始的例子开始引出几个概念。

   项目的目录结构

                


   在PersonDao接口中就有一个简单的方法savePerson(),PersonDaoImpl实现PersonDao接口;

package com.itheima11.spring.proxy;public class PersonDaoImpl implements PersonDao{public void savePerson() {System.out.println("save person");}
}

   Transaction类模拟事务的控制:

package com.itheima11.spring.proxy;public class Transaction {public void beginTransaction(){System.out.println("begin transaction");}public void commit(){System.out.println("commit");}
}
   核心类MyInterceptor实现AOP思想:

package com.itheima11.spring.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 1、引入personDao和Transaction 2、完成invoke方法* * @author 郑浩* */
public class MyInterceptor implements InvocationHandler {private Object target;private Transaction transaction;public MyInterceptor(Object target, Transaction transaction) {this.target = target;this.transaction = transaction;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("savePerson") || method.getName().equals("updatePerson")) {this.transaction.beginTransaction();method.invoke(this.target, args);// 调用目标类的目标方法this.transaction.commit();} else {method.invoke(this.target, args);// 调用目标类的目标方法}return null;}
}

   客户端类:

package com.itheima11.spring.proxy;import java.lang.reflect.Proxy;import org.junit.Test;/***   问题:*      1、拦截器中的invoke方法在什么时候被调用的*         在代理对象调用方法的时候,进入了拦截器中的invoke方法*      2、拦截器中的method参数是什么?在什么时候由实参传递给形参的*         代理对象的方法的名称是什么,method参数就是什么*         代理对象调用方法的时候,进入了拦截器中的invoke方法,这个时候,传递参数*      3、生成的代理对象实现了接口,代理对象的方法体的内容是什么?*         方法体的内容就是拦截器中的invoke方法体的内容*//*** jdkproxy的优点*     动态的产生代理对象,所以只需要用一个拦截器就可以了* jdkproxy的缺点*     如果在invoke方法中做事务的判断,将是一件很复杂的事情*     程序员还是写拦截器了,写拦截器中的invoke方法了,所以invoke方法还需要修改*     *  说明:*      目标类和代理类实现了共同的接口* @author 郑浩**/
public class ProxyTest {@Testpublic void testProxy(){PersonDao target = new PersonDaoImpl();Transaction transaction = new Transaction();MyInterceptor interceptor = new MyInterceptor(target, transaction);/*** 第一个参数  目标类的类加载器* 第二个参数  目标类实现的所有的接口* 第三个参数  拦截器*/PersonDao personDao = (PersonDao)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), interceptor);personDao.savePerson();}
}
   上面的小Demo实现了AOP思想下的事务控制问题,也就是我们在对调用savePerson()方法的时候先开启事务,在操作完成以后,执行事务提交方法。但是目标类personDao和事务控制类Transaction彻底分离,两者互相不知道对方的存在,通过拦截器myInterceptor将两者连接起来。

  

   上面的思路就可以利用上面的简单图来描述,在上面图中就出现了几个比较重要概念,切面、通知、目标类、目标方法等等,这些概念在一些中文档中是比较难理解的,因为翻译过来都是比较抽象的,下面咱们就结合上面的例子来看看几个概念都在什么地位,完成了什么功能。

   

   目标类:就是我们需要完成的基本功能的类,就像上面例子中的PersonDao。

   目标方法:就是目标类中的方法,想savePerson()还可以有updatePerson()等等

   切面(Aspect):就是辅助目标类完成的一些类,像Transaction,还可以有日志(Logger),权限等。

   通知(Advice):切面中的方法就是通知

   连接点(Join point):在客户端调用目标类的那个方法,那个方法就是连接点。

   切入点(PointCut):从何处开始扫描切面,也就是必须满足切入点条件,才能让通知和目标方法结合在一起

   织入(Weaving):形成代理对象的过程就是织入;

   上面就是小编对springAop中几个比较常用的概念的理解,当然上面都是个人理解,上面的例子中没有使用配置文件的形式来完成AOP的过程,也就说在上面例子中需要开发自己手写拦截器和切入点。想想如果我们的业务比较复杂的时候,我们需要在拦截器中写很多的if。。。else。。这肯定是不可能,为了解决这个问题,在使用AOP的配置文件来实现的时候,就不用我们自己写拦截器,在下一篇博客中将介绍xml形式的AOP和几个通知。 


这篇关于springAOP中的基本概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109019

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

【Rocketmq入门-基本概念】

Rocketmq入门-基本概念 名词解释名称服务器(NameServer)消息队列(Message Queue)主题(Topic)标签(Tag)生产者(Producer)消费者(Consumer)拉取模式(Pull)推送模式(Push)消息模型(Message Model) 关键组件Broker消息存储工作流程 名词解释 名称服务器(NameServer) 定义: 名称服务器

springAOP 和 aspectJ 有什么区别

介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容?我在哪实现AOP?集成到我的应用是否很快?性能开销是多少? 本文中,我们将会着重回答这些问题,并介绍两款Java最流行的AOP框架:Spring AOP 和 AspectJ。 AOP概念 在我们开始之前,让我们对术语和核心概念做一个快速,高水平的回顾: Aspect切面:一个分布在应用程序中多个位置

数据结构的基本概念和术语的一些介绍

数据:是客观事物的符号表示,包括两种:                  数值型(整数,实数)和非数值型(文字,图形,声音 数据元素:是数据的基本单位,通常作为一个整体进行表示。                  与数据的关系:是数据集合的个体 数据项:组成数据元素的不可分割的最小单位。 以上三者的关系:数据>数据元素>数据项                  例如:学生表>个人记录>

【DL--05】深度学习基本概念—函数式模型

函数式模型 函数式模型算是本文档比较原创的词汇了,所以这里要说一下 在Keras 0.x中,模型其实有两种,一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。第二种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。可以看到,Sequentia

【DL--04】深度学习基本概念—data_format

data_format 这是一个无可奈何的问题,在如何表示一组彩色图片的问题上,Theano和TensorFlow发生了分歧,’th’模式,也即Theano模式会把100张RGB三通道的16×32(高为16宽为32)彩色图表示为下面这种形式(100,3,16,32),Caffe采取的也是这种方式。第0个维度是样本维,代表样本的数目,第1个维度是通道维,代表颜色通道数。后面两个就是高和宽了。这种t

【DL--03】深度学习基本概念—张量

张量 TensorFlow中的中心数据单位是张量。张量由一组成形为任意数量的数组的原始值组成。张量的等级是其维数。以下是张量的一些例子: 3 # a rank 0 tensor; this is a scalar with shape [][1. ,2., 3.] # a rank 1 tensor; this is a vector with shape [3][[1., 2., 3.]

【DL--02】深度学习基本概念--符号计算

符号计算 Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端。无论是Theano还是TensorFlow,都是一个“符号式”的库。 因此,这也使得Keras的编程与传统的Python代码有所差别。笼统的说,符号主义的计算首先定义各种变量,然后建立一个“计算图”,计算图规定了各个变量之间的计算关系。建立好的计算图需要编译以确定其内部细节,然而,此时的计算图还

数据结构 基本概念和述语

数据结构 基本概念和述语数据(data)数据元素(data element)数据项(data item)数据对象(data object)数据结构(data structure)逻辑结构与物理结构逻辑结构物理结构 抽象数据类型(Abstract Data Type, ADT):数据类型:抽象数据类型三元组的定义:抽象数据类型的表示与实现抽象数据类型Triplet的表示和实现: 算法和算法分析