底层实现_Java AOP的底层实现原理

AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等。

AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

静态代理 AspectJ

AspectJ是什么?

Eclipse AspectJ is a seamless aspect-oriented extension to the Java™ programming language. It is Java platform compatible easy to learn and use.

AspectJ是Java的扩展,用于实现面向切面编程。

AspectJ有自己的编辑器ajc,

AspectJ 官网

Eclipse AspectJ​projects.eclipse.orgAspectJ 入门​www.jianshu.com
2f4ca904cb648f9964c3d64266e1ac10.png

使用AspectJ的编译时增强,实现AOP。

之前提到,AspectJ是静态代理的增强。所谓的静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。

它会在编译阶段将Aspect织入Java字节码中,运行的时候就是经过增强之后的AOP对象。proceed方法就是回调执行被代理类中的方法。


动态代理(Spring AOP)

Spring AOP官方文档

Core Technologies​docs.spring.io
24905b211ed8729764b3d61b7de7ea3f.png

1.与AspectJ的静态代理不同,Spring AOP使用的是动态代理。所谓的动态代理,就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

2.Spring AOP中的动态代理,主要有两种方式:JDK动态代理和CGLIB动态代理。

JDK动态代理通过“反射”来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。

3.CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态地生成某个类的子类。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

使用动态代理实质上就是调用时拦截对象方法,对方法进行改造、增强


测试CGlib生成的动态代理

测试类

package com.example.demo.aop;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
//@EnableAspectJAutoProxy
public class SpringBootDemoApplication {// 直接用Chinese类注入@Autowiredprivate Landlord landlord;@RequestMapping("/test")public void test() {landlord.service();System.out.println(landlord.getClass());}public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}
}

Landlord类

