SpringBoot 如何使用 IOC 容器

news2024/10/5 18:24:32

SpringBoot 如何使用 IOC 容器

Spring 是一个非常流行的 Java 开发框架,它提供了一个强大的 IoC(Inversion of Control)容器来管理 Java 对象之间的依赖关系。在 SpringBoot 中,我们可以非常方便地使用这个 IoC 容器来管理我们的 Java 对象,本文将介绍 SpringBoot 中如何使用 IoC 容器。

在这里插入图片描述

IoC 容器简介

IoC 容器是 Spring 框架的核心,它负责管理 Java 对象之间的依赖关系。在传统的 Java 开发中,我们需要手动创建和管理 Java 对象之间的依赖关系,这样会导致代码的复杂性和可维护性变得非常差。而在 Spring 框架中,我们只需要将对象的创建和依赖关系的维护交给 IoC 容器来处理,就可以大大简化我们的代码开发过程。

Spring 的 IoC 容器采用了依赖注入(Dependency Injection)的方式来管理对象之间的依赖关系。依赖注入是指,容器在创建对象时,自动将对象所依赖的其他对象注入到该对象中,从而实现对象之间的依赖关系。依赖注入可以通过构造函数、Setter 方法、字段注入等方式来实现。

SpringBoot 中的 IoC 容器

SpringBoot 中的 IoC 容器是基于 Spring 框架的,它提供了一些便利的注解和配置方式,使得我们可以更加方便地使用 IoC 容器来管理 Java 对象之间的依赖关系。

注入方式

在 SpringBoot 中,我们可以使用以下方式来进行依赖注入:

构造函数注入

构造函数注入是指,通过构造函数来注入对象之间的依赖关系。在 SpringBoot 中,我们可以使用 @Autowired 注解来自动注入依赖对象。

@Service
public class UserService {
    private final UserRepository userRepository;

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

    // ...
}

在上面的代码中,我们定义了一个 UserService 类,它依赖于一个 UserRepository 类。在构造函数中,我们使用 @Autowired 注解来注入 UserRepository 对象。

Setter 方法注入

Setter 方法注入是指,通过 Setter 方法来注入对象之间的依赖关系。在 SpringBoot 中,我们可以使用 @Autowired 注解来自动注入依赖对象。

@Service
public class UserService {
    private UserRepository userRepository;

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

    // ...
}

在上面的代码中,我们定义了一个 UserService 类,它依赖于一个 UserRepository 类。我们定义了一个 setUserRepository 方法,并使用 @Autowired 注解来注入 UserRepository 对象。

字段注入

字段注入是指,通过直接注入字段来实现对象之间的依赖关系。在 SpringBoot 中,我们可以使用 @Autowired 注解来自动注入依赖对象。

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    // ...
}

在上面的代码中,我们定义了一个 UserService 类,它依赖于一个 UserRepository 类。我们使用 @Autowired 注解来注入 UserRepository 对象。

作用域

在 SpringBoot 中,我们可以使用以下作用域来管理对象的生命周期:

Singleton

Singleton 是默认的作用域,它表示只创建一个对象,并且整个应用程序共享这个对象。在 SpringBoot 中,我们可以使用 @Scope("singleton") 注解来指定单例模式。

@Service
@Scope("singleton")
public class UserService {
    // ...
}

Prototype

Prototype是指每次请求都会创建一个新的对象。在 SpringBoot 中,我们可以使用 @Scope("prototype") 注解来指定原型模式。

@Service
@Scope("prototype")
public class UserService {
    // ...
}

延迟加载

在 SpringBoot 中,我们可以使用 @Lazy 注解来指定延迟加载。延迟加载是指,只有在需要使用对象时才会创建这个对象。

@Service
@Lazy
public class UserService {
    // ...
}

依赖注入的限定符

在 SpringBoot 中,我们可以使用 @Qualifier 注解来限定依赖注入的对象。假设我们有两个相同类型的对象,我们可以使用 @Qualifier 注解来指定要注入哪一个对象。

@Service
public class UserService {
    @Autowired
    @Qualifier("userRepositoryA")
    private UserRepository userRepository;

    // ...
}

在上面的代码中,我们使用 @Qualifier("userRepositoryA") 注解来指定要注入的 UserRepository 对象是 userRepositoryA

示例代码

