【Spring——Spring的基础与创建】

news2024/11/23 19:41:40

目录

🍧1. 什么是 Spring ?

🫖1.1 容器

🍙1.2 IoC

🥽1.3 汽车类——传统写法

🍘1.4 汽车类——IoC 写法

🌭2. 配置 maven 国内源

🌮2.1 在设置中勾选文件

🍤2.2 在 settings.xml 中配置国内源

🍥2.3 删除本地仓库的所有 jar 包,重新下载

🍢3. 创建一个 Spring 项目

🥣3.1 创建一个普通的 Maven 项目

🍬3.2 添加 Spring 依赖

🫖3.3 创建一个启动测试类

🥮4. ApplicationContext 与 BeanFactory 

🍚5. getBean 的多种写法

🍭5.1 根据 名称 获取 Bean 对象

🧃5.2 根据 类型 获取 Bean 对象 

🍉5.3 根据 名称 + 类型 获取 Bean 


1. 什么是 Spring ?

Spring 指的是 Spring Framework (Spring 框架),用一句话来概括 Spring,那就是就 Spring 是包含了众多工具方法的 IoC 容器。将这个定义进一步拆分去理解的话,那就变成,什么是容器?什么是 IoC 容器了。

1.1 容器

直观上去理解,那就是容器是用来装东西的,像水杯拿来装水的。之前的文章中介绍的各种数据结构,像 List / Map / LinkedList 等,这些都是存储数据的容器。而 Tomcat ,则是 Web 容器。

1.2 IoC

Spring 是一个 IoC 容器。IoC = Inversion of Control,翻译成中文就是 “控制权反转”。在传统的程序开发中,对象的生命周期都是由程序员来控制的。程序员需要在哪个节点 new 一个对象,就手动创建。而在 Spring 中,对象的生命周期,不再由程序员或当前的代码片段来控制,而是由 Spring 来控制,即实现了控制权的翻转。听起来有点抽象,但通过下面列举的案例,会让同学们对控制权反转的概念有进一步的印象。

1.3 汽车类——传统写法

package Traditional;

public class Car {
    private Framework framework;

    public Car(){
        this.framework = new Framework();
    }

    public void init(){
        System.out.println("Car init");
        framework.init();
    }
}
package Traditional;

public class Framework {
    private Bottom bottom;

    public Framework(){
        this.bottom = new Bottom();
    }

    public void init(){
        System.out.println("Framework init");
        bottom.init();
    }
}
package Traditional;

public class Bottom {
    private Tire tire;

    public Bottom(){
        this.tire = new Tire();
    }

    public void init(){
        System.out.println("Bottom init");
        tire.init();
    }
}
package Traditional;

public class Tire {
    private int size = 15;

    public void init(){
        System.out.println("执行了 Tire init, size:"+size);
    }
}
package Traditional;

public class Test {
    public static void main(String[] args) {
        Car car = new Car();
        car.init();
    }
}

 输出:

Car init
Framework init
Bottom init
执行了 Tire init, size:15

如果当我们想自定义轮胎的大小,而不是上面写的那样默认是 15 时,代码就必须修改成以下形式:

package Traditional;

public class Tire {
    private int size = 15;

    public Tire(int size){
        this.size = size;
    }

    public void init(){
        System.out.println("执行了 Tire init, size:"+size);
    }
}
package Traditional;

public class Bottom {
    private Tire tire;

    public Bottom(int size){
        this.tire = new Tire(size);
    }

    public void init(){
        System.out.println("Bottom init");
        tire.init();
    }
}
package Traditional;

public class Car {
    private Framework framework;

    public Car(int size){
        this.framework = new Framework(size);
    }

    public void init(){
        System.out.println("Car init");
        framework.init();
    }
}
package Traditional;

public class Test {
    public static void main(String[] args) {
        Car car = new Car(20);
        car.init();
    }
}

输出:

Car init
Framework init
Bottom init
执行了 Tire init, size:20

当需要设定轮胎尺寸的时候,牵一发动全身,依次修改了所有类。

1.4 汽车类——IoC 写法

package IoC;

public class Car {
    private Framework framework;
    public Car(Framework framework){
        this.framework = framework;
    }
    public void init(){
        System.out.println("Car init");
        framework.init();
    }
}
package IoC;

public class Framework {
    private Bottom bottom;
    public Framework(Bottom bottom){
        this.bottom = bottom;
    }
    public void init(){
        System.out.println("Framework init");
        bottom.init();
    }
}
package IoC;

