【Spring(一)】如何获取对象(Bean)

news2025/7/14 15:30:20

目录
一、前言
二、Spring的下载
三、快速入门
四、IOC(控制反转)
五、创建XML配置文件
六、获取Bean
  1. 按类型来获取Bean
  2. 按id来获取Bean
  3. 按id+class来获取Bean
  4. 默认的一种特殊方式获取Bean
  5. 有关id的一些说明


相关文章

Servlet的入门Servlet的入门
JDBC(超详细)JDBC(超详细)

一、前言

我们为什么需要Spring❓
 在学Java的时候,都说过“高内聚、低耦合”:我们需要通过各种手段来降低类与类之间的耦合,以保证我们在修改一个模块的时候将被修改的类对其他类的影响降低到最小。因为如果没有我们不降低耦合度,这种牵一发而动全身的做法,势必会影响的我们后边程序的维护等一系列的成本和效率。而Spring的正好可以满足我们的这种需求(当然它的作用不止我这里说的这个)。

我们学习Spring是学他的什么❓
 Spring正因为它的出现也使得Java也一直处于主流语言的行列。我们这里说的Spring主要是说的SpringFramework。它是整个Spring生态体系的基石。因为大家都习惯于将SpringFrameWork说成Spring,所以这里文章中也采用这个说法,但我们新手需要清楚这个知识点!!!

Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework、Spring Boot、Spring Cloud等(还包括Spring Cloud data flow、spring data、spring integration、spring batch、spring security、spring hateoas)

 我们需要学习的是他的两个很重要的两个核心:IOC(控制反转)AOP(切面编程)

二、Spring的下载

 俗话说:工欲善其事必先利其器。而我们想要使用这个很厉害的框架,就势必得引入它的一些依赖。

​📥Spring下载地址

我们这里可以通过提供的这个地址直接下载。当然也可以通过官网下载。但spring因为是外网,所以访问很慢。官网地址

三、快速入门

 在正式开始学习之前我们演示一下Spring的基本使用。

导入相关的依赖,idea配置spring环境。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们在项目根目录下创建一个lib目录,用来存放我们使用Spring需要的依赖包。创建好之后导入Spring需要的jar包。
在这里插入图片描述
除了这四个之外,这里还得需要一个jar包:commons-logging jar。将这五个jar包复制到IDEA的lib目录下,还得将其添加到当前项目中。
在这里插入图片描述
我们这里使用Spring来创建一个Monster类,并且将其信息做一个输出。

// Monster类
package com.jl.spring.bean;

/**
 * @author long
 * @date 2022/8/30
 */
public class Monster {
    private Integer monsterId;
    private String name;
    private String skill;
    public Monster(){}
    public Monster(Integer monsterId, String name, String skill) {
        this.monsterId = monsterId;
        this.name = name;
        this.skill = skill;
    }

    public Integer getMonsterId() {
        return monsterId;
    }

    public void setMonsterId(Integer monsterId) {
        this.monsterId = monsterId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "monsterId=" + monsterId +
                ", name='" + name + '\'' +
                ", skill='" + skill + '\'' +
                '}';
    }
}

<!--配置文件-->
<?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 class="com.jl.spring.bean.Monster" id="monster01">
        <property name="monsterId" value="100"/>
        <property name="name" value="牛魔王"/>
        <property name="skill" value="芭蕉扇"/>
    </bean>
</beans>
// 测试类
 @Test
    public void getMonster(){
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("testbean.xml");
        Monster monster01 = (Monster)ioc.getBean("monster01");
        System.out.println(monster01);
    }

在这里插入图片描述
 通过上面的简单演示,我们已经得到了我们想要的结果。可能看起来比传统的方式麻烦,但我们这里只是使用了一个简单的例子,当我们在真正的项目中使用的时候,才会体会到它真正的强大。

四、IOC(控制反转)

 IOC(Inversion Of Control)译为:控制反转。我们知道了它的名称,但它为什么叫这个控制反转呢❓

 我们使用传统方式创建一个对象的时候,通常是需要自己手动new一个对象的。这种方式创建对象,对象的控制权在我们程序员的手里。而使用Spring创建对象是不需要我们程序员手动创建对象的,它是由Spring容器创建的。
