Spring核心概念复习IOC与DI

news2024/11/14 15:04:17

Spring IOC概念

控制反转(Inversion of
Control):这是一种设计原则,用于降低代码之间的耦合度。在传统的编程模式中,对象之间的依赖关系是由对象自身创建和维护的。而在控制反转模式下,对象的创建和依赖关系的维护被交给了外部的容器或框架来管理。在Spring框架中,IOC容器负责对象的创建、配置和组装,实现了依赖注入(Dependency
Injection, DI),从而提高了代码的可重用性和可维护性。

Spring DI概念

Spring 依赖注入(Dependency Injection,简称DI)是实现控制反转(Inversion of ControlIoC)的一种技术手段。依赖注入的核心思想是将组件之间的依赖关系交由外部容器(如Spring IoC容器)在运行时动态注入,而不是在组件内部直接创建或查找依赖对象。这样做的主要好处是降低了组件之间的耦合度,提高了代码的可重用性和可维护性。

依赖注入的主要概念包括:
依赖(Dependency):组件所依赖的对象或资源,例如,一个用户服务(UserService)可能依赖于一个用户存储库(UserRepository)来访问数据库。

注入(Injection):容器将依赖对象传递给需要它的组件的过程。注入可以通过构造器、Setter方法或字段赋值的方式进行。

组件(Component):在Spring中,通常指的是被Spring IoC容器管理的Java类实例。这些组件可以是服务、数据访问对象、控制器等。

Bean:在Spring IoC容器中,组件通常被称为BeansSpring容器负责创建、配置和管理这些Bean的生命周期。

配置元数据(Configuration Metadata):定义了Bean如何被创建和它们的依赖关系。这可以是XML配置文件、注解或Java配置类。

自动装配(Autowiring):Spring容器可以自动解析和注入Bean的依赖关系。Spring支持通过类型(byType)、名称(byName)或构造器参数(constructor)来自动装配。

依赖注入的实现方式:
构造器注入:通过构造器参数来注入依赖,这种方式是强制性的,因为构造器总是会被调用。

Setter方法注入:通过Setter方法注入依赖,这种方式是可选的,因为可以设置默认值或留空。

注解注入:使用@Autowired注解来指示Spring容器自动注入依赖。Spring还提供了@Qualifier注解来解决同名Bean的歧义问题。

字段注入:直接在字段上使用@Autowired注解,Spring容器会直接在字段上注入依赖,这种方式不推荐使用,因为它破坏了字段的封装性。

依赖注入的优点:
降低耦合度:组件不直接依赖于具体的依赖实现,而是依赖于接口或抽象类,使得代码更加模块化。
提高代码的可测试性:可以轻松地替换依赖项,进行单元测试。
增强代码的可维护性:当依赖项的实现发生变化时,不需要修改组件代码,只需调整配置。
促进重用:相同的组件可以在不同的应用上下文中重用,只需不同的配置即可。

Spring IOC的使用

spring中IOC的五个核心包在这里插入图片描述
将五个核心报引入编码工具
在这里插入图片描述

新建实体类User并添加三个属性

package com.weavernorth.ceshi.entry;

public class User {

    private int userid;
    private String account;
    private String password;

    public int getUserid() {
        return userid;
    }

    public void setUserid(int userid) {
        this.userid = userid;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", account='" + account + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

新建spring配置文件applicationContext.xml,配置文件中输入bean约束。使用spring生成一个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="user" class="com.weavernorth.ceshi.entry.User">
        <property name="userid" value="123"/>
        <property name="account" value="root"/>
        <property name="password" value="123456"/>
    </bean>

</beans>

创建测试类SpringTest.java

public class SpringTest {
    
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Object user = applicationContext.getBean("user");
        System.out.println(user);
    }

}

Spring IOC实现原理

最初的设想,通过反射去创建对象并赋值,反射实现代码