public class Bottom {
    private Tire tire;
    public Bottom(Tire tire){
        this.tire = tire;
    }
    public void init(){
        System.out.println("Bottom init");
        tire.init();
    }
}
package IoC;

public class Tire {
    private int size = 15;
    public Tire(int size){
        this.size = size;
    }
    public void init(){
        System.out.println("Tire init, Size:"+size);
    }
}
package IoC;

/*
* 模拟 IoC
 */
public class Test {
    private Tire tire;
    private Bottom bottom;
    private Framework framework;
    private Car car;
    public Test(){
        this.tire = new Tire(100);
        this.bottom = new Bottom(this.tire);
        this.framework = new Framework(this.bottom);
        this.car = new Car(this.framework);
    }

    public static void main(String[] args) {
        Test test = new Test();
        test.car.init();
    }
}

输出:

Car init
Framework init
Bottom init
Tire init, Size:100

可以看到,后面要修改轮胎尺寸只要在 Test 的构造方法里修改即可。也就表明了,IoC 这种方法,让类与类之间进行了解耦合。

2. 配置 maven 国内源

2.1 在设置中勾选文件

为了成功创建 Spring / Spring Boot,需要配置 maven 国内源。IDEA 中,有两份配置文件,所以在后续的配置过程中,要设置两次:给当前的项目配置以及给以后的新项目进行配置,如下图:

勾选 settings.xml 配置文件以及本次仓库文件如下: 

 

2.2 在 settings.xml 中配置国内源

 有上述文件的用户,需要将以下代码复制到<mirrors><mirrors>标签里面,完成国内源的配置:

<mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>        
</mirror>

2.3 删除本地仓库的所有 jar 包,重新下载

C:\Users\92002\.m2\repository

 删除该文件夹下的所有文件。

3. 创建一个 Spring 项目

3.1 创建一个普通的 Maven 项目

出现上述情况,便是 maven 国内源配置成功。

3.2 添加 Spring 依赖

pom.xml 文件中,添加 Spring 依赖:

    <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>

3.3 创建一个启动测试类

创建一个 Bean 对象

package com.IoC.demo;

public class UserService {
    public void sayHi(){
        System.out.println("Hi, UserService ~");
    }
}

将 Bean 存储到 Spring 中

在 resources 下创建一个文件,以让人知道意思的方式进行命名,此处命名为 spring_config.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"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="user" class="com.IoC.demo.UserService"></bean>
</beans>

 创建一个测试类来获取 Bean 对象

import com.IoC.demo.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        // 1. 先得到 spring 上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
        // 2. 获取 Bean 对象【依赖查找 -》 IoC 的一种实现方式】
        UserService userService = (UserService) context.getBean("user");
        // 3. 使用 Bean 对象(非必须)
        userService.sayHi();
    }
}

 

4. ApplicationContext 与 BeanFactory 

前面使用了 ApplicationContext 来得到 Spring 的上下文对象,下面使用 BeanFactory 来进行同样的操作:

import com.IoC.demo.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class Test2 {
    public static void main(String[] args) {
        // 1. 得到 Spring 上下文对象
        BeanFactory context =
                new XmlBeanFactory(new ClassPathResource("spring_config.xml"));
        // 2. 获取 Bean
        UserService userService = (UserService) context.getBean("user");
        // 3. 使用 Bean
        userService.sayHi();
    }
}

可以得到一样的结果。那二者有何区别呢?

相同点:两者都是容器管理对象,都可以获取 Bean,但要知道的是,BeanFactory 已经被弃用。

不同点:

1. ApplicationContext 是 BeanFactory 的子类,子类拥有父类的所有属性,也就意味着 ApplicationContext 拥有更多的功能。

2. 加载 Bean 的机制不同:BeanFactory 懒加载,按需加载,即使用一个 Bean,才加载一个 Bean,而 ApplicationContext 会一次性加载所有的 Bean 对象,虽然在一开始的时候会比较的慢,但后续获取对象飞快。

下面通过给 Bean 对象创建构造方法来看看这两种不同的加载方式把:

package com.IoC.demo;

public class UserService {
    public UserService(){
        System.out.println("hello~");
    }
    public void sayHi(){
        System.out.println("Hi, UserService ~");
    }
}

对于 ApplicationContext 来说: 