以上说的这些,就是它为什么叫控制反转的原因:对象的创建由传统的程序员手动创建,变成了由Spring容器创建。

在这里插入图片描述
Spring有两种配置方式:XML文件配置,注解配置。我们文章中着重讲解XML文件配置的方式。
从下边就开始我们的Spring使用讲解。

五、创建XML配置文件

在我们的src文件夹下创建XML配置文件

在这里插入图片描述
创建的XML配置文件,可能有下图的这个提示。我们只需要按照下面截图演示即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、获取Bean

 获取Bean的方式有三种:按类型来获取Bean、按id来获取Bean、通过id+Class 来获取Bean、使用默认方式来获取Bean。

在开始之前,我们说一下,为什么我们这个东西要叫做Bean❓
 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。我们的语言采用java这个名字,想象一下咖啡的制作原料是咖啡豆,而java编程语言的最小组成是对象,所以我们在Spring中采用Bean这个名称。和制作咖啡一样,有异曲同工之妙!

我们在下边的演示中,可能不会贴出完整的XML代码(文件声明这些)

1. 按类型来获取Bean

<bean class="com.jl.spring.bean.Monster" id="monster01">
    <property name="monsterId" value="100"/>
    <property name="name" value="牛魔王"/>
    <property name="skill" value="芭蕉扇"/>
</bean>
@Test
 public void getBeanByType(){
     ApplicationContext ioc =
             new ClassPathXmlApplicationContext("beans.xml");
     Monster bean = ioc.getBean(Monster.class);
     System.out.println(bean);
 }

通过类型来获取bean,这种方式只适合获取单例的对象,如果有多个,则会报 NoUniqueBeanDefinitionException。试想一下,如果你有多个相同类型Bean对象的时候,只通过类型获取就会有多个匹配,我们的程序不知道你到底需要获取那个对象,最终就会报错。
在这里插入图片描述

2. 按id来获取Bean

<bean class="com.jl.spring.bean.Monster" id="monster01">
    <property name="monsterId" value="100"/>
    <property name="name" value="牛魔王"/>
    <property name="skill" value="芭蕉扇"/>
</bean>
@Test
public void getBeanById(){
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("beans.xml");
    Object bean = ioc.getBean("monster01");
    System.out.println(bean);
}

在这里插入图片描述
这种获取方式,我们可以看到和按类型来获取有点区别:这里的获取到的类型是Object类型,这种获取方式不会对对象有单例的那种限制。因为我们是通过id来获取的Bean。那么又有一个问题:id是啥呢❓

在这里插入图片描述
id是通过我们在XML文件中,配置Bean的时候通过id这个属性来指定的。

3. 按id+class来获取Bean

<bean class="com.jl.spring.bean.Monster" id="monster01">
    <property name="monsterId" value="100"/>
    <property name="name" value="牛魔王"/>
    <property name="skill" value="芭蕉扇"/>
</bean>
@Test
public void getBeanByIdAndClass(){
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("beans.xml");
    Monster monster = ioc.getBean("monster01", Monster.class);
	System.out.println(monster);
}

这种方式可以说是前两种获取方式的一个结合。即:在通过id来获取Bean的时候指定了它的类型。

4. 默认一种特殊方式获取Bean

这种方式是用于获取没有设置id,但又想通过id来获取Bean的这种情况的。

<bean class="com.jl.spring.bean.Monster">
    <property name="monsterId" value="100"/>
    <property name="name" value="牛魔王"/>
    <property name="skill" value="芭蕉扇"/>
</bean>
@Test
public void getBean(){
    ApplicationContext ioc =
            new ClassPathXmlApplicationContext("beans.xml");
    Monster monster = ioc.getBean("com.jl.spring.bean.Monster#0", Monster.class);
	System.out.println(monster);
}

