关于面向切面编程(Spring AOP),是在java面试中经常提及的,只有在充分理解了,日常工作中才能得心应手。

如何理解AOP呢?首先我们要思考为什么要使用切面编程,如下图:

对于一个系统来说保存用户信息、权限分配的时候,我们会有数据库事务,保存要么同时成功,要么同时失败,用户信息、权限分配是面向对象设计的类对象,是横向的;数据库事

务是纵向的,像切面一样把他们切开。在编程中我们会发现:数据库的开闭,事务的管理是通用的,AOP可以抽取出来实现,简化我们的编程。

在Springboot中,javaBean是提供一个更强大的配置功能来增强JavaBean的功能,在java编程中,使用数据库时会写大量jdbc的try-catch代码,这个时候我们就能使用AOP编程将这些代码抽取出来,简化代码。

下面就用一个小实例初步理解面向切面编程(代码按照文末工程目录结构复制即可运行展示效果):

首先我们理解什么是动态代理模式:当你需要采访一名儿童的时候,首先你需要经过他的父母的同意,在一些问题上父母也许会替他回答,而对于另一些问题,也许父母觉得不太适合这个小孩会拒绝掉,这个时候小孩的父母就是他的代理(proxy)了。

动态代理的定义:生成一个占位,又称代理对象来代理目标对象,可以增强或者控制对孩子这个真实对象的访问。

1.约定编程,新建一个DinnerService接口

package com.springboot.chapter4.service;/*** @Auther: * @Date: 2019/3/17 09:56* @Description:*/
public interface DinnerService {public void eatDinner(String name);
}

再写一个DinnerService的实现类DinnerServiceImpl

package com.springboot.chapter4.service.impl;import com.springboot.chapter4.service.DinnerService;/*** 描述:** @author * @create 2019-03-17 9:58*/
public class DinnerServiceImpl implements DinnerService {@Overridepublic void eatDinner(String name) {if(name == null || name.trim() == ""){throw new RuntimeException("parameter is null");}System.out.println("hello"+name);}
}

2.在JDK中提供了类Proxy的静态方法newProxyInstance作为代理对象,我们让代理类EatProxy通过实现InvocationHandler接口来实现代理功能,代码如下:

package com.springboot.chapter4.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 描述:** @author * @create 2019-03-17 17:07*/
public class EatProxy implements InvocationHandler {//   引入目标对象:目的是吃晚餐private Object target;public static Object bind(Object target) {EatProxy eatProxy = new EatProxy();eatProxy.target = target;Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),eatProxy);return proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("饭前洗手");Object obj = method.invoke(target, args);System.out.println("收拾饭菜");System.out.println("收拾餐具");return obj;}
}

其中重写的invoke方法作为代理处理逻辑来处理业务

3.再写一个主函数AopMain

package com.springboot.chapter4.main;import com.springboot.chapter4.proxy.EatProxy;
import com.springboot.chapter4.service.DinnerService;
import com.springboot.chapter4.service.impl.DinnerServiceImpl;/*** 描述:** @author * @create 2019-03-17 14:35*/
public class AopMain {public static void main(String[] args) {DinnerService dinnerService = new DinnerServiceImpl();DinnerService eatProxy = (DinnerService) EatProxy.bind(dinnerService);eatProxy.eatDinner("晚饭好吃");}
}

4.运行程序则可以看到”hello晚上吃饭“已经被调用,即我们第1步实现的接口代码已经被织入到约定的流程中。

项目工程截图如下:

spring aop实例讲解_小实例理解Spring中的AOP----面向切面编程相关推荐

  1. aop执行跳过某个方法_简谈前端开发中的AOP(一) -- 前端AOP的实现思路

    前言 本意不想用太长的篇幅,来阐述这个话题.但是有些概念和设计思路有必要讲清楚,以便于搞清楚其深层次的内在逻辑.这是我一直遵从的"知其然,知其所以然"的原则.首先,本文将简单的阐述 ...

  2. 简单理解AOP(面向切面编程)

    来源:http://www.cnblogs.com/jyh317/p/3834271.html AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式 ...

  3. Spring AOP 面向切面编程

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

  4. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  5. Spring Boot AOP面向切面编程使用(定义切入点、前置通知、后置通知、返回通知、异常通知、环绕通知)

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

  6. Spring aop面向切面编程概述

    aop概述 1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统一维护的一种技术.使代码耦合性降低,提高 ...

  7. 一篇文搞懂《AOP面向切面编程》是一种什么样的体验?

    写在前面 hello,大家好,我是灰小猿,一个超会写bug的程序猿! 近期一直在准备秋招和技术,所以写文的频率有些下降,但是这也依然阻挡不了我要和大家一起分享技术的热情呀. 之前在专栏<SSM编 ...

  8. 第七篇 - 手写Aop(面向切面编程)

    Github源码下载地址:https://github.com/chenxingxing6/sourcecode/tree/master/code-springaop 一.前言 AOP为Aspect ...

  9. 【ABP杂烩】面向切面编程(AOP)知识总结

    目录 1.存在问题 2.AOP的概念 3.AOP应用范围 3.AOP实现方式 4.应用举例 5.结束语 本文在学习[老张的哲学]系列文章AOP相关章节后,自己归纳总结的笔记. 1.存在问题 最近,其它 ...

最新文章

  1. RedHat9.0下载地址
  2. HashMap的getOrDefault()方法
  3. .NET英文技术文章导读(2017-02-09)
  4. 爱国者D5移动电源改造
  5. 51nod 1600 Simplr KMP(后缀自动机+维护树上的数据结构)
  6. 成功的换心手术——Windows Phone 8 发布
  7. matlab里插入行和列
  8. java 自定义报表_设计好的报表是如何在 web 上显示的
  9. Gradle笔记——构建基础
  10. 在MATLAB下安装Matpower模块
  11. 20个优秀的 HTML5 网站设计案例欣赏
  12. ad模数转换采集电压程序c语言,单片机怎么通过AD转换得到电压值
  13. HTML代码 可在线运行查看效果的HTML在线编辑器
  14. 世界 6 大航空动力巨头企业
  15. MFC AFX_EXT_CLASS
  16. 5.jQuery动画
  17. 给天空“染个色”?摄影后期时进行的一些思考
  18. 苹果手机二手最新价格
  19. AD接口测试工装研究
  20. 基因表达数据中信息基因和基因调控网络 第六周报告

热门文章

  1. android 引用jar的r文件,正确的方法来处理Android库的ant构建. Build从jar文件中排除R.class...
  2. Python中a和a[:]有什么区别?
  3. Python基础教程:绑定方法和非绑定详细用法
  4. 打印 Python 的一切 —— pprint beeprint
  5. python函数名第一类方法、f-string格式化、迭代器及递归函数
  6. python3字符串的常见操作
  7. 阻塞、非阻塞、超时(同步与异步)
  8. ABI 与 API 的区别(应用程序二进制接口、应用程序编程接口)
  9. Linux进程地址空间与进程内存布局详解,内核空间与用户空间
  10. Intel Realsense深度摄像头的自校准功能(self-calibration-for-depth-cameras)