你写的代码扩展性高吗?快试试用Spring注入方式来解耦代码!

AgentScope-Java:面向Java工程师的生产级多智能体开发框架 多智能体(Multi-Agent)是当前AI应用落地的核心范式之一,其核心在于让模型具备自主规划、工具调用与动态反思能力,区别于传统确定性工作流。AgentScope-Java基于ReAct范式,深度集成Spring Boot生态,提供可插拔的Agent抽象、沙箱化Runtime及可视化Studio,显著降低Java团队构建RAG增强、记忆感知、多Agent协同类AI应用的技术门槛。它支持Qwen等主流大模型,兼容Nacos、Redis、Milvus等企业级中间件,真正实现从开发、调试到监控运维的全链路工程 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:blog.youkuaiyun.com/qq_38050259/
article/details/113414419/

e6dedef73df86bf425b207d175ac6a65.png


目的:对比传统方式和 Spring注入方式创建对象以达到解耦的目的,以Service层调用 Dao层为例

方式一:传统方式

1.Service层

/**
 * @author :Prannt
 * @description :Service层
 * @program : Test
 */
public class UserService {
    public void add(){
        System.out.println("service add...");
        UserDao dao = new UserDaoImpl();
        dao.query();
    }
}

2.UserDao接口

/**
 * @description :接口中只有一个抽象方法
 */
public interface UserDao {
    void query();
}

3.UserDao接口的实现类

/**
 * @description :接口的实现类,重写 query方法
 */
public class UserDaoImpl implements UserDao{
    @Override
    public void query() {
        System.out.println("dao query...");
    }
}
//测试
public class test {
    @Test
    public void test1(){
        UserService service = new UserService();
        service.add();
    }
}

测试结果:

8b336806b5c4bac0926682cc29462f38.png
“

结论一:由以上过程可以看出,在UserService类中直接调用实现类的query方法,一旦实现类出问题,UserService立即报错,具有高度的耦合性

“

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

方式二:Spring注入对象

1.xml文件配置bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userService" class="Service.UserService">
        <!--注入Dao对象-->
        <property name="dao" ref="Dao"></property>
    </bean>

    <bean id="Dao" class="Dao.UserDaoImpl"></bean>
</beans>

2.Service层

import Dao.UserDao;
/**
 * @author :Prannt
 * @description :
 * @program : Demo01
 */
public class UserService {
    public void add(){
        System.out.println("service add......");
        dao.update();
    }

    //创建dao类型的属性,生成对应的set方法
    private UserDao dao;
    
    public void setDao(UserDao dao) {
        this.dao = dao;
    }
}

3.UserDao接口

public interface UserDao {
    void update();
}

4.接口的实现类

public class UserDaoImpl implements UserDao{
    @Override
    public void update() {
        System.out.println("Dao update......");
    }
}

测试

import Service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestBean {
    @Test
    public void testBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        UserService userService = context.getBean("userService",UserService.class);
        userService.add();
    }
}

测试结果

f41ccdf5c4a75cd25fe8598b631eb0df.png
“

结论二:观察以上过程,在UserService类中,没有直接new实现类,而是通过将Dao注入外部配置文件中的方式,使用“第三方文件”来达到解耦的目的。

“

推荐下自己做的 Spring Cloud 的实战项目:

https://github.com/YunaiV/onemall

总结

第一种传统方式创建对象,就像图一中的齿轮组。如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。

04b05d31ca5be03fc2f9d3eb76483b53.png
图一:高度耦合的齿轮组

而用Spring注入对象犹如图二的齿轮,利用第三方xml文件使任意两个齿轮之间无必然联系,B齿轮坏了也影响不到A、C、D齿轮。齿轮组相互之间的依赖关系降到最低。

73a6b5c662ccf5c232944630fa82f98e.png
图二:解耦后的齿轮组


欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

bdf24519483313a383bc975bd5cfd08f.png

已在知识星球更新源码解析如下:

cf22a8625cc884f6387338135b3af11c.png

21e33ebf7727760aa6b212893d9d48b5.png

f9285bb2022d51ee47af6821680baf9f.png

