Spring AOP中的基本概念

栏目: 编程工具 · 发布时间: 8年前

内容简介:Spring AOP中的基本概念

引言

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

项目的目录结构

Spring 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 {

@Test

public 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将两者连接起来。

Spring AOP中的基本概念

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

Spring AOP中的基本概念

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

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

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

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

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

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

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

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

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-05/143775.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Lighttpd

Lighttpd

Andre Bogus / Packt Publishing / 2008-10 / 39.99

This is your fast guide to getting started and getting inside the Lighttpd web server. Written from a developer's perspective, this book helps you understand Lighttpd, and get it set up as securely an......一起来看看 《Lighttpd》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具