在这里插入图片描述
这里有一个问题:为什么它的id名是"com.jl.spring.bean.Monster#0"
 这是Spring默认的一种id值,就是当你没有指定Bean的id值的时候,他会默认给你的Bean一个id值,而值的就是:全类名字#编号。我们这里可以通过IDEA的debug看一下它的底层:
在这里插入图片描述

5. 有关id的一些补充说明

我们在上边介绍获取Bean方式的时候,代码中有ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");我们这个ioc,可以简单理解为是一个Spring容器,他里边存储了我们创建好的Bean,还有其他的一些信息。其中Bean的存储方式和id的对应关系,就存储在一个ConcurrentHashMap中,id是key,value就是创建好的Bean对象。

在这里插入图片描述
这只是一个简单的示意图,便于大家理解,Spring容器实际上很复杂。


 下节我们继续讲解有关Spring的内容。如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

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

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

相关文章

cpu设计和实现(流水线上的第一条指令)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 读书的时候&#xff0c;《计算机组成原理》也看了&#xff0c;《计算机体系结构》也学了&#xff0c;老师也给我们讲了各种各样的流水线知识&#…

Spring框架笔记

Spring51. 什么是Spring框架1.1 spring的特点2. IOC2.1 什么是IOC2.2. 基于xml的IOC2.2.1 创建对象2.2.2 给创建的对象赋值2.2.2.1 使用setter方法注入2.2.2.2 使用构造方法注入2.3 基于注解IOC2.3.1 创建对象的注解2.3.2 依赖注入的注解2.3.3 添加包扫描2.3.3.1 添加包扫描多种…

小目标检测:基于切图检测的yolov5小目标训练

目前在目标检测方面有着众多的检测框架&#xff0c;比如两阶段的FasterRcnn、以及yolo系列的众多模型。yolo系列在实际中用的最多&#xff0c;一方面性能确实不错&#xff0c;另一方面具有着较多的改进型系列。今天我们主要使用的yolov5系列。具体原理过程就不多说了&#xff0…

数字化助力生产制造管理:家具行业管理系统

中国家具产业经过近 40 年的发展&#xff0c;占到世界家具生产 1 /4 强&#xff0c;是全球生产和出口第一大国&#xff0c;在世界上有着广泛的影响和关注。中国家具产业也是国民经济的重要支柱产业&#xff0c;2018 年总产值达到16 000 亿元&#xff0c;占中国 GDP 2%多。 然而…

数据库高级 IV

数据库高级 IV 二分查找算法 定义 二分查找也称折半查找&#xff08;Binary Search&#xff09;&#xff0c;它是一种效率较高的查找方法。但是&#xff0c;折半查找要求线性表必须采用顺序存储结构&#xff0c;而且表中元素按关键字有序排列前提要求:1. 线性表必须采用顺序存…

[附源码]计算机毕业设计JAVA火车票预订系统2022

[附源码]计算机毕业设计JAVA火车票预订系统2022 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybat…

[附源码]SSM计算机毕业设计智能超市导购系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

STM32所有系列keil 开发包的下载链接 - Keil.STM32Fxxx_DFP.x.x.x.pack

文章目录1、官网下载链接及操作步骤2、关于Keil官网下载芯片包的网速很慢的解决办法1、官网下载链接及操作步骤 安装Keil之后&#xff0c;需要安装芯片包&#xff0c;但是在软件上面点击下载安装&#xff0c;会非常慢。还不如自己到官网下载的快。 官网下载地址&#xff1a;…

longjmp导致局部变量丢失

0 总结 longjmp与setjmp语句之间的变量赋值会丢失。变量须满足&#xff1a; 在调用setjmp函数中的局部变量&#xff08;栈变量&#xff09; &#xff0c;全局变量不受影响非volatile 解决方法&#xff1a;加volatile 1 问题复现 #include <setjmp.h> #include <s…

H5的基础

网页的学名称作HTML文件&#xff0c;是一种可以在www网上传输&#xff0c;并被浏览器认识和翻译成页面显示出来的文件。 HTML是&#xff1a;Hypertext Marked Language即超文本标记语言&#xff0c;是一种用来制作超文本文档的简单标记语言 超文本就是指页面内可以包含图片&…