a5e663f33cafdcee9c270189ca8aa299.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
微服务的“交响乐“:当Spring Cloud遇见Azure Service Bus,系统如何优雅地“合唱“? 微服务架构中服务间通信常面临混乱问题,Spring Cloud与Azure Service Bus的组合能有效解决这一难题。本文介绍了如何通过Spring Cloud Azure配置服务总线连接(强调安全存储连接字符串的重要性),并实现消息的发送与接收:使用ServiceBusTemplate异步发送消息到队列/主题,通过@ServiceBusListener注解实现消息监听处理。这种方案为微服务提供了可靠的异步通信机制,实现服务解耦、提升系统稳定性,如同为交响乐团配备指挥和乐谱,使各服务协调运作。关键点包 阅读详情

相关推荐

Spyglass实战指南:跨时钟域同步方案深度解析

本文深度解析了Spyglass在跨时钟域同步方案验证中的实战应用。通过真实案例阐述了亚稳态的危害,并详细介绍了从基础的两级同步器到复杂的异步FIFO与握手协议等八大同步方案,以及如何利用Spyglass进行有效配置、检查与问题排查,为提升芯片设计可靠性提供系统性的避坑指南。

weixin_29219189的博客 838

如何利用Spring Boot和LiteFlow解锁复杂流程

LiteFlow是一款轻量级的工作流引擎,它的设计思想是简单、易用、高效、可扩展。LiteFlow提供了一套非常灵活的工作流程定义方式,可以轻松地定义和管理各种类型的工作流。基于XML配置文件定义工作流程,支持嵌套和子流程。支持分支、合并、并发等流程控制方式。支持事件触发和状态变化监听,可以方便地扩展和定制工作流处理逻辑。支持异步执行和超时控制,可以提高系统的并发处理能力和稳定性。高度可定制化,用户可以根据自己的需求自由扩展和定制LiteFlow的各种组件和功能。

wdj_yyds的博客 671

STC89C52RC单片机原理图详解

左侧A0和右侧B0为一 一对应的关系,左上角DIR为控制数据方向端口,如果DIR接高电平是将左侧数据A0~A8送到右侧B0~B8,如果DIR接低电平,是将右侧数据B0~B8送到左侧A0~A8,由于在电路板上LE始终与VCC连接,因此这里。74HC595是串行输入,并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于I/O口扩展。由于数码管为共阴极,给数码管下面接口输入阳码时,LED才亮,但是直接将P0~P7的高电平输入到数码管时,

m0_50562428的博客 6万+

Spring Boot | 事件监听器异步处理事件,实现代码解耦

Spring Boot事件监听器(Event Listener)用于在应用程序的生命周期中,监听Spring Boot应用程序中各种事件的发生,以便在事件发生时执行某些特定的操作。@Getter复制代码这里笔者汪小成创建了一个简单的事件类,继承了,事件类只有一个 String 类型的消息属性。事件类不是必须继承,一个普通的类也可以作为一个事件类。使用事件的好处是解耦,可以方便地实现模块间的通信,同时也可以提高代码的可读性和可维护性。

m0_73311735的博客 1088

VMware vSphere运维管理手册

ESXi 7.0 引入了一种系统存储布局,可对大型模块和第三方组件进行灵活的分区管理和支持,同时简化了调试操作。ESXi 7.0 系统存储更改在 ESXi 7.0 之前,分区大小固定不变,除 /scratch 分区和可选 VMFS 数据存储之外,且分区号是静态的,这些限制了分区管理。在 ESXi 7.0 中,分区整合为更少且更大的可扩展分区,具体取决于所使用的引导介质及其容量。ESXi 7.0 系统存储布局包含四个分区:分区适用情况类型系统引导存储引导加载程序和 EFI 模块。FAT16。

Avenjan优快云博客 3624

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 268

Spring Boot Event 观察者设计模式,实现业务解耦

https://mp.weixin.qq.com/s/X7hLbQRpxjhRbYuO-gL-2w

竹林幽深 181

104基于深度学习识别是AI生成还是真实图片

的可视化界面,通过点击左侧可以加载要识别的检测对象图片,点击中间的识别按钮,会识别出结果,识别结果在右侧显示,当前识别的图片是真实的图片,非假图片。有兴趣的小伙伴也可以自行扩充数据集,或训练自己的数据集。文本,分别存放了图片路径和对应的标签。文本里面的数据,并将训练好的模型也保存在本地。即可加载训练好的模型,真假图片进行识别。本期给大家介绍的是基于深度学习识别是。代码整体是非常简便的,总共三个。个文件夹分别是真图和。

xcvxvfgdfgfh的博客 2261

Spring入门第一弹:原来IOC就是这么回事!

