AOP的简介

1 什么是AOP

AOP Aspect Oriented Programing 面向切面编程

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码

AspecJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入

2 AOP底层原理

就是代理机制:

动态代理:(JDK中使用)

JDK的动态代理,对实现了接口的类生成代理.

3 Spring的AOP代理

JDK动态代理:对实现了接口的类生成代理

CGLib代理机制:对类生成代理

4 AOP的术语:

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.

Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.

Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)

Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

Target(目标对象):代理的目标对象

Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.

spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入

Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

Aspect(切面): 是切入点和通知(引介)的结合

5 AOP的底层实现

5.1 JDK动态代理:

public class JDKProxy implements InvocationHandler{private UserDao userDao;public JDKProxy(UserDao userDao) {super();this.userDao = userDao;}public UserDao createProxy() {UserDao proxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this);return proxy;}// 调用目标对象的任何一个方法 都相当于调用invoke();public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {if("add".equals(method.getName())){// 记录日志:System.out.println("日志记录=================");Object result = method.invoke(userDao, args);return result;}return method.invoke(userDao, args);}}

5.2 CGLIB动态代理

CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。 Hibernate支持它来实现PO(Persistent Object 持久化对象)字节码的动态生成

Hibernate生成持久化类的javassist.

CGLIB生成代理机制:其实生成了一个真实对象的子类.

下载cglib的jar包.

现在做cglib的开发,可以不用直接引入cglib的包.已经在spring的核心中集成cglib.

public class CGLibProxy implements MethodInterceptor{private ProductDao productDao;public CGLibProxy(ProductDao productDao) {super();this.productDao = productDao;}public ProductDao createProxy(){// 使用CGLIB生成代理:// 1.创建核心类:Enhancer enhancer = new Enhancer();// 2.为其设置父类:enhancer.setSuperclass(productDao.getClass());// 3.设置回调:enhancer.setCallback(this);// 4.创建代理:return (ProductDao) enhancer.create();}public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {if("add".equals(method.getName())){System.out.println("日志记录==============");Object obj = methodProxy.invokeSuper(proxy, args);return obj;}return methodProxy.invokeSuper(proxy, args);}}

结论:Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.

Spring教程--AOP简介相关推荐

  1. spring教程--AOP详解

    1 Spring中的AOP 1.1 Spring的传统AOP : AOP:不是由Spring定义.AOP联盟的组织定义. Spring中的通知:(增强代码) 前置通知 org.springframew ...

  2. 普歌-云言团队-Spring的AOP简介

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

  3. Spring AOP 简介以及简单用法

    Spring AOP 简介以及简单用法 如果你去面试java开发, 那么Spring的AOP和DI几乎是必问的问题. 那么AOP是什么呢? 一. AOP 所谓Aop就是 Aspect-Oriented ...

  4. Spring 教程(一)

    Spring 基本概述 1.1 Spring是什么 spring框架是于2003年兴起的一个轻量级的java开发框架,有Rod Johnson创建,是针对bean的生命周期进行管理的轻量级容器,使现有 ...

  5. Spring教程(由浅入深)

    1.Spring教程(由浅入深) 1.1.简介 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架. 2004年3月24日,Spring框架以interface ...

  6. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  7. Spring(三)AOP面向切面编程

    原文链接:http://www.orlion.ga/205/ 一.AOP简介 1.AOP概念 参考文章:http://www.orlion.ml/57 2.AOP的产生 对于如下方法: public ...

  8. Spring(四)——AOP、Spring实现AOP、Spring整合Mybatis、Spring中的事务管理

    文章目录 1. 什么是AOP 2. 使用Spring实现AOP 2.1 使用Spring的API 接口实现 2.2 自定义实现 2.3 使用注解实现 3. 整合MyBatis 3.1 MyBatis- ...

  9. 面试必会系列 - 1.8 Spring IOC / AOP原理

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

最新文章

  1. PHP IPC函数介绍---共享内存
  2. 零基础学Python(第九章 循环控制【break】与【continue】)
  3. BundleFusion代码框架讲解
  4. Spring Boot freemarker导出word下载
  5. mybatis学习笔记(1)-对原生jdbc程序中的问题总结
  6. 制作Linux的优盘启动盘
  7. java长连接心跳包_socket中的短连接与长连接,心跳包示例详解
  8. UVA10523 Very Easy !!!题解
  9. 软考计算机网络初级试题答案,2015年下半年中级软考《计算机网络—网络工程师》试题及答案...
  10. C语言位运算的取反(~)真实原理解析
  11. c#中 utm坐标转换经纬度坐标
  12. Linux 使用yum下载软件
  13. 产品经理的23个OKR案例(下)
  14. 商用密码安全性评估简介
  15. igraph 利用节点列表输出子图并存储
  16. 网上查的资料怎么打印?
  17. 【SAS NOTE】substr字符串提取函数
  18. go语言下载gin失败解决方案
  19. R语言丨根据VCF文件自动填充对其变异位点并生成序列fa文件
  20. 网络调试助手的使用 调试TCP,UDP

热门文章

  1. 单列模式(懒汉)测试代码
  2. ESP8266的MQTT客户端搭建教程(基于NONS_SDK_v2.0)
  3. globalmem设备代码分析
  4. BigChainDB
  5. [工具]-C语言实现:生成一个全是0x0的二进制文件
  6. 两种重要的图——Snapshot diagram UML diagram
  7. e0312 不存在用户定义的_VistaPro创建自定义变量
  8. win10如何换pip源
  9. pwndbg用docker实现,进行题目分析
  10. 【Shell】设置变量默认值,参数默认值, 自动赋值