上期,我们看到有小伙伴留言说希望讲讲AOP

然后......

别激动,来得及

什么是AOP


AOP是Spring 框架的一个关键组件,全称为Aspect-OrientedProgramming(面向切面编程),目前已是一种比较成熟的编程方式。

AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在编译或运行的时候,再将这些代码应用到需要执行的地方。

注:提取出来的代码应用到需要执行的地方,并不会把源代码加到需要的地方执行,即源代码文件不会更改,但是它会影响最终的机器编译代码

意思就是,有一些通用功能的代码可以提取出来,然后在使用的时候应用进去就可以了,比如表单验证和日志记录等等

AOP术语


Aspect(切面)

通常指封装起来用于插入到指定位置实现某项功能的类

Join point(连接点)

在SpringAOP中,连接点指方法的调用

Pointcut(切入点)

切面与程序流程的交叉点,即那些需要处理的连接点,通常在程序中,切入点指的是类或者方法名

Advice(通知/增强处理)

就是程序实际运行之前或之后执行的方法,也就是AOP加入的代码

Target Object(目标对象)

即需要加入AOP代码的对象

Proxy(代理)

AOP框架动态生成的一个对象,该对象可以作为目标对象使用

Weaving(织入)

把切面连接到其它的应用程序类型或者对象上,并创建一个需要Advice对象的过程

看不懂就先往下看,关于术语等自己会了,自然就好理解多了

这时......

阿音过来知道了小知在学AOP

于是......

阿音非要展示一个关于AOP的小例子

UserDao接口

package com.aop.jdk;

public interface UserDao {

 public void addUser();

}

  

UserDaoImpl

package com.aop.jdk;

public class UserDaoImpl implements UserDao {

 @Override
public void addUser() { System.out.println("新增用户");
} }

JdkProxy

package com.aop.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; import com.aop.aspect.MyAspect; /**
* JDK代理类
*/
public class JdkProxy implements InvocationHandler{ // 声明目标类接口
private UserDao userDao; // 创建代理方法
public Object createProxy(UserDao userDao) { this.userDao = userDao; // 1.类加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader(); // 2.被代理对象实现的所有接口
@SuppressWarnings("rawtypes")
Class[] clazz = userDao.getClass().getInterfaces(); // 3.使用代理类,进行增强,返回的是代理后的对象
return Proxy.newProxyInstance(classLoader,clazz,this); } /*
* 所有动态代理类的方法调用,都会交由invoke()方法去处理
* proxy 被代理后的对象
* method 将要执行的方法
* args 执行方法时需要的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { // 声明切面
MyAspect myAspect = new MyAspect(); // 指定位置程序执行前执行这个方法
myAspect.start(); // 在目标类上调用方法
Object obj = method.invoke(userDao, args); // 指定位置程序执行结束后执行
myAspect.end(); return obj;
} }

  

MyAspect

package com.aop.aspect;

/**
* 切面
*/
public class MyAspect { public void start(){
System.out.println("模拟事务处理功能 ...");
} public void end(){
System.out.println("程序结束后执行此处 ...");
} }

  

JdkTest

测试结果项目编写完之后运行该类

package com.aop.test;

import com.aop.jdk.JdkProxy;
import com.aop.jdk.UserDao;
import com.aop.jdk.UserDaoImpl; public class JdkTest { public static void main(String[] args) { // 创建代理对象
JdkProxy jdkProxy = new JdkProxy();
// 创建目标对象
UserDao userDao= new UserDaoImpl();
// 从代理对象中获取增强后的目标对象
UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);
// 执行方法
userDao1.addUser();
} }

  

运行之后,我们可以看到以下结果:

我们可以看到,在我们执行新增用户的方法时,依据我们AOP编程,系统自动执行了start方法和end方法

在实际运用中,我们可以把一些通用的方法放到start和end的位置,在需要的方法处加入切面即可

此外,建议大家再了解下AspectJ

AspectJ实现AOP有两种方式:一种是基于XML的声明式,另一种是基于注解的声明式

基于XML的声明式AspectJ要便捷一些,但是存在配置信息多的缺点

基于注解的声明式AspectJ则通过注解的方式减少了很多配置信息

漫画 | Spring AOP的更多相关文章

  1. 漫画 | Spring AOP的底层原理是什么?

    1.Spring中配置的bean是在什么时候实例化的? 2.描述一下Spring中的IOC.AOP和DI IOC和AOP是Spring的两大核心思想 3.谈谈IOC.AOP和DI在项目开发中的应用场景 ...

  2. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  3. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  4. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  5. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  6. 基于Spring AOP的JDK动态代理和CGLIB代理

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

  7. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  8. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  9. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

随机推荐

  1. 企业项目开发--cookie(1)

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: h ...

  2. Java基础巩固计划

    3.26-4.1 JVM 虚拟机的内容写五篇博客 解决以下问题: 1. Java的内存模型以及GC算法 2. jvm性能调优都做了什么 3. 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情 ...

  3. API网关【gateway 】- 2

    最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析. 由于采用了大量的nginx相关的东西,所以在此记录一下: 配置连 ...

  4. 【ElasticSearch】:Windows下ElasticSearch+版本安装head

    概述 elasticsearch-head,之前插件plugin方式已废弃,现已改为nodejs的NPM安装,独立WEB服务方式. elasticsearch-head网址:https://githu ...

  5. OSX10.12搭建IPv6本地环境测试APP

    前记 最近刚换了工作,生活终于又安定下来了,又可以更博了 正文 最近公司在上线APP(整体全是用JS去写的,就用了我原生的一个控制器),然后APP就去上线,就被苹果巴巴给拒了.通过阅读苹果回复的邮件, ...

  6. postgresql-tps

    tps TPS就是每秒事务数,但是事务是基于虚拟用户数的,假如1个虚拟用户在1秒内完成1笔事务,那么TPS明显就是1:如果 某笔业务响应时间是1ms,那么1个用户在1秒内能完成1000笔事务,TPS就 ...

  7. google浏览器高清壁纸保存

    谷歌浏览器 扩展程序里边 有一个主题壁纸 好多不错的,并且是高清大图!!! 主题应用市场: https://chrome.google.com/webstore/category/themes?hl= ...

  8. opencv2函数学习之threshold:实现图像阈值化

    在opencv2中,threshold函数可以进行阈值化操作. double threshold( const Mat& src, Mat& dst, double thresh,do ...

  9. ElasticSearch入门2: 基本用法

    基本用法:  一.索引创建 (启动集群和索引请看上一篇文章:http://www.cnblogs.com/liuxiaoming123/p/8081883.html) 1.打开浏览器,输入请求:htt ...

  10. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...