Spring是个全能框架,核心是IOC、AOP和粘合剂耦合就是硬编码,改一个得动另一个,太麻烦IOC就是把对象的创建权交给Spring,自己只负责使用Spring的IOC使用步骤:导依赖→写配置文件→从容器拿对象怎么样?是不是觉得IOC也不过如此?DI(依赖注入),记得关注哦!有问题也可以在评论区留言,咱们一起探讨~

smile_WangDuoduo的博客 622

2025年华为杯D题:低空湍流监测及最优航路规划思路与Matlab实现

2025年华为杯D题:低空湍流监测及最优航路规划思路与Matlab实现

前程算法屋的博客 772

uniapp - 强力解决H5网页浏览器跨域问题,如何解决uniapp请求接口在浏览器跨域问题,UniApp H5 跨域代理配置详细教程完美解决所有uniapp跨域(调用第三方接口或服务器api跨域)

uni-app 跨域,uniApp解决h5跨域问题,解决uni-app请求接口在浏览器跨域问题,uni.request请求跨域问题解决方案,uni-app-跨域解决方法,彻底解决uniapp发布为H5的跨域问题,uniapp H5页面设置跨域请求_uniapp h5跨域配置,uniapp开发 H5 解决跨域问题,uniApp请求解决跨域问题,uniapp request如何实现前端请求跨域,解决uniapp调试过程中的请求跨域和环境配置,Uniapp调用外部api接口跨域请求,uni-app发布H5页面跨域

🏆 前端领域优质创作者 5354

快马AI一键生成:如何用依赖注入打造高内聚低耦合的Spring Boot应用

最近在开发一个电商购物车项目时,深刻体会到了依赖注入(Dependency Injection)模式带来的便利。通过这次项目实践,我深刻体会到依赖注入模式带来的好处:代码结构更清晰、组件间耦合度低、测试更方便、扩展性更好。特别是它的部署功能,不需要手动配置各种环境变量,省去了很多麻烦。对于想快速验证依赖注入架构效果的同学来说,真的是很实用的工具。在购物车项目中,我们主要使用字段注入的方式,代码简洁明了。这种测试方式可以完全隔离被测组件,不依赖实际的外部服务,测试效率很高。在做这个项目的过程中,我使用了。

NightshadeEagle34的博客 662

【四足机器人项目实战】MIT无刷电机FOC硬件电路设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、MCU最小系统--STM32F446RE1.usb串口通讯连接口+程序下载连接口2.MCU电源滤波二、磁编码器角度传感器三、三相驱动桥四、CAN通讯收发器电路五、温度ADC检测六、电源滤波及分压电路1、DC电源输入端2、DC电源滤波电路3、DC电源分压电路4、三相绕线接线端总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对

qq_35635374的博客 7062

Spring Boot 4.0 + ChatClient:多模型统一调用,一套代码通吃千问/GPT

CREATIVE, // 创意写作,用GPT-4oANALYTIC, // 逻辑分析,用GPT-4oCOMPLIANCE, // 合规审查,用千问CODE // 代码生成,用GPT@Component@Autowired@Autowired// 中文合规用千问// 其他用GPT咱们今天捋了一遍Spring Boot 4.0 + ChatClient的多模型配置方案。引入依赖:把需要的模型starter都加进来。

HHX_01的博客 746

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IOC和DI的区别

先从字面上理解一下什么是IOC,什么是DI IOC:Inversion of Control,我们一般叫做控制反转,这是一种技术思想,反转了什么控制,我的理解就是反转了对象创建以及管理的控制权,交给了外部环境,在Spring中具体的体现简单描述就是把创建对象的控制权交给了Spring框架,由Spring框架来做一整套的对象创建,管理等流程,而如果没有Spring框架或者说是没有采用IOC这种技术思想的话,在维护对象之间的依赖关系时在维护我们一般都是手动new对象,这样会导致系统中对象之间耦合过高,不利于.

硅脂味咖啡的博客 1742

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入解析Spring BeanDefinition:IoC容器的核心蓝图与设计原理

在Java企业级开发中,控制反转(IoC)和依赖注入(DI)是构建松耦合、可测试应用的核心设计模式。Spring Framework作为最流行的Java开发框架,其IoC容器通过BeanDefinition这一核心数据结构,将配置元数据(如XML、注解)转化为可执行的Bean创建蓝图,实现了配置解析与实例化逻辑的解耦。BeanDefinition不仅定义了Bean的类名、作用域、依赖关系等基础信息,还支持懒加载、初始化方法等高级特性,为AOP动态代理、条件化注册等高级功能提供了基础。理解BeanDefini