package com.example.demo.aop;import org.springframework.stereotype.Component;@Component("landlord")
public class Landlord {public void service() {// 仅仅只是实现了核心的业务功能System.out.println("签合同");System.out.println("收房租");}
}

Broker类

package com.example.demo.aop.aspect;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Component
@Aspect
class Broker {@Before("execution(* com.example.demo.aop.Landlord.service())")public void before() {System.out.println("带租客看房");System.out.println("谈价格");}@After("execution(* com.example.demo.aop.Landlord.service())")public void after() {System.out.println("交钥匙");}
}

运行结果

带租客看房
谈价格
签合同
收房租
交钥匙
class com.example.demo.aop.Landlord$$EnhancerBySpringCGLIB$$1f1c504a
Spring AOP就是这么简单啦​juejin.imJava AOP的底层实现原理 - 健人雄 - 博客园​www.cnblogs.comSpring(4)——面向切面编程(AOP模块)​www.jianshu.com
465cc581dbbc06dcb40b8c3290aa1b0e.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lpv4的地址格式由多少个字节组成_我们为什么有这么多字符编码格式?

相信不少同学都在初学计算机之时,都被ASCII,Unicode和UFT-8等字符编码格式 搞得焦头烂额,这玩意儿到底是啥,区别是啥,为啥有这么多?反正我刚学的时候纯粹是囫囵吞枣,为了考试潦草背一背&#xf…

git配置用户信息_git系列教程(4)-单用户配置

一般新手都会使用一个用户,要么是github,要么是gitee本地配置上个文档已经讲过本地配置,在这里就不赘述了连接github或者gitee生成ssh公钥ssh-keygen -t rsa -C "emailexample.com" 三次会车即可生成ssh key找id_rsa.pub文件mac或…

32 引脚_函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频方波

void Time0_serve(void ) interrupt 1 using 1 {TH0(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法sound!sound; //将P3.7引脚取反,输出音频方波}/************************…

matlab 功率谱密度 汉宁窗_信号系统的一些基本概念

泄露截断会使谱分析精度受到影响。如果时域信号是周期性的,而截断又按整周期取数,信号截断不会产生问题,因为每周期信号都能代表整个周期信号变化情况。若不是整周期截取数据,则截断将使信号波形两端产生突变,所截取的…

拟真机器人拯救者怎么来_笔点聊科技 篇九:3499起、卷土重来?理性聊聊刚发布的联想拯救者手机Pro...

笔点聊科技 篇九:3499起、卷土重来?理性聊聊刚发布的联想拯救者手机Pro2020-07-23 10:44:270点赞0收藏0评论创作立场声明:想让消费者接受品牌,真金白银买回家还感觉良好,继而产生源源不断的品牌口碑,在强者…

重定向地址_JavaWeb - Servlet:重定向和转发,状态管理

Servlet JDBC 应用在 Servlet 中可以使用 JDBC 技术访问数据库,常见功能如下:查询 DB 数据,然后生成显示页面,例如:列表显示功能。接收请求参数,然后对 DB 操作,例如:注册、登录、修…

华为双前置摄像头_国产手机集体爱上“双打孔屏”,前置双摄像头将成2020年标配?...

今年2月21日,三星S10采用了前置双摄像头的配置,而且是打孔屏,两颗摄像头分别是1000万像素的双核对焦主摄,以及800万像素的景深副摄,不俗的硬件辅以算法虚化,在当时拿下了Dxomark前摄第一的宝座。即便是10个…

python对文件的_python 对文件操作

#!/usr/bin/env python#-*- coding:utf-8 -*-defFind(class_name):class_list[]tagFalsewith open(‘data‘, ‘r‘, encoding‘utf8‘) as f:for line inf:if line.strip() ‘班级:{0}班‘.format(class_name.strip()):class_list.append(line)tagTruecontinueif …

摸底谷歌Gemini:CMU全面测评,Gemini Pro不敌GPT 3.5 Turbo

谷歌的 Gemini 到底几斤几两?和 OpenAI 的 GPT 模型相比表现如何?CMU 这篇论文测明白了。 前段时间,谷歌发布了对标 OpenAI GPT 模型的竞品 ——Gemini。这个大模型共有三个版本 ——Ultra(能力最强)、Pro 和 Nano。研…

python3 collections模块 tree_第30天: Python collections 模块

by 豆豆1.简介collections 是 python 的内置模块,提供了很多方便且高性能的关于集合的操作,掌握这些知识有助于提高代码的性能和可读性。2.常用功能2.1 namedtuple 功能详解namedtuple() 返回一个新的元组子类,且规定了元组的元素的个数&…

ddns 被解析为127.0.0.1_我为北京冬奥加油,2020.2.1-2.10冬奥知识分享

2020.02.01中国冬梦,世界飞跃,我是果雪儿小小志愿者仇懿琛,我为北京冬奥加油,今天冬奥知识分享——冬奥会历史上那些非凡而又卓越的运动员(十一)明星运动员:米特迈尔第十二届冬季奥运会时间:1976.02.04-02.…

乱码 转ios_王者荣耀:转区数量提升25倍,教你解决检测异常,IOS也有艾琳了

王者峡谷近期最火的一个功能便是转区服务开放限量测试,由于申请的人数非常多,官方决定从今日起将测试资格由最初的2000个提升至每日开放50000个,同时由每日二次开放调整为每日一次,虽说测试资格数量提升了25倍,但依旧有…

冰豹lua驱动设置_卡宴?卡宴!——冰豹ROCCAT Kain 120 AIMO开箱

前言原本一直在用罗技的G700s,但是鉴于众所周知的“电老虎”原因,再加上重量的问题,一直想换一个鼠标试试,虽然不太玩游戏,但是平时使用也喜欢高DPI的设置、另外还稍许有点汗手的问题,所以对鼠标长时间时候…

vue内检测是否有swiper_vue.js怎么用swiper

vue.js中使用swiper的方法:首先下载【swiper.js】;然后在【main.js】中全局引入【swiper.js】;最后在模板中配置相关内容即可。【相关文章推荐:vue.js】vue.js中使用swiper的方法:1、下载swiper.jsnpm install vue-awe…

mysql创建个自增id的表_MySQL数据库--怎样创建一张用户表,ID设置为自动增长列(新手必会)...

-- phpMyAdmin SQL Dump-- version 3.3.8.1-- http://www.phpmyadmin.net---- 主机: w.rdc.sae.sina.com.cn:3307-- 生成日期: 2011 年 08 月 19 日 16:18-- 服务器版本: 5.1.47-- PHP 版本: 5.2.9---- 数据库: app_tushow---- ----------------------------------------------…

从sqlite 迁移 mysql_将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库

下面我们就来说说如何从 SQLite 迁移到 MySQL 。准备首先你要已经安装好 MySQL 数据库。如果你用的是 Ubuntu 系统,请参考这篇文章。其他系统请参考各自对应的文档。导出当前数据点击蓝色的 EXPORT 按钮将当前数据库中的所有数据导出并下载到本地,默认文…

易语言mysql验证_易语言MySql注册登录

用到的主要易语言命令:连接MySql (, , , , )执行SQL语句 (, )取记录集 ()读字段值 (, , )释放记录集 ()断开MySql ()命令介绍:①、连接MySql (, , , , ):顾名思义,这条命令是用来连接你的MySql数据库的,返回一个MySql句…

mysql 数据库设置mysql注入_MYSQL数据库浅析MySQL的注入安全问题

《MYSQL数据库浅析MySQL的注入安全问题》要点:本文介绍了MYSQL数据库浅析MySQL的注入安全问题,希望对您有用。如果有疑问,可以联系我们。如果把用户输入到一个网页,将其插入到MySQL数据库,有机会离开了发生安全问题被称为SQL注入敞开.这一课将…

php链接mysql编码错误_php 操作 mysql 数据库 编码 错误

有两行相同的代码,来自不同的 php 文件,在对 MySql 数据库(UTF-8格式)操作时,一行代码正常,一行代码异常代码1,异常update ordersystem.product Set PName333汽车 Where BianhaoX…

mysql 数据记录导出_mysql如何导出600万条记录的数据表?

目前我这么写:/*** Created by IntelliJ IDEA.* User: felix* Date: 2019-03-01* Time: 18:49*/set_time_limit(0);$servername localhost;$username ;$password ;$dbname ;$i 57007;$bingTime microtime(true);echo bing . $bingTime . s . PHP_EOL;while …