    /**
     * 通过反射获取对象
     */
    @Test
    public void f02() throws Exception {
        Class<?> name = Class.forName("com.weavernorth.ceshi.entry.User");
        Object user = name.newInstance();
        Method setUserid = name.getMethod("setUserid", int.class);
        setUserid.invoke(user,101);

        Method setAccount = name.getMethod("setAccount", String.class);
        setAccount.invoke(user, "root");

        Method setPassword = name.getMethod("setPassword", String.class);
        setPassword.invoke(user, "123456");
        
        System.out.println(user);
    }

//输出
User{userid=101, account='root', password='123456'}

spring框架实现

此处开始就是spring的实现代码了

在AbstractApplicationContext.class中的refresh()方法下ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();加载了applicationContext.xml配置文件。

refresh()方法中 包含了整个Bean的生命周期

在这里插入图片描述
具体实现流程图
在这里插入图片描述

Spring IOC的运行时序图

在这里插入图片描述
在IOC中的DI的运行时序图
在这里插入图片描述

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

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

相关文章

华为eNSP:静态路由配置、浮动路由配置

静态路由&#xff1a; 一、拓扑图 二、路由器配置 2.1&#xff1a;配置接口 R1&#xff1a; [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [r1-GigabitEthernet0/0/0]qu [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 10.1.1.1 24 [r1-GigabitEth…

汽车功能安全--TC3xx LBIST触发时机讨论

目录 1. LBIST架构 2. LBIST寄存器配置 3. LBIST触发时机 LBIST&#xff0c;全称Logic Built-in Self Test。 在TC3xx中&#xff0c;LBIST是一种硬件功能安全机制&#xff0c;目的是为了探测MCU内部逻辑电路的潜伏故障(latent faults)。 从使用者角度来看&#xff0c;只需…

celery笔记1

2 Celery介绍 2.1 Celery是什么 # 1 celery 是一个灵活且可靠的&#xff0c;处理大量消息的分布式系统&#xff0c;可以在多个节点之间处理某个任务-现在干一堆活&#xff0c;如果一个人&#xff0c;需要一件件来做-招了几个人&#xff0c;分别安排不同人干活-并发效果--》同…

如何评估超低排放除尘器的长期运行成本和维护成本?

评估超低排放除尘器的长期运行成本和维护成本涉及多个方面&#xff0c;朗观视觉小编认为&#xff0c;以下是一些关键因素&#xff1a; 初始投资成本&#xff1a;首先考虑设备的购买成本&#xff0c;包括除尘器本身及其所有必要的配件和安装费用。 能源消耗&#xff1a;评估除尘…

智能楼层导视软件:提升楼宇导航体验的技术解决方案

亲爱的技术爱好者、开发者及楼宇管理者们&#xff0c;您是否曾为大型建筑内复杂多变的楼层布局而烦恼&#xff1f;是否希望为访客和员工提供更加直观、高效的导航服务&#xff1f;今天&#xff0c;我们向您介绍我们的最新产品——楼层导视软件&#xff0c;一款专为解决现代楼宇…

全渠道营销:SaaS行业的制胜之道

1. 什么是全渠道营销 全渠道营销&#xff08;Omnichannel Marketing&#xff09;是一种综合性的营销策略&#xff0c;旨在通过整合多个线上和线下渠道&#xff0c;实现销售和品牌推广的目标。这种策略强调在不同渠道间提供一致的品牌体验和无缝的过程&#xff0c;确保消费者在…

ssm 汽车的销售平台---附源码96800

目 录 摘 要 1 绪论 1.1 研究背景与意义 1.2研究开发现状分析 1.3主要研究内容 1.4论文章节安排 2 相关技术介绍 2.1Web编程语言 2.2 MySQL数据库 2.3 SSM框架介绍 3 系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 市场可行性分析 3.1.3 操作可行性分析…

上半年首次扭亏为盈,极兔中报背后藏着超预期成长潜力

快递行业的“黑马”极兔速递&#xff0c;如今跑出了新成绩。在近日公布的2024年中期业绩中&#xff0c;其上半年收入达到48.62亿美元&#xff0c;同比增长20.6%&#xff0c;领跑整个快递行业。 更令人眼前一亮的是利润&#xff0c;极兔上半年净利润首次转正为3102.6万美元&…

打造敏捷开发环境:JNPF低代码平台的实践与探索

在数字化转型的浪潮中&#xff0c;企业对软件开发的敏捷性和效率提出了更高的要求。传统的软件开发模式通常耗时长、成本高昂&#xff0c;难以迅速适应市场变化。低代码平台的出现&#xff0c;为解决这一问题提供了新的视角。本文将探讨如何运用JNPF低代码平台构建敏捷开发环境…

Linux远程管理—SSH协议

SSH协议是远程连接的安全性协议&#xff0c;该协议可以有效防止远程管理过程中的信息泄漏&#xff0c;是西安传输数据加密&#xff0c;能够防止DNS和IP欺骗&#xff0c;传输数据压缩&#xff0c;加快传输速度。 安全验证方法有口令验证和密钥验证两种实现手段&#xff0c;该协…

CentOS7 mysql-cluster安装与配置

目录 下载安装: #拷贝ndb_mgm和ndb_mgmd #创建并编辑配置文件 #初始化管理节点 安装数据节点和sql节点 #初始化mysql #启动mysql #登录并设置新密码 #启动ndbd节点: #启动和停止管理节点 mysql-cluster安装与配置 下载安装: 下载工具包地址:https://dev.m…

JAVA毕业设计165—基于Java+Springboot+vue3的二手房交易管理系统(源代码+数据库+11000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的二手房交易管理系统(源代码数据库11000字论文)165 一、系统介绍 本项目前后端分离(还有ssm版本)&#xff0c;分为用户、卖家、管理员三种角色 1、用户&a…

基于SSM的零食商城系统

1.项目介绍 基于SSM的零食商城系统&#xff0c;前端采用Bootstrap框架。 后台采用经典SSM框架。数据库采用MySQL。 包括用户前台和管理后台&#xff0c;后台管理又可以分为店员&#xff08;或客服&#xff09;和超级管理员&#xff0c; 会员可以通过商城门户进行查看商品、选…

N5171B EXG X 系列射频模拟信号发生器,9 kHz 至 6 GHz

N5171B 射频模拟信号发生器 产品综述 N5171B EXG X 系列中档性能射频模拟信号发生器可以提供 9 kHz 至 6 GHz 的频率范围&#xff0c;并针对制造测试进行了优化&#xff0c;具有更快的吞吐量、更长的正常运行时间以及适合的价格。 功能特点 ◆ ◆出色的硬件性能有助于最大…

朵拉朵尚和法国著名药企原料商Seqens正式签约建立战略合作

共探美丽新未来 朵拉朵尚和法国著名药企原料商Seqens正式签约建立战略合作 当前&#xff0c;正值全球生物医药产业爆发式增长的时期&#xff0c;在追求自然与科学完美融合的美丽征程中&#xff0c;国内知名护肤品牌朵拉朵尚再次迈出坚实步伐&#xff0c;与享誉全球的法国药企原…

Linux下qt程序缺少中文字库,中文显示为框框

现象 Linux下qt5.9编译程序&#xff0c;运行时候界面上的中文显示一个一个的框框。 如图 原因 开发板里缺少中文字库或者qt字库环境未正常配置导致的。 解决方法一&#xff1a; 如果系统中存在中文字库&#xff0c;一般是在/usr/share/下有一个fonts文件夹 配置qt中文字库路…

基于信号量和环形队列的生产者消费者模型

文章目录 POSIX信号量信号量接口初始化信号量销毁信号量等待信号量发布信号量 基于环形队列的生产者消费者模型单生产单消费多生产多消费 POSIX信号量 POSIX信号量和SystemV信号量作用相同&#xff0c;都是用于同步操作&#xff0c;达到无冲突的访问共享资源目的。 但POSIX可以…

网络安全之渗透测试实战-DC-3-靶机入侵

一、下载靶机DC-3&#xff0c;解压后导入Vmware Workstation https://pan.baidu.com/s/17BcSH6RqC7wuyB7PRNqOow?pwdkc12启动DC-3靶机&#xff0c;由于不知道密码&#xff0c;无需登录 二、靶机的网卡采用的是NAT模式自动获取IP地址&#xff0c;此时我们需要先获取其MAC地址…

黑神话悟空火到RD集体请假?文心快码助你速通游戏!

近期&#xff0c;一款名为《黑神话&#xff1a;悟空》的游戏席卷了朋友圈&#xff0c;以其独特的西游背景、引人入胜的剧情和极致的游戏体验&#xff0c;让众多玩家沉迷其中&#xff0c;欲罢不能。然而&#xff0c;这场“悟空风暴”也给我们的RD&#xff08;研究开发人员&#…

分贝通海外卡全新升级,引领企业全球支出管理新潮流

随着中国企业不断拓展海外市场,境外资金管理成为企业国际化进程中的一大挑战。面对复杂的国际金融环境和多变的汇率风险,企业迫切需要一个高效、安全、便捷的资金管理工具。 分贝通,全新升级海外卡,企业境外资金管理和安全保驾护航。 境外资金管理的痛点 1.汇率波动风险:国际…