import com.IoC.demo.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    public static void main(String[] args) {
        // 1. 先得到 spring 上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring_config.xml");
//        // 2. 获取 Bean 对象【依赖查找 -》 IoC 的一种实现方式】
//        UserService userService = (UserService) context.getBean("user");
//        // 3. 使用 Bean 对象(非必须)
//        userService.sayHi();
    }
}

 而对于 BeanFactory 来说:

import com.IoC.demo.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class Test2 {
    public static void main(String[] args) {
        // 1. 得到 Spring 上下文对象
        BeanFactory context =
                new XmlBeanFactory(new ClassPathResource("spring_config.xml"));
//        // 2. 获取 Bean
//        UserService userService = (UserService) context.getBean("user");
//        // 3. 使用 Bean
//        userService.sayHi();
}
}

import com.IoC.demo.UserService;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class Test2 {
    public static void main(String[] args) {
        // 1. 得到 Spring 上下文对象
        BeanFactory context =
                new XmlBeanFactory(new ClassPathResource("spring_config.xml"));
        // 2. 获取 Bean
        UserService userService = (UserService) context.getBean("user");
//        // 3. 使用 Bean
//        userService.sayHi();
  }
}

 

5. getBean 的多种写法

5.1 根据 名称 获取 Bean 对象

UserService userService = (UserService) context.getBean("user");

5.2 根据 类型 获取 Bean 对象 

UserService userService = context.getBean(UserService.class);

 这样就不需要强制类型转换了。但这里存在一个问题,那就是如果像 Spring 中注入多个同一类型的 Bean 对象该怎么办?

<bean id="user" class="com.IoC.demo.UserService"></bean>
<bean id="user1" class="com.IoC.demo.UserService"></bean>

 IDEA 便会报错,说找到了两个,不知道是哪个:

 

5.3 根据 名称 + 类型 获取 Bean 

UserService userService = context.getBean("user",UserService.class);

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

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

相关文章

SpringCloud学习路线(4)—— Nacos注册中心

一、认识和安装Nacos &#xff08;一&#xff09;概念&#xff1a; Nacos是Alibaba的产品&#xff0c;现在是SpringCloud中的一个组件&#xff0c;相较于Eureka功能更加丰富。 &#xff08;二&#xff09;下载地址&#xff1a; https://github.com/alibaba/nacos/releases &am…

一文看懂《关于网络安全和信息化工作重要指示》

7月14日至15日&#xff0c;全国网络安全和信息化工作会议在京召开。《关于网络安全和信息化工作重要指示》也在会上得到解读与传达。 从近年来党的二十大等重大会议上网络安全和数据安全等相关话题多次被提及、我国陆续发布多部网络安全&数据安全相关政策法规等等&#xf…

个人微信号二次开发的实现,api接口

各位兄弟姐妹们大家好&#xff01;&#xff01;&#xff01;&#xff01; 我又瞧到了好玩的微信机器人分享给大家&#xff01; 社群运营这几年风头正盛&#xff0c;不能落伍啊&#xff0c;我们也赶紧组建了社群。 但是微信群还是社交属性为主的&#xff0c;当我们运营多个社群的…

(栈队列堆) 剑指 Offer 09. 用两个栈实现队列 ——【Leetcode每日一题】

❓ 剑指 Offer 09. 用两个栈实现队列 难度&#xff1a;简单 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead …

如何通过振动传感器实现设备的故障诊断和预测性维护?

在现代工业生产中&#xff0c;设备的故障和停机时间对于企业的生产效率和经济效益有着巨大的影响。为了提高设备的可靠性和降低维护成本&#xff0c;越来越多的企业开始采用振动传感器作为关键的监测工具。振动传感器能够实时监测设备的振动情况&#xff0c;并通过数据分析和算…

自制编译器代码4.6含义

规则一&#xff0c;识别一个" 规则二&#xff0c;识别除了",,\n.\r的其他字符 规则三&#xff0c;这里第一个\意思是一个转义字符\&#xff0c;意思是ASCII码 比如\077就是八进制ASCII码的? 规则四&#xff0c;识别其他所有字符 规则五&#xff0c;回到defailt状态 …

不懂代码也不用怕!10款无代码网站搭建平台

作为设计师&#xff0c;对网站满脑子的构思&#xff0c;却受限于时间和技能&#xff08;比如写代码&#xff09;&#xff0c;这是何其无奈&#xff01;那个在你脑中盘桓许久的网站&#xff0c;或许是一个博客&#xff0c;可能是作品展示网站&#xff0c;但无论是哪种&#xff0…

华为OD机试真题 Java 实现【等差数列】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答…

