首页 > 其他分享 >Spring DI

Spring DI

时间:2024-08-06 19:24:42浏览次数:6  
标签:myRepository userRepository 依赖 DI Spring UserRepository public

目录

一、主要概念

1. 依赖

2. 控制反转(IoC)

3. 注入方式

4. Spring容器

二、优点

三、示例


Spring DI(Dependency Injection,依赖注入)是一种设计模式,用于实现控制反转(Inversion of Control,IoC)。在Spring框架中,DI是核心特性之一,通过将对象的创建和管理从应用程序代码中抽离出来,使得程序的组件之间能够更松散地耦合。

一、主要概念

1. 依赖

在面向对象程序中,一个对象(类)通常需要其他对象来完成某些功能,这些需要的对象称为依赖。

2. 控制反转(IoC)

IoC是指将对象的创建和管理权交给容器(如Spring容器),而不是在应用程序代码中直接创建对象。这样可以提高代码的灵活性和可测试性。

3. 注入方式

(1)构造函数注入:依赖通过构造函数传入。适用于强制要求依赖的场景。

public class MyService {  
    private MyRepository myRepository;  

    public MyService(MyRepository myRepository) {  
        this.myRepository = myRepository;  
    }  
}

(2)Setter方法注入:依赖通过公开的setter方法设置。适用于可选依赖的场景。

public class MyService {  
    private MyRepository myRepository;  

    public void setMyRepository(MyRepository myRepository) {  
        this.myRepository = myRepository;  
    }  
}

(3)接口注入:通过接口方法提供依赖。

4. Spring容器

负责对象的创建、配置和生命周期管理。Spring容器会根据配置文件或注解来创建和管理对象。

二、优点

(1)解耦:通过DI,类之间的依赖关系通过容器管理,减少了类间的直接依赖。
(2)可测试性:可以轻松地替换依赖,便于单元测试。
(3)灵活性:可以通过配置文件或注解快速修改依赖对象,而不需要修改源代码。

三、示例

UserService依赖于UserRepository:

public interface UserRepository {
    void save();
}
public class UserRepositoryImpl implements UserRepository {
    public void save() {
        // 保存用户
    }
}
public class UserService {
    private UserRepository userRepository;

    // 构造函数注入
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void registerUser() {
        userRepository.save();
    }
}

在xml文件中配置这些类:

<beans>
    <bean id="userRepository" class="com.example.UserRepositoryImpl" />
    <bean id="userService" class="com.example.UserService">
        <constructor-arg ref="userRepository" />
    </bean>
</beans>

或者使用注解:

@Component
public class UserRepositoryImpl implements UserRepository {
    // ...
}

@Component
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}


 

标签:myRepository,userRepository,依赖,DI,Spring,UserRepository,public
From: https://blog.csdn.net/m0_65347933/article/details/140963563

相关文章

  • 对于springboot无法连接redis解决方案
    对于springboot无法连接redis解决方案一、测试是否能在本地应用上访问到你的redis(如果是部署在linux上的话)1.开启telnet功能2.开始测试端口是否能访问到(适用于所有,包括MQ)3.开放6379端口4.看spring的配置文件注意redis的缩进位置5.pom依赖一、测试是否能在本地......
  • 【Spring源码分析】Spring Scope功能中的动态代理 - Scoped Proxy
    本文基于Springboot3.3.2及Springcloud2023.0.1版本编写。SpringScopedProxy是什么在使用Springcloud配置中心动态配置更新功能时,笔者发现在给一个类加上@RefreshScope注解后,其中@Value注入的字段会被自动更新。起初笔者以为Spring在收到配置更新事件后会自动设置该bean的......
  • 契约锁电子签章平台 /param/edits 远程代码执行漏洞复现(XVE-2024-18394)
    0x01产品简介契约锁电子签章平台是上海亘岩网络科技有限公司推出的一套数字签章解决方案。契约锁为中大型组织提供“数字身份、电子签章、印章管控以及数据存证服务”于一体的数字可信基础解决方案,可无缝集成各类系统,让其具有电子化签署的能力,实现组织全程数字化办公。通......
  • 【深入剖析】Spring依赖注入的最佳实践(@Autowired的正确用法)
    文章目录为什么Spring不推荐使用@Autowired进行字段注入?字段注入的使用与弊端1.不可见的依赖关系2.无法使用final修饰符3.测试不便推荐的替代方案1.构造器注入构造器注入的优势包括2.设值注入设值注入的优势包括总结为什么Spring不推荐使用@Autowired进行字......
  • springblade技术架构
    1.前后端的下载运行与对接SpringBlade源码下载地址https://gitee.com/smallc/SpringBlade打开终端,事先准备好一个空文件夹创建project文件夹在project文件夹下创建cloud、boot、vue文件夹进入cloud执行gitclone命令gitclonehttps://gitee.com/smallc/SpringBlade.git下......
  • Springboot计算机毕业设计电影推荐网站0unwo
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,电影分类,电影信息,通知公告,电影资讯开题报告内容一、研究背景与意义随着互联网技术的飞速发展,在线娱乐已成为人们日常生活中不可或缺的一部分。电影作为......
  • Springboot计算机毕业设计电商订单管理系统(程序+源码+数据库)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,商品分类,商家,商品信息开题报告内容摘要本文旨在设计并实现一个高效、易用的电商订单管理系统,以满足现代电商企业对订单处理、库存控制、物流跟踪及财务......
  • Springboot计算机毕业设计电脑商城购物系统(数据库、调试部署、开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,商品分类,商品品牌,商品信息开题报告内容1.选题背景及意义1.1选题背景随着计算机和网络的普及,电子商务已经成为现代社会不可或缺的一部分。特别是在21......
  • Spring Boot 中使用 JSON Schema 来校验复杂JSON数据
    JSON是我们编写API时候用于数据传递的常用格式,那么你是否知道JSONSchema呢?在数据交换领域,JSONSchema以其强大的标准化能力,为定义和规范JSON数据的结构与规则提供了有力支持。通过一系列精心设计的关键字,JSONSchema能够详尽地描述数据的各项属性。然而,仅凭JSONSchema......
  • Unity使用多屏幕Display以及不同屏幕的射线检测
    0.背景最近在做一个双屏游戏,一个场景中有两个摄像机,分别渲染到两个屏幕显示,然后在点击不同的屏幕时,要从不同的摄像机发射射线检测与场景中的物体交互。1.设置多屏unity中设置多屏的方式很简单,选中摄像机组件中的TargetDisplay属性即可。2.显式地激活连接的屏幕在确保连......