上期,我们看到有小伙伴留言说希望讲讲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. Linux 安装JavaEE环境之jdk安装笔记

    1.安装jdk 先用xftp将jdk的压缩包上传到 /opt/ 2.在/usr/local/下使用命令mkdir java创建java目录 将jdk-7u79-linux-x64.gz解压缩至/usr ...

  2. BZOJ 2200--[Usaco2011 Jan]道路和航线(最短路&拓扑排序)

    2200: [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1128  Solved: 414[Submit] ...

  3. [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)

    二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ...

  4. Mac下通过 brew 安装 Apache 和 PHP

    Mac 自带的是php5.6 ,这里讲一下如果要升级到php7.1需要做的. 1.安装brew https://brew.sh/(官网有提供安装命令 建议使用) ruby -e "$(cur ...

  5. JS简单表单验证

    这里我是写了一个简单的注册表单验证功能,亲测有效,一起来看看吧! 首先我的HTML代码是这样的: class大家可以忽略一下,这里我项目使用的是bootstrap的样式. 输入用户名和密码用的是正则表 ...

  6. linux下hex转ascii

    场景: 在wireshark里面提取response包的值. echo -n "1f8b08000000000000030cd335b2e580014" | xxd -r -p & ...

  7. Vue, React, AngularJS, and Angular2. 我们对流行JavaScript框架们的选择

    2017-08-04 前端大全 (点击上方公众号,可快速关注) 英文:ANTONI ZOLCIAK  译文:众成翻译 www.zcfy.cc/article/vue-react-angularjs-a ...

  8. android stdio 编译项目报Error:Failed to find target with hash string 'android-24

    android stdio 编译项目报Error:Failed to find target with hash string 'android-24 查看已有的SDK 设置项目的sdk为 25 an ...

  9. (转)python通过paramiko实现,ssh功能

    python通过paramiko实现,ssh功能 1 import paramiko 2 3 ssh =paramiko.SSHClient()#创建一个SSH连接对象 4 ssh.set_missi ...

  10. Android众说纷纭分辨率

    Andoid最被人诟病的就是显示屏的各种不同尺寸和不同分辨率.由于Android厂商的纷繁多样,导致出现了不同尺寸和不同分辨率的手机,指示开发者需要兼容各种手机屏幕.本文想学习的就是Android的显 ...