IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 5个点轻松搞定Spring AOP底层实现原理 -> 正文阅读

[Java知识库]5个点轻松搞定Spring AOP底层实现原理

前言

AOP 也是 Spring 中一个较为重要的内容,相对于传统的 OOP 模式,AOP 有很多让人难以理解的地方,本篇文章将向大家介绍 AOP 的实现方法及其底层实现,内容包括:

  • 初始 AOP
  • AOP 的基本概念
  • AOP(concepts)术语
  • 动态代理
  • 通知介绍(前置、后置、返回、异常、环绕)
  • 基于注解的方式配置通知

一、什么是AOP

这个可以看我之前的文章:当我变成一个服务员和售货员教你一分钟了解并学废Spring AOP!!!

二、Spring框架的AOP的底层实现

Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种

基于JDK的动态代理

必须是面向接口的,只有实现了具体接口的类才能生成代理对象

基于CGLIB动态代理

  • 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
  • Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
  • 如果实现类接口,使用JDK动态代理完成AOP
  • 如果没有实现接口,采用CGLIB动态代理完成AOP
  • 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式
  • Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
  • 如果实现类接口,使用JDK动态代理完成AOP
  • 如果没有实现接口,采用CGLIB动态代理完成AOP

基于Spring的AOP简单实现

注意一下,在讲解之前,说明一点:使用Spring AOP,要成功运行起代码,只用Spring提供给开发者的jar包是不够的,请额外上网下载两个jar包:

  1. aopalliance.jar
  2. aspectjweaver.jar

三、通过配置的方式实现aop通知效果

xml配置

<bean id="logger" class="com.ahpome.company.utils.Logger" />

<aop:config>

<aop:aspect id="loggerAspect" ref="logger"> // 定义切面 aspect

<aop:pointcut id="loggerRef" expression="execution(* com.ahpome.company..*.*(..)) and !bean(logger)" /> //定义 切入点

<aop:around method="record" pointcut-ref="loggerRef" /> //通知 环绕通知 :around;前置通知 :before;后置通知:after;最终通知:after-returning;异常通知:after-throwing

</aop:aspect>

</aop:config>

logger.java

public Object record(ProceedingJoinPoint pjp){

Log log = new Log();

try {

log.setOperator("admin");

String mname = pjp.getSignature().getName();

log.setOperName(mname);

Object[] args = pjp.getArgs();

log.setOperParams(Arrays.toString(args));

//执行目标方法,返回的是目标方法的返回值,本例中 void

Object obj = pjp.proceed();

if(obj != null){

log.setResultMsg(obj.toString());

}else{

log.setResultMsg(null);

}

log.setOperResult("success");

System.out.println("1111");

return obj;

} catch (Throwable e) {

log.setOperResult("failure");

log.setResultMsg(e.getMessage());

} finally{

// logService.saveLog(log);

}

return null; 注意:这里如果是返回null即使你调用的时候返回是null,即使你的方法中含有返回值

}

}

JDK动态代理

接口

public interface UserService {

void save();

int select();

}

接口实现类

public class UserServiceImpl implements UserService {

@Override

public void save() {

System.out.println("保存用户信息成功");

}

@Override

public int select() {

System.out.println("查询用户信息成功");

return 10;

}

}

JDK动态代理工厂类

public class JdkProxyFactory implements InvocationHandler {

private Object target;

public JdkProxyFactory(Object target) {

this.target = target;

}

/**

* 获取代理对象,当前类继承InvocationHandler

*

* @return

*/

public Object getProxyObject() {

return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

//添加功能

System.out.println("增强代码,添加日志功能");

//执行原有方法

return method.invoke(target, args);

}

}

测试JDK动态代理?

@Test

public void JdkProxyTest() {

//创建目标对象

UserService userService = new UserServiceImpl();

//创建工厂对象

JdkProxyFactory jdkProxyFactory = new JdkProxyFactory(userService);

UserService proxy = (UserService) jdkProxyFactory.getProxyObject();

proxy.save();

System.out.println("=========================");

proxy.select();

}

总结

以上就是我对Java开发大型互联网架构Spring AOP实现原理之Spring AOP底层实现 问题及其优化总结。

文章到这里就结束了

小编这里总结一份spring AOP的思维导图,想了解的小伙伴可以添加vx小助手:xiehuangbao1123 领取

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:19:45  更:2021-07-13 17:19:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 6:44:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码