JavaEE-Spring(IoC控制反转,DI依赖注入,Spring项目创建和基本使用,ApplicationContext和BeanFactory的区别)

news2025/1/10 20:37:26

文章目录

  • 1. IoC
    • DI
  • 2. Spring项目创建和使用
    • ApplicationContext和BeanFactory的区别

1. IoC

Spring是一个包含多个工具方法的IoC容器

tomcat是web容器
List/Map是数据存储容器

IoC:Inversion of Control(控制反转)
将对象的控制权交给Spring,自己不在需要管理所有的对象。


在程序开发中,经常出现一个对象的创建依赖另一个对象的情况,如果采用在对象内new依赖对象,这样会导致代码的耦合性比较高。
底层依赖初始化发生改变,会导致整体改变。

可以选择通过传参的方式,将依赖的对象以参数的形式传递进来。这样依赖的对象发生改变,上层代码不需要改变。

上述过程就是一种控制权反转过程,将依赖对象的控制权反转。达到解耦目的。
这就是IoC的思想

IoC的优点:

  1. 实现代码解耦
  2. 对象的声明周期交给IoC框架维护,不需要关注对象的声明周期。

Spring IoC的核心功能

  1. 将对象存储到Spring中
  2. 将对象从Spring中取出

学习Spring的核心就是学习如何将对象存放到Spring中,再从Spring中取出对象的过程

DI

DI:Dependency Injection 依赖注入

依赖注入:IoC运行器件,动态的将某种关系注入到对象中,通过引入Ioc容器,利用依赖关系注入的方式实现对象的解耦。

IoC与DI的区别是什么

  1. IoC是实现目标的一种思想,DI就是具体实现

2. Spring项目创建和使用

创建Spring核心项目,将对象存储到Spring中,从Spring中取出对象

创建项目:

  1. 首先创建maven项目
  2. 添加spring框架支持(spring-context、spring-beans)
  3. 创建启动类,添加main方法

注意:如果没有梯子,需要切换maven国内源,这里并不在介绍。
如果包下载失败,找到setting,找到本地仓库,将本地仓库全部删除后重新下载

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>
</dependencies>

将对象储存到Spring中

  1. (首次)在Spring项目中添加配置文件
  2. 创建Java对象
  3. 在配置文件中将要保持到Spring中的Java对象进行注册

在Spring项目中添加配置文件:resource文件下新增文件,这个文件名称为xxx.xml(这里以spring.xml举例)
在这里插入图片描述
xml内容:

<?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">
</beans>

创建Java对象:
在这里插入图片描述
将对象通过配置文件,注册到Spring中
在这里插入图片描述
bean标签就是代表注册对象。

id属性类似于key,value。从Spring中拿注册的对象就是靠id属性。
class属性指的是要注册的Java类名。
id和class类名可以不同,二者没有任何关系。一般id为小驼峰,类名使用大驼峰。

从Spring中将对象取出:

  1. 得到Spring上下文对象
  2. 通过上下文对象提供的方法,获取Spring中需要的Java对象,并使用。

获取Spring上下文对象

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class FirstSpring {
    public static void main(String[] args) {
        System.out.println("Hello Spring");
        //获取Spring上下文对象,传入Spring配置文件名称,这里是spring.xml
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

        //通过上下文对象提供的方法获取需要的对象,传递对象id值,不是类名
        user u = (user) context.getBean("userInfo");

        u.Print("Spring");
    }
}

在这里插入图片描述

由上图可知,对象通过Spring获取,实现了解耦。

此外Spring上下文信息不仅仅可以通过ApplicationContext获取,还可以通过BeanFactory来获取。

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class FirstSpring {
    public static void main(String[] args) {
        System.out.println("Hello Spring");
        //获取Spring上下文对象,传入Spring配置文件名称,这里是spring.xml
        //ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        //通过上下文对象提供的方法获取需要的对象,传递对象id值,不是类名
//        user u = (user) context.getBean("userInfo");

        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring.xml"));

        user u = (user) factory.getBean("userInfo");
        u.Print("Spring");
    }
}

