上期,我们看到有小伙伴留言说希望讲讲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. c++中的一些计算的问题

    要实现小数的四舍五入, float a = 3.456; //保留到小数点后两位 float b =(int)((a * 100) + 0.5) / 100.0; 但是这样对负数不好使, 对负数的话, ...

  2. [Vuejs] webpack+vue-cli打包如何引用相对路径

    默认情况下通过webpack+vuec-li打包的css.js等资源,路径都是绝对的,即static在根目录下,假如部署到带有文件夹目录的项目中,资源路径就会出错,如何解决. 1.修改资源引用相对路径 ...

  3. 转载:TCP/IP四层模型

    转载:TCP/IP四层模型 一. TCP/IP参考模型示意图 ISO制定的OSI参考模型的过于庞大.复杂招致了许多批评.与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用. 如图所示 ...

  4. cmd命令关闭占用程序的端口

    遇到的问题: 在重新启动tomcat服务时,启动失败,显示的信息大概为:Error running 'cus_manager_system': Unable to open debugger port ...

  5. POJ 2552

    #include<iostream> #include<stdio.h> using namespace std; ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ...

  6. 课程一(Neural Networks and Deep Learning),第三周(Shallow neural networks)—— 2、Practice Questions

    1.以下哪一项是正确的?(检查所有适用的) (A,D,F,G) A.  a[2] 表示第二层的激活函数值向量. B. X 是一个矩阵, 其中每一行都是一个训练示例. C. a[2] (12) 表示第二 ...

  7. 通过修改CR0寄存器绕过SSDT驱动保护

    为了安全起见,Windows XP及其以后的系统将一些重要的内存页设置为只读属性,这样就算有权力访问该表也不能随意对其修改,例如SSDT.IDT等.但这种方法很容易被绕过,我们只要将这些部分修改为可写 ...

  8. Java类加载顺序

    很长时间没看这方面的内容了,写篇文章让自己牢记一下,顺便分享一下. 首先,写代码以便检验结果.测试代码: public class Test { public static void main(Str ...

  9. [原] ubuntu 13.10 安装 winqq2013

    安装及下载地址:http://www.longene.org/forum/viewtopic.php?t=4700 ubuntu 13.10 64位系统安装后无法启动qq,因为缺少程序包.解决方案: ...

  10. [Python 从入门到放弃] 1. 列表的基本操作

    ''' 列表 Create By 阅后即焚 On 2018.1.29 ''' 1. 列表的定义 列表看起来好像其它编程语言中的数组,但列表具备更加强大的功能,它是Python完备的集合对象,现在,你可 ...