下面是一个简单的 SpringBoot 示例代码,它演示了如何使用 IoC 容器来管理对象之间的依赖关系。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner demo(UserService userService) {
        return (args) -> {
            // 使用 UserService 对象
            User user = userService.getUserById(1L);
            System.out.println(user);
        };
    }
}

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // getter 和 setter 方法
}

在上面的代码中,我们定义了一个 Application 类,它使用了 SpringBoot 的注解 @SpringBootApplication。在 Application 类中,我们定义了一个 CommandLineRunner 类型的 Bean,并注入了一个 UserService 对象。在 demo 方法中,我们使用 UserService 对象来获取一个用户对象,并输出到控制台。

UserService 类中,我们使用 @Autowired 注解来注入一个 UserRepository 对象,并在 getUserById 方法中使用它来获取用户对象。

UserRepository 接口中,我们继承了 Spring 的 JpaRepository 接口,并指定了实体类 User 和主键类型 Long

User 类中,我们使用 JPA 注解来指定实体类和主键。

结论

SpringBoot 提供了一个非常强大的 IoC 容器,它可以帮助我们管理 Java 对象之间的依赖关系。在 SpringBoot 中,我们可以使用注解和配置来实现依赖注入和对象作用域的管理。使用 SpringBoot 中的 IoC 容器可以大大简化我们的代码开发过程,提高代码的可维护性和可扩展性。

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

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

相关文章

骨传导耳机音质怎么样,几款解析力度不错的骨传导耳机分享

​骨传导耳机在之前的时候一直是“冷门”的&#xff0c;但是随着技术的进步&#xff0c;现在骨传导耳机也逐渐被大家所熟知。对于喜欢运动和健身的人来说&#xff0c;骨传导耳机可以避免佩戴普通耳机导致耳朵疼痛的情况。因此&#xff0c;目前在市面上很多骨传导耳机都很受欢迎…

Git教程(快速上手,超详细)

文章目录 版本控制Git环境配置Git基本理论Git项目搭建Git文件操作使用码云IDEA集成GitGit分支 版本控制 版本迭代:每次更新就会有新的版本&#xff0c;旧的版本需要保留。所以我们需要一个版本控制工具帮助我们处理这个问题 版本控制&#xff08;Revision control&#xff09;是…

入门学习编码器与自编码器1----包括详细的理论讲解与详细的python程序代码,小白直接看懂!!!纯干货

文章目录 前言--为什么要学习编码器和自编码器&#xff1f;一、编码器与自编码器究竟是什么&#xff1f;二、下面是一个简单的Python实现自编码器的示例三、程序运行结果四、查看模型结构总结 前言–为什么要学习编码器和自编码器&#xff1f; 学习编码器和自编码器可以帮助我…

【数据分享】1929-2022年全球站点的逐月平均风速数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

「你将购买的是虚拟内容服务,购买后不支持退订」,真的合理么?

编辑导语&#xff1a;你是否也有见过相似提示&#xff0c;即虚拟内容服务购买之后不予退款&#xff1f;那么你有想过&#xff0c;在这一规定背后&#xff0c;其制约因素都有什么吗&#xff1f;这一规定是合理的吗&#xff1f;用户若真的有退款需求&#xff0c;产品上是否能实现…

卷积计算加速方法--分块卷积1

文章目录 1、大尺寸卷积存在的问题2、分块卷积overlap产生的来源3、分块卷积overlap的计算4、结论及加速效果 1、大尺寸卷积存在的问题 当卷积的输入太大导致内存不够用时&#xff0c;考虑将一大块卷积分成多个小块分别进行卷积&#xff0c;相当于将原始输入分成几个小的输入经…

【C++】C++11:线程库和包装器

C11最后一篇文章 文章目录 前言一、线程库二、包装器和绑定总结 前言 上一篇文章中我们详细讲解了lambda表达式的使用&#xff0c;我们今天所用的线程相关的知识会大量的用到lambda表达式&#xff0c;所以对lambda表达式还模糊不清的可以先将上一篇文章看明白。 一、线程库 在…

域名解析详解

域名解析 记录类型&#xff1a; 提示&#xff1a; 将域名指向云服务器&#xff0c;选择 A&#xff1b; 将域名指向另一个域名&#xff0c;选择 CNAME&#xff1b; 建立邮箱选择 MX&#xff0c;根据邮箱服务商提供的 MX 记录填写。 记录类型解释A用来指定域名的 IPv4 地址&…