ApplicationContext和BeanFactory的区别

相同点:都可以从容器中获取对象,都提供了getBean方法

不同点:

  1. ApplicationContext是BeanFactory的子类

    BeanFactory只提供基础访问bean对象方法

    ApplicationContext在BeanFactory的基础上提供了更多的方法实现(国际化支持,资源访问支持等)

  2. BeanFactory是按需加载对象bean,ApplicationContext是饿汉模式,在创建时会将所有的Bean对象加载起来。

    ApplicationContext业务响应快,系统资源开销大

    BeanFactory节省系统资源,业务响应懒加载模式,响应慢。

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

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

相关文章

RK3399+PCIe+FPGA 在高速AD采样中的应用

一、需求 要实现高速AD/DA的数据采集&#xff0c;并发送到高性能arm核进行数据处理&#xff1b; 方案RK3399pcieFPGAAD/DA。 二、器件介绍 一、RK3399 RK3399是一款低功耗、高性能处理器&#xff0c;用于计算、个人移动互联网设备和其他智能设备应用。基于Big.Little架构&…

计算机发展史之查尔斯·巴贝奇

查尔斯巴贝奇&#xff08;Charles Babbage&#xff0c;1791年12月26日—1871年10月18日&#xff09;是一名英国数学家、发明家、科学家&#xff0c;科学管理的先驱者&#xff0c;出生于一个富有的银行家的家庭&#xff0c;曾就读于剑桥大学三一学院。 他在24岁时就被选为英国皇…

智慧医院数据可视化(数据大屏)

本次分享的作品是用软件Axure8.0&#xff08;兼容9和10&#xff09;制作的针对智慧医院设计的数据可视化大屏&#xff0c;其作品内容主要是对医院的运营情况、门诊、住院、手术、药品、医务、医疗设备、卫生耗材以及医疗质量数据进行综合可视分析。 运营情况:对医院的整体数据…

左神算法学习:第一天-------位运算

前言 位运算是在算法设计中的一种非常重要和高效的方法&#xff0c;常见的有与运算&#xff0c;非运算&#xff0c;异或运算。我们常用的比较多的可能就是异或运算&#xff0c;又叫无进位相加。 1.1 取非运算----&#xff08;~&#xff09; 取非运算其实就是和我们的无符号数…

cadence SPB17.4 - 用元件管理器来更新原理图中的元件属性信息

文章目录cadence SPB17.4 - 用元件管理器来更新原理图中的元件信息概述笔记修正原理图库修正CIS库的元件登记表ENDcadence SPB17.4 - 用元件管理器来更新原理图中的元件信息 概述 画好图后, 出了BOM. 同学指出BOM中有些元件型号信息不合适, 影响元件购买, 想改一下. 更新了原…

设计模式-桥接、职责链、中介

前言 本文为datawhale2022年12月组队学习《大话设计模式》task6打卡学习。 【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern 一、桥接模式 1.1 基本定义 桥接模式&#xff08;Bridge Pattern&#xff09;又称为柄体(Handle and Body)模式或接口(In…

第十二讲:生成树概念及STP技术应用

在传统的交换网络中&#xff0c;设备通过单条链路进行连接&#xff0c;当某一个点或是某一个链路发生故障时可能导致网络无法访问&#xff0c;解决这种问题的办法是在网络中提供冗余链路&#xff0c;但是交换机网络中的冗余链路会产生广播风暴、MAC地址失效等现象&#xff0c;最…

StarRocks 统计信息和 Cost 估算

导读&#xff1a;欢迎来到 StarRocks 源码解析系列文章&#xff0c;我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节&#xff0c;助你逐步了解这款明星开源数据库产品。本期 StarRocks 技术内幕将主要介绍 StarRocks 统计信息和 Cost 估算。 1.背景 在学习本文之前&…

mysql搭建主从复制

Mysql主从复制搭建过程&#xff1a; 主从需同步时间&#xff0c;主开启ntpd&#xff08;ntp网络时间协议&#xff0c;它的端口号udp123&#xff09;服务-----修改配置&#xff0c;从通过/usr/sbin/ntpdate 主ip(ntpdate包需要提前安装)&#xff1b;主&#xff1a;开启中继二进…

整数划分问题(Java递归)

整数划分问题&#xff08;Java递归&#xff09; 文章目录整数划分问题&#xff08;Java递归&#xff09;0、 问题描述1、递归式2、代码3、参考0、 问题描述 整数划分问题 将正整数n表示成一系列正整数之和&#xff1a;nn1n2…nk&#xff0c;其中n1≥n2≥…≥nk≥1&#xff0c;k…

数字校园建设方案技术建议书

【版权声明】本资料来源网络&#xff0c;仅用于行业知识分享&#xff0c;供个人学习参考&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间进行删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1 华为数字化…

“设计”小哥转行5G网络优化工程师!从零开始,三个月实现逆风翻盘~

5G网络优化&#xff0c;一个陌生的领域&#xff0c;对于一个毫无经验的小白来说&#xff0c;选择转行必定是需要勇气和决心的。好在&#xff0c;在决定选择5G网络优化的这一段时间里&#xff0c;老师给予了我最大的帮助和支持&#xff0c;包括从授课&#xff0c;到练习&#xf…

【Linux】基础IO(open、文件描述符、缓冲区)

文章目录1、从文件操作开始1.1 文件操作的系统调用接口1.2 文件描述符2、重定向3、缓冲区1、从文件操作开始 在C语言阶段&#xff0c;接触了很多库函数&#xff0c;如fopen、fclose、fread和fwrte&#xff0c;这些函数帮助了程序实现了内存与磁盘的输入输出功能。 不过之前都…

轻松搭建MQTT服务器,开发流程全透明

1、使用场景 MQTT服务器适用场景就不多介绍了&#xff0c;基本上实在IOT圈发光发热&#xff0c;所以说是特定领域的一个服务端软件&#xff0c;我们是用在车联网的环境里&#xff0c;用来发布消息。 2、选型 最早说需要使用mqtt服务器&#xff0c;然后我以为需要自己开发服务…

专利代理机构代理专利流程

代理申请专利流程是怎么样的&#xff1f; (一)咨询 1、 确定发明创造的内容是否属于可以申请专利的内容。 (二)技术交底 1、申请人向专利代理人提供有关发明创造的背景资料或委托检索有关内容; 2、申请人详细介绍发明创造的内容&#xff0c;帮助专利代理人充分理解发明创造…

【windows下nginx反向代理 ip地址和域名(含启动重启和关闭3个脚本)】 1.vue案例必须修改vue.config.js

例子1&#xff1a;代理vue的web服务器 1)去官网下nginx: download 下载windows版本nginx,并写好脚本,总体目录如下: StartNginx.bat // 启动脚本 echo off echo "nginx start !!!" nginx.exe -c conf/nginx.conf pause ReStartNginx.bat // 修改nginx.conf后重启脚…

redis学习笔记(基础)

Redis简介 Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合&#xff0c;位图&#xff0c;hyperloglogs等数据类型。内置复制、…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案

XM-1203-FPGA飞腾定制主板 自主可控&#xff0c;国产CPU、BIOS和国产Linux操作系统 性能稳定&#xff0c;FT-2000/4处理器 功能接口多样化&#xff0c;可扩展性强 高度集成&#xff0c;具有丰富的接口和电磁兼容性能. XM-1203-FPGA基于飞腾4 核CPU FT-2000/4的处理器板&#x…

【Javassist】快速入门系列09 当检测到数组创建时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

springboot整合之统一结果返回

特别说明&#xff1a;本次项目整合基于idea进行的&#xff0c;如果使用Eclipse可能操作会略有不同&#xff0c;不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…