六十分之九十——沉迷期的突破

目录一、目标二、计划三、完成情况四、提升改进(最少3点)五、意外之喜(最少2点)六、总结一、目标 明确可落地&#xff0c;对于自身执行完成需要一定的努力才可以完成的 1.8本技术管理书籍阅读(使用番茄、快速阅读、最后输出思维导图)2.得到"逻辑思维"、吴军硅谷来信…

WebRTC GCC 拥塞控制算法(REMB-GCC)

目录 一. 前言 二. REMB-GCC算法原理 1. 接收端基于延时梯度的带宽预估 &#xff08;1&#xff09;Arrival-time filter &#xff08;2&#xff09;Overuse Detector &#xff08;3&#xff09;Adaptive threshold &#xff08;4&#xff09;Remote Rate Controller &a…

【SQL】之索引

【SQL】之索引简单的索引设计方式innodb中的索引设计方式迭代一次迭代两次迭代三次btree聚簇索引二级索引&#xff08;非聚簇&#xff09;联合索引&#xff08;非聚簇&#xff09;InnoDB的B树索引的注意事项myISAM中索引设计方案索引是帮助mysql高效获取数据的数据结构简单的索…

查询

一、顺序查询 普通查找方式&#xff1a; int SeqSearch(int a[],int n,int k) {int i 0;while (i < n && a[i] ! k)i;if (i > n)return 0;elsereturn i 1; } 优化版查找方式&#xff1a; int OPSeqSearch(int a[], int n, int k) {int i 0;a[n] k;while …

全志A33使用主线U-Boot方法

最近在研究A33主线相关的资源&#xff0c;目前主线uboot和内核都对A33有极好的支持了&#xff0c;所以现在把我在使用过程中遇到的问题和使用方法做个记录&#xff0c;首先是下载主线uboot源码&#xff0c;网址为https://ftp.denx.de/pub/u-boot/&#xff0c;我下载的版本为202…

点云 ICP学习-IterativeClosestPoint

目录 一、pcl中 点云配准算法 二、关于svd原理求解部分 三、pcl IterativeClosestPoint 完成demo 一、pcl中 点云配准算法 PCL 库中 ICP 的接口及其变种&#xff1a; 点到点&#xff1a;pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar >点到面&…

RocketMQ——Mac电脑OS系统docker安装Dashboard

文章目录引言安装下载dashboard镜像docker pull镜像查看镜像运行容器启动容器查看容器日志问题解决方案解决方案说明登录dashboard界面关注微信公众号&#xff1a;CodingTechWork&#xff0c;一起学习进步。引言 前面的文章已经介绍过如何在OS系统上安装并启动使用RocketMQ&…

Canal 安装与入门

MySQL Binlog 简介 https://blog.csdn.net/weixin_44371237/article/details/127904514 MySQL 主从复制过程 1&#xff09;Master 主库将改变记录&#xff0c;写到二进制日志(Binary Log)中&#xff1b; 2&#xff09;Slave 从库向 MySQL Master 发送 dump 协议&#xff0c…

基于QT的考试管理系统设计与实现

目录 一、项目概要 4 1.1项目名称 4 1.2项目目标 4 1.3软件概要 4 1.4功能描述 5 1.5开发环境 5 1.6关键技术 6 1.7开发体制 6 1.8开发阶段 6 二、软件详细需求 7 2.1学生登陆主界面 7 2.2管理员登陆主界面 8 2.3 学生考试系统实现 9 2.4学生练习系统实现 10 2.5试题管理系统实…

mongoDB mapreduce使用总结

大家都知道&#xff0c;mongodb是一个非关系型数据库&#xff0c;也就是说&#xff0c;mongodb数据库中的每张表是独立存在的&#xff0c;表与表之间没有任何依赖关系。在mongodb中&#xff0c;除了各种CRUD语句之外&#xff0c;还给我们提供了聚合和mapreduce统计的功能&#…