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


    目录
    一、前言
    二、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 + '\'' +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    
    
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    // 测试类
     @Test
        public void getMonster(){
            ApplicationContext ioc =
                    new ClassPathXmlApplicationContext("testbean.xml");
            Monster monster01 = (Monster)ioc.getBean("monster01");
            System.out.println(monster01);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    四、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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @Test
     public void getBeanByType(){
         ApplicationContext ioc =
                 new ClassPathXmlApplicationContext("beans.xml");
         Monster bean = ioc.getBean(Monster.class);
         System.out.println(bean);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通过类型来获取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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @Test
    public void getBeanById(){
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Object bean = ioc.getBean("monster01");
        System.out.println(bean);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    这种获取方式,我们可以看到和按类型来获取有点区别:这里的获取到的类型是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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @Test
    public void getBeanByIdAndClass(){
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans.xml");
        Monster monster = ioc.getBean("monster01", Monster.class);
    	System.out.println(monster);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这种方式可以说是前两种获取方式的一个结合。即:在通过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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    这里有一个问题:为什么它的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的内容。如果文章中有描述不准确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏
    最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
    感谢感谢~~~🙏🙏🙏

  • 相关阅读:
    解放双手推荐一款阿里开源的低代码工具,YYDS
    前端面试基础题:请写出至少20个HTML5标签
    linux下编译安装和使用cURL库(含有openssl)
    数学建模之圈养湖羊的空间利用率
    C语言程序设计 三四节课堂笔记
    深度优先搜索详解
    C学生数据库_读取文件中学生信息1。
    【KBQA综述-0】Complex Knowledge Base Question Answering: A Survey
    【20221105】【每日一题】删除二叉搜索树中的节点
    深入理解Linux内核进程的管理与调度(全知乎最详细)
  • 原文地址:https://blog.csdn.net/qq_35947021/article/details/127929507