weixin_33769125的博客 391

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

用工厂模式快速搭建可扩展的微服务原型

首先创建一个Service接口,定义所有服务都需要实现的方法。比如我们设计一个通知服务,包含发送消息的通用接口。工厂模式+配置文件的组合,特别适合需要动态切换实现的场景微服务中可以将工厂作为单独模块,其他服务通过依赖调用使用平台工具能大幅缩短从设计到验证的周期结合策略模式优化服务实现增加服务实例缓存支持热更新配置这个方案已经能解决大部分动态创建服务的需求,你也快试试吧!

JetRaven12的博客 603

如何用 Spring Cloud 构建面向企业的大型分布式、微服务快速开发框架?

>>号外:关注“Java精选”公众号,回复“2021面试题”关键词,领取全套500多份Java面试题文件。最近公司给了我一个任务,为了满足企业内部多系统的快速开发和解耦,需要为...

Java精选 485

高并发压测第3小时:面试官质疑Spring循环依赖,应届生手撕红黑树卡壳,JVM调优第8种方案被追问

在高并发压测的第3小时,面试环境突然网络闪断,面试官质疑Spring框架中的循环依赖问题。应届生在白板编程环节手撕红黑树时卡壳,同时被追问JVM调优的第8种方案。面对技术主管的步步紧逼,候选人需要迅速化解危机,并在有限时间内展示对JVM底层机制的深刻理解,以及对复杂场景的快速反应能力。

Ared 575

JUnit 5 架构解析与实战:从单元测试到集成测试的全面指南

单元测试是保障软件质量的核心实践,它通过自动化验证代码单元的行为,确保其符合预期。其原理在于隔离被测代码,模拟依赖,并断言执行结果,从而在开发早期发现缺陷,提升代码可维护性与重构信心。在Java生态中,JUnit作为事实标准的测试框架,其价值在于为开发者提供了一套统一、高效的测试编写与执行规范。随着微服务、云原生等复杂架构的普及,测试场景日益多样化,对测试框架的灵活性、扩展性提出了更高要求。JUnit 5应运而生,它并非简单迭代,而是基于模块化架构(JUnit Platform、Jupiter、Vintag

weixin_30512043的博客 369

阶段性的对Web开发的一个总结

这是我年初写的一篇文章,当时用webwork+Spring+Hibernate开发一个web应用,一种很流行的J2EE开发模式,在开发了两周后,对Web开发的一个总结,我觉得对新手还是有一定帮助的。很模糊的记得在Javaeye有人写过类似的文章,在此表示感谢了。 发布到这儿,因为觉得Javaeye的blog比其它的好用,以后就在这儿安家啦。 作为一个表示层框架,无论是Struts、We...

zwchen的专栏 197

技能重点

熟悉使用java语言进行编程设计,有良好的编程习惯和注释。 1、每个程序的开始都加上注释,解释该程序的目的、作者以及程序最后一次被修改的日期和时间。 2、使用空行和空格来增强程序的可读性。 3、.代码低耦合 4、避免太多变量和函数的大型类. 5、拒绝长函数和深度嵌套。(一个长函数意味着包含了太多的功能实现。一般情况下长函数应该被分解成许多子函数,其中每个子函数被设计为处理单个任务或问题) 6、标识符命名有意义。 tomcat性能优化 1、tomcat运行模式是三种,bio、nio、apr ,默认的是bio

qq_20328477的博客 721

从OpenClaw启动失败看AI Agent架构设计:模块、通信与容错

AI Agent(智能体)是当前人工智能领域的热点技术,它通过大语言模型(LLM)赋予机器规划、推理和调用工具的能力,实现从“知道”到“做到”的跨越。其核心原理在于构建一个模块化、可协作的系统架构,通常包含核心引擎(负责LLM集成与任务规划)、记忆状态管理(维护对话上下文与长期记忆)、通信接口(处理外部请求与内部消息)以及配置观测层。这种架构的技术价值在于将复杂的智能任务分解为可管理、可扩展的组件,从而支持开发具备复杂交互和任务执行能力的应用。在实际工程中,AI Agent架构面临配置管理、服务发现、模块间

weixin_30740295的博客 385
上一篇: 新来的同事问我 where 1=1 是什么意思
下一篇: 几行烂代码,我赔了16万。
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值