燃气管网监测设备:燃气管网压力在线监测

燃气作为一种重要的能源&#xff0c;广泛用于家庭、工业和商业领域。然而&#xff0c;燃气管网系统在运输和分配过程中可能面临压力波动、管道老化、外部破坏等问题&#xff0c;可能导致燃气泄漏和事故发生。燃气管网压力在线监测是保障燃气管网安全运营的重要手段之一。通过燃…

Linux系统之部署Homepage个人导航页

Linux系统之部署Homepage个人导航页 一、Homepage介绍1.1 Homepage简介1.2 Homepage主要特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装Node.js 四、部署Node.js 环境4.1 下载Node…

感谢ChatGPT,救了我狗的命!

前一段时间&#xff0c;国外一位小哥哥在推特上发布了一条消息&#xff0c;声称GPT-4拯救了自家狗狗的性命。 这是怎么一回事呢&#xff1f; 这个小哥哥养了一只两岁的边境牧羊犬&#xff0c;这只牧羊犬被诊断出患有蜱传疾病&#xff0c;这属于一种细菌性传染病。 虽然小哥哥一…

30分钟吃掉DQN算法

表格型方法存储的状态数量有限&#xff0c;当面对围棋或机器人控制这类有数不清的状态的环境时&#xff0c;表格型方法在存储和查找效率上都受局限&#xff0c;DQN的提出解决了这一局限&#xff0c;使用神经网络来近似替代Q表格。 本质上DQN还是一个Q-learning算法&#xff0c;…

金九银十预备秋招: 大厂面试必考点及 Java 面试框架知识点整理

Java 面试 “金九银十”这个字眼对于程序员应该是再熟悉不过的了&#xff0c;每年的金九银十都会有很多程序员找工作、跳槽等一系列的安排。说实话&#xff0c;面试中 7 分靠能力&#xff0c;3 分靠技能&#xff1b;在刚开始的时候介绍项目都是技能中的重中之重&#xff0c;它…

龙膜公益“聚光行动”再起航 为云南山区小学援建绿色电脑教室

中国&#xff0c;上海——近日&#xff0c;全球汽车膜品牌龙膜的公益活动“为山区学校援建绿色电脑教室”在云南泸西县再度起航。为当地的“阿盈里小学”和“歹鲁小学”添置了2间电脑教室&#xff0c;配备了82台再生电脑&#xff0c;为600多名学生提供了数字化设备的使用机会&a…

Android Hilt:强大的依赖注入框架,高级传参解个耦?

作者&#xff1a;J船长 一、Hilt 干依赖注入的 Hilt是干嘛的 Hilt&#xff0c;一个依赖注入框架&#xff0c;谷歌搞出来的&#xff0c;基于Dagger&#xff0c;但是更加简洁易用。 什么是依赖注入 &#xff08;Dependency Injection&#xff09; 依赖注入是一种设计模式。主…

高校劳动积分小程序/基于微信小程序的高校劳动积分系统

摘 要 随着信息技术互联网和小程序的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的微信小程序应运而生&#xff0c;各行各业相继进入信息管理…

系统架构设计师-系统工程与信息系统基础(1)

一、系统工程概念 【系统工程】是一种组织管理技术。 【系统工程】是为了更好的实现系统的目的&#xff0c;对系统的组成要素、组成结构、信息流、控制机构进行分析研究的科学方法。 【系统工程】从整体出发、从系统观念出发、以求【整体最优】 【系统工程】利用计算机作为…

开放式耳机会不会吵到别人?2023年开放式耳机科普!

在了解开放式耳机会不会吵到别人之前&#xff0c;我们先了解下开放式耳机的基本知识&#xff01; 开放式耳机是一种不入耳&#xff0c;没有封闭耳朵的蓝牙耳机&#xff0c;可以听歌的同时接收来自外界声音&#xff0c;安全性高&#xff0c;也减少长期佩戴耳机带来的负担&#…

2023火爆的11门编程语言

2023火爆的11门编程语言 对于我个人来说没有语言偏好&#xff0c;根据不同的应用领域和需求&#xff0c;不同的编程语言都有其独特的优势和适用性。无论使用何种语言只要能更好的实现需求&#xff0c;解决痛点问题&#xff0c;就是好语言。 那么各种语言应用的场景解决了哪些…

项目管理专业人员能力评价CSPM与项目管理PMP对应关系

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…