Java 中 IOC 和 AOP 机制详解

Java 中 IOC 和 AOP 机制详解

1. IOC (Inversion of Control) 控制反转

1.1 定义
  • 控制反转:将对象的创建和依赖关系的管理从应用程序代码中转移到外部容器中。简单来说,就是把对象的创建和管理交给容器负责,而不是由程序员自己手动创建和管理。
1.2 作用
  • 降低耦合性:应用程序代码不再依赖于对象的创建,而是依赖于容器。这样,不同的组件之间可以相互独立地开发和测试,提高了代码的可维护性和可重用性。
  • 简化开发:开发者不再需要编写大量的代码来创建和管理对象,只需要专注于业务逻辑的实现。
  • 方便测试:可以方便地创建和管理测试环境,并对不同的组件进行独立测试。
1.3 实现方式
  • 依赖注入 (DI):通过容器将依赖关系注入到对象中,而不是由对象自己创建依赖对象。
1.4 图文示例

传统方式:

public class OrderService {private OrderDao orderDao = new OrderDaoImpl();public void createOrder() {// 使用 orderDao 创建订单}
}

IOC 方式:

public class OrderService {private OrderDao orderDao;public void setOrderDao(OrderDao orderDao) {this.orderDao = orderDao;}public void createOrder() {// 使用 orderDao 创建订单}
}

容器配置:

<bean id="orderService" class="com.example.OrderService"><property name="orderDao" ref="orderDao"/>
</bean><bean id="orderDao" class="com.example.OrderDaoImpl"/>

解释:

  1. 容器负责创建 OrderServiceOrderDao 实例。
  2. 容器将 OrderDao 实例注入到 OrderServiceorderDao 属性中。
  3. OrderService 通过 orderDao 属性使用 OrderDao 实例。

总结:

IOC 将对象的创建和管理委托给了容器,应用程序代码不再需要手动创建和管理对象,从而降低了耦合性,提高了代码的可维护性和可重用性。

2. AOP (Aspect-Oriented Programming) 面向切面编程

2.1 定义
  • 面向切面编程:将横切关注点 (例如日志记录、事务管理、安全控制等) 从业务逻辑中分离出来,以模块化的方式进行管理。
2.2 作用
  • 提高代码模块化:将横切关注点分离到独立的模块中,提高了代码的可维护性和可重用性。
  • 减少代码重复:将横切关注点集中在一个地方进行管理,避免了在多个地方重复编写相同的功能代码。
  • 增强代码可读性:将业务逻辑和横切关注点分离,提高了代码的可读性。
2.3 实现方式
  • 代理模式: 使用代理对象来拦截目标对象的调用,并在调用前后执行切面逻辑。
2.4 图文示例

业务逻辑:

public class OrderService {public void createOrder() {// 创建订单逻辑}
}

切面逻辑:

public class LoggingAspect {public void beforeCreateOrder() {// 日志记录}public void afterCreateOrder() {// 日志记录}
}

配置:

<aop:config><aop:advisor advice-ref="loggingAdvice" pointcut="execution(* com.example.OrderService.createOrder(..))"/>
</aop:config><bean id="loggingAdvice" class="com.example.LoggingAspect"/>

解释:

  1. LoggingAspect 定义了 beforeCreateOrderafterCreateOrder 方法,分别在 createOrder 方法执行前后执行。
  2. 配置文件定义了一个 advisor,它将 loggingAdvice 应用到 createOrder 方法。
  3. 当执行 createOrder 方法时,advisor 会拦截调用,并在调用前后执行 LoggingAspect 中的 beforeCreateOrderafterCreateOrder 方法。

总结:

AOP 将横切关注点分离到独立的模块中,提高了代码模块化,减少了代码重复,增强了代码可读性,同时简化了开发,让开发者可以专注于业务逻辑的实现。

3. IOC 和 AOP 的关系