GUI实例

运行代码&#xff1a; //GUI实例 #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struct Lines_window :Window {Lines_window(Point xy…

《5.linux驱动开发-第2部分-5.2.字符设备驱动基础》最简单的模块源码分析 lsmod insmod modinfo rmmod dmesg

5.1.6.驱动应该这么学 5.1.6.1、先学好C语言 5.1.6.2、掌握相关预备知识 (1)硬件操作方面 (2)应用层API 5.1.6.3、驱动学习阶段 (1)注重实践&#xff0c;一步一步写驱动 (2)框架思维&#xff0c;多考虑整体和上下层 (3)先通过简单设备学linux驱动框架 (4)学会总结、记录&#x…

自动化测试框架性能测试报告模板

目录 一、项目概述 二、测试环境说明 三、测试方案 四、测试结果 五、结果分析 总结&#xff1a; 一、项目概述 1.1 编写目的 本次测试报告&#xff0c;为自动化测试框架性能测试总结报告。目的在于总结我们课程所压测的目标系统的性能点、优化历史和可优化方向。 1.2 …

高效太阳能太阳光模拟器

高效太阳能太阳光模拟器是一种能够高效模拟太阳光的设备。它能够产生与太阳光相近的光谱分布、光强和光照角度等特性的光线&#xff0c;用于太阳能相关的研究和应用中。 为了实现高效太阳能太阳光模拟器&#xff0c;以下几个方面是需要考虑的&#xff1a; 1. 光源&#xff1a;…

C++进阶—C++11新特性(移动语义右值引用可变参数模板lambda表达式function包装器bind函数)

目录 0. C11简介 1. 统一的列表初始化 1.1 {}初始化 1.2 std::initializer_list 2. 声明 2.1 auto 2.2 decltype 2.3 nullptr 3. 范围for循环 4. 智能指针 5. STL中一些变化 6. 右值引用和移动语义 6.1 左值引用和右值引用 6.2 左值引用与右值引用比较 6.3 右值…

三菱FX以太网模块设置ModbusTCP通讯

大家好&#xff0c;今天我们要来聊一聊转以太网捷米特JM-ETH-FX&#xff0c;这款设备内部集成了ModbusTCP通讯服务器&#xff0c;这意味着什么&#xff1f;ModbusTCP客户机&#xff0c;比如支持ModbusTCP的组态软件、OPC服务器、PLC以及使用高级语言开发的实现ModbusTCP客户机软…

改善压降过大的六种方法

改善压降过大的六种方法 当进行完压降仿真完之后,如果结果都是PASS的话是我们最希望看到的,但是时常会因为某些原因,导致压降不通过,下面介绍几种弥补压降的几种措施 方法一 靠近用电端 如下图,电源放的离用电端太远将电源模块尽量靠近用电端放置,尤其是小电压大电流的电…

flink1.16读取hive数据存到es 本地和服务器上遇到的问题和解决思路

话不多说 直接上官网 Overview | Apache Flink hive版本 3.1.3000 ​ hadoop 版本 3.1.1.7.1.7 ​ flink 1.16.2 ​ 代码 很简单我还是贴下 import com.fasterxml.jackson.databind.ObjectMapper import com.typesafe.config.{Config, ConfigFactory} import org.apache…

[SQL系列] 从头开始学PostgreSQL 约束连接

上一篇的增删改查和基础筛选操作 [SQL系列] 从头开始学PostgreSQL 增删改查_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131775853这篇大多是基于单张表的一些简单操作&#xff0c;但是我们经常要操作多张表一起查询&#xff0c;有些表的位置还…

HashSet 、LinkedHashSet 源码级详解

Set 集合类体系如下&#xff1a; HashSet -- 无序、不重复、无索引 LinkedHashSet -- 有序、不重复、无索引 TreeSet -- 可排序、不重复、无索引 HashSet HashSet 底层采用 哈希表 存储数据 哈希表组成 JDK8 之前 -- 数组 链表 JDK8 之后 -- 数组 链表 红黑树 一开始…

GitHub 上都有哪些值得关注学习的 javascript开源项目?

前言 下面是我整理的一些关于GitHub上的js的相关的项目&#xff0c;希望对你有所帮助 实用工具向 1.Exchart Star&#xff1a;55.6k Exchart提供了大量精美的图表&#xff0c;只有你想不到&#xff0c;没有你在它上面找不到的&#xff0c;同时点进相应的图标后便可以在线对它…