  • IOC 是 AOP 的基础。AOP 需要依赖 IOC 容器来管理和注入对象。
  • AOP 可以看作是对 IOC 的扩展。AOP 可以实现更加灵活的代码模块化和关注点分离。

4. 总结

IOC 和 AOP 是 Java 中两种重要的设计模式,它们可以有效地提高代码的可维护性、可重用性和可测试性。IOC 将对象的创建和管理委托给了容器,AOP 将横切关注点分离到独立的模块中,二者相互补充,共同为开发高效、可维护的应用程序提供支持。

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

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

相关文章

zookeeper启动(一)

1.zookeeper启动入口 在zkServer.sh的启动命令中,我们可以找到zookeeper启动的关键类org.apache.zookeeper.server.quorum.QuorumPeerMain QuorumPeerMain#main 我们可以直接看org.apache.zookeeper.server.quorum.QuorumPeerMain中的main方法,从下面的main方法中,我们可以…

专为Mac设计的窗口管理Magnet 中文

Magnet是一款专为Mac设计的窗口管理工具软件。它具备强大的多窗口管理能力&#xff0c;支持用户通过简单的拖放操作&#xff0c;将应用程序窗口快速对齐、排列和分组。此外&#xff0c;Magnet还提供了预设的布局选项和自定义设置功能&#xff0c;帮助用户实现个性化的窗口布局。…

本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验

GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中&#xff0c;GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均表现出较高的性能&#xff0c;其通用能力评测结果甚至超越了Llama-3-8B开源大模…

多样本上下文学习:开拓大模型的新领域

大模型&#xff08;LLMs&#xff09;在少量样本上下文学习&#xff08;ICL&#xff09;中展现出了卓越的能力&#xff0c;即通过在推理过程中提供少量输入输出示例来学习&#xff0c;而无需更新权重。随着上下文窗口的扩展&#xff0c;我们现在可以探索包含数百甚至数千个示例的…

pdf怎么编辑修改内容?3个实用软件!

在当今数字化时代&#xff0c;PDF文件因其跨平台、格式固定的特性&#xff0c;成为我们日常工作和生活中不可或缺的一部分。然而&#xff0c;PDF文件的修改和编辑往往成为许多人的难题。本文将为您详细介绍如何编辑修改PDF文件的内容&#xff0c;并推荐几款实用的编辑软件&…

搭建多平台比价系统需要了解的电商API接口?

搭建一个多平台比价系统涉及多个步骤&#xff0c;以下是一个大致的指南&#xff1a; 1. 确定需求和目标 平台选择&#xff1a;确定你想要比较价格的平台&#xff0c;例如电商网站、在线旅行社等。数据类型&#xff1a;明确你需要收集哪些数据&#xff0c;如产品价格、产品名称…

github的个人readme文件

一个好的svg图: Simon-He95/profile-3d-contrib/profile-season-animate.svg at 4281d9f46e3d5416bd8f8cc5779157bfdaa8589d Simon-He95/Simon-He95 GitHub 请访问他的主页从提交记录就可以看到这个立体的登录github的图

nginx中配置ssl证书(宝塔面板)

首先申请一个SSL证书&#xff0c;这里我申请的joyssl的免费证书。提交订单申请后&#xff0c;按照页面提示在域名解析中将CNAME和记录值配置好。 比如我用的阿里云&#xff0c; 这是好后&#xff0c;需要等几分钟&#xff0c;然后域名检验成功。 然后点击joyssl的左侧菜单的“证…

消息队列笔记

异步技术 企业级应用中广泛使用的三种异步消息传递技术 原文链接&#xff1a;https://blog.csdn.net/qq_55917018/article/details/122122218 三种异步消息传递技术 JMS (java message service) 一个Java规范&#xff0c;等同于JDBC规范&#xff0c;提供了与消息服务相关的…

Oracle数据库面试题-9

81. 请解释Oracle数据库中的林业数据处理方法。 Oracle数据库中的林业数据处理 在Oracle数据库中处理林业数据涉及到存储、管理、分析和可视化与林业相关的数据。以下是林业数据处理的一些关键方面以及如何使用Oracle数据库进行示例性的SQL说明&#xff1a; 数据库设计&#…

Web后端开发(请求-简单参数)(一)

原始方式&#xff1a; 在原始的web程序中&#xff0c;获取请求参数&#xff0c;需要通过HttpServletRequest 对象手动获取。 RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request){//获取请求参数String name request.getParame…

小阿轩yx-iptables 防火墙

小阿轩yx-iptables 防火墙 Linux 防火墙基础 体系主要工作在 网络层针对TCP/IP 数据包实施过滤和限制 属于典型的包过滤防火墙&#xff08;或者称为网络层防火墙&#xff09; 体系基于内核编码实现 好处 具有非常稳定的性能高效率 防火墙两个表示 netfilteriptables …

代码随想录算法训练营第四天|24. 两两交换链表中的节点 |19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 | 142.环形链表II

24. 两两交换链表中的节点 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;帮你把链表细节学清楚&#xff01; | LeetCode&#xff1a;24. 两两交换链表中的节点_哔哩哔哩_bilibili 1. 第一想法是不知道这个题如何做&#xff0c;知道有改变指针这个操作。 2. 双指针也太…

学习分享-为什么把后台的用户验证和认证逻辑放到网关

将后台的用户验证和认证逻辑放到网关&#xff08;API Gateway&#xff09;中是一种常见的设计模式&#xff0c;这种做法在微服务架构和现代应用中有许多优势和理由&#xff1a; 1. 集中管理认证和授权 统一的安全策略 在一个包含多个微服务的系统中&#xff0c;如果每个服务…

优化扩散模型中的采样计划

在生成模型领域&#xff0c;扩散模型&#xff08;Diffusion Models, DMs&#xff09;因其卓越的生成质量而成为最新的技术趋势。但这些模型的一个关键缺点是它们的采样速度较慢&#xff0c;需要通过大型神经网络进行多次顺序函数评估。扩散模型通过一个称为采样计划的离散噪声水…

Golang | Leetcode Golang题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; var (dx [4]int{1, -1, 0, 0}dy [4]int{0, 0, 1, -1} ) func solve(board [][]byte) {if len(board) 0 || len(board[0]) 0 {return}n, m : len(board), len(board[0])queue : [][]int{}for i : 0; i < n; i {if board[i][0] O {q…

xmind父主题快捷键Ctrl+Enter

xmind父主题快捷键 CtrlEnter

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…

MySQL之查询性能优化(十二)

查询性能优化 优化COUNT()查询 4.使用近似值 有时候某些业务场景并不要求完全精确的COUNT值&#xff0c;此时可以用近似值来代替。EXPLAIN出来的优化器估算的行数就是一个不错的近似值&#xff0c;执行EXPLAIN并不需要真正地去执行查询&#xff0c;所以成本很低。很多时候&am…

【消灭星星game】

“消灭星星”&#xff08;PopStar&#xff09;是一款非常受欢迎的益智游戏&#xff0c;游戏目标是在一个网格中消除相同颜色的星星&#xff0c;一次消除的星星数量越多&#xff0c;得分越高。以下是一个简化版的消灭星星游戏的Python代码示例&#xff0c;用于演示基本的游戏逻辑…