【Spring】IOC基本用法

news2025/4/6 4:34:37

🎈博客主页:🌈我的主页🌈
🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏
🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩
🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页


目录

  • 🌟 一、向Spring容器中注册Bean
    • 🌟🌟 1.1、使用MAVEN注入依赖
    • 🌟🌟 1.2、创建实体类
    • 🌟🌟 1.3、编写beans.xml文件
    • 🌟🌟 1.4、从容器获取 Bean
  • 🌟 二、Bean标签中的id和name属性
  • 🌟 三、属性注入
    • 🌟🌟 3.1、从容器获取 Bean
      • 🌟🌟🌟 3.1.1、普通属性注入
      • 🌟🌟🌟 3.1.2、 复杂属性注入
    • 🌟🌟 3.2、构造器注入
    • 🌟🌟 3.3、p 名称空间注入
  • 🌟 四、属性自动注入
  • 🌟 五、配置文件加载
  • 🌟 六、Java 代码配置


🌟 一、向Spring容器中注册Bean

🌟🌟 1.1、使用MAVEN注入依赖

选择Spring_context,其中Spring-core和Spring-beans都是包含在context中的,core是最基本的模块,beans模块基于core模块,context基于core和beans模块

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.4</version>
        </dependency>
    </dependencies>

🌟🌟 1.2、创建实体类

public class Person {
    private String name;
    private Integer age;
    private Integer gender;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
    ...省略get和set

🌟🌟 1.3、编写beans.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">
    <bean class="com.dong.Person" id="person"/>
</beans>

🌟🌟 1.4、从容器获取 Bean

public class demo1 {
    public static void main(String[] args) {
        //这个容器,就是自动去 classpath 下面查找配置文件,并根据该配置文件启动容器
        //会加载 Spring 的配置文件,并完成容器的初始化
        ClassPathXmlApplicationContext cptx = new ClassPathXmlApplicationContext("beans.xml");
        Person person01 = cptx.getBean("person", Person.class);
        Person person02 = cptx.getBean(Person.class);
        Person person03 = (Person) cptx.getBean("person");
        System.out.println(person01);
        System.out.println(person02);
        System.out.println(person03);
    }
}

要注意的是,如果遇到容器中注册有多个类型一样的bean,就不能使用根据类型来注入bean,否则会报错。如果相同类型存在多个 Bean,则会抛出异常
在这里插入图片描述

🌟 二、Bean标签中的id和name属性

bean 标签中,可以设置 id,也可以设置 name,一般来说,这两者没有区别。
如果使用 id 的话,则 id 要符合 XML 中关于 ID 的规范,就不能使用一些特殊字符
规则:

  1. 如果同时使用 id 和 name,则两者都生效
 <bean class="com.dong.Person" id="person" name="person2"/>
  1. id 和 name 不能重复。同一个容器中,Bean 的名称是不能重复的。id 和 name 也不能重名。如果重复使用 BeanName,则会抛出异常:
    在这里插入图片描述
  2. name 可以同时定义多个
<bean class="com.dong.Person"  name="person1,person2,person3"/>
<bean class="com.dong.Person"  name="person1 person2 person3"/>
<bean class="com.dong.Person"  name="person1;person2;person3"/>

这个表示给当前 Bean 同时取了三个名字,分别是 person1,person2,person3。当然,name 之间可以使用逗号分隔,也可以使用空格或者分号分隔。
如果是 id,则含义不同:

<bean class="com.dong.Person"  id="person1,person2,person3"/>

此时,就表示这个 Bean 的名称为person1,person2,person3这个整体。

如果没有设置 id 和 name 属性,默认的 beanName 就是类的全路径

    public static void main(String[] args) {
        //这个容器,就是自动去 classpath 下面查找配置文件,并根据该配置文件启动容器
        //会加载 Spring 的配置文件,并完成容器的初始化
        ClassPathXmlApplicationContext cptx = new ClassPathXmlApplicationContext("beans.xml");
        Person bean = (Person)cptx.getBean("com.dong.Person");
        System.out.println(bean);
       
    }

如果存在多个类的实例,并且多个实例都没有配置 id 和 name,默认情况下,beanName 就是 类的全路径#编号

    public static void main(String[] args) {
     	//这个容器,就是自动去 classpath 下面查找配置文件,并根据该配置文件启动容器
        //这行代码,会加载 Spring 的配置文件,并完成容器的初始化
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        Person person1 = (Person) ctx.getBean("com.dong.Person");
        Person person2 = (Person) ctx.getBean("com.dong.Person#1");
        Person person3 = (Person) ctx.getBean("com.dong.Person#2");
        System.out.println(person1);
        System.out.println(person2);
        System.out.println(person3);
       
    }

🌟 三、属性注入

🌟🌟 3.1、从容器获取 Bean

这种注入方式,首先是调用类的无参构造方法去创建一个对象出来,然后通过 set 方法为对象的各个属性赋值

🌟🌟🌟 3.1.1、普通属性注入

首先定义 User 类:

public class User {
    private String name;
    private String address;
    private Integer age;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", age=" + age +
                '}';
    }
省略set和get方法...

然后在 Spring 的配置文件中进行配置:

<?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="org.javaboy.demo.User" id="user">
        <!--通过 set 方法去注入值,本质上,这里最终会调用到对应的 set 方法-->
        <property name="name" value="javaboy"/>
        <property name="address" value="深圳"/>
        <property name="age" value="99"/>
    </bean>
</beans>

本质上,这里最终会调用到对应的 set 方法。
启动容器:

public static void main(String[] args) {
        //这个容器,就是自动去 classpath 下面查找配置文件,并根据该配置文件启动容器
        //这行代码,会加载 Spring 的配置文件,并完成容器的初始化
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
        //根据名字获取一个 Bean
        User user = ctx.getBean(User.class);
        System.out.println("user = " + user);
    }

需要注意,XML 中配置的属性名,是通过 get/set 方法推断出来的属性名(Java 内省),不是在类中定义的属性名称

🌟🌟🌟 3.1.2、 复杂属性注入

数组、Map、List、Set、Properties、对象
重新定义 User:

public class User {

    private Dog dog;

    private String[] favorites;

    private List<Cat> cats;

    private Map<String, Object> info;

    private Properties job;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                ", age=" + age +
                ", dog=" + dog +
                ", favorites=" + Arrays.toString(favorites) +
                ", cats=" + cats +
                ", info=" + info +
                ", job=" + job +
                '}';
    }

set和get省略...

在 XML 文件中注入属性值:

        <bean class="com.dong.Dog" id="dog">
                <property name="name" value="小黑"/>
                <property name="age" value="1"/>
        </bean>
        <bean class="com.dong.Cat" id="cat">
                <property name="age" value="2"/>
                <property name="name" value="小米"/>
        </bean>
        <bean class="com.dong.User" id="user">
                <!--通过 set 方法去注入值,本质上,这里最终会调用到对应的 set 方法-->
                <property name="name" value="dong"/>
                <property name="address" value="shanxi"/>
                <property name="age" value="56"/>
                <!--ref 表示引用一个外部的 Bean,一个外部对象-->
                <property name="dog" ref="dog"/>
                <property name="cats">
                        <list>
                                <bean class="com.dong.Cat" name="cat2">
                                        <property name="name" value="xiaobi"/>
                                        <property name="age" value="3"/>
                                </bean>
                                <ref bean="cat"/>
                        </list>
                </property>
                <property name="favorites">
                        <array>
                                <value>羽毛球</value>
                                <value>足球</value>
                                <value>篮球</value>
                        </array>
                </property>
                <property name="info">
                        <map>
                                <entry key="nation" value="汉族"/>
                                <entry key="deu" value="本科"/>
                        </map>
                </property>
                <property name="job">
                        <props>
                                <prop key="slaray">15000</prop>
                                <prop key="engineer">java工程师</prop>
                        </props>
                </property>
        </bean>

🌟🌟 3.2、构造器注入

首先,为 User 类提供构造器:

    public User() {
    }

    public User(String name, String address, Integer age, Dog dog, String[] favorites, List<Cat> cats, Map<String, Object> info, Properties job) {
        this.name = name;
        this.address = address;
        this.age = age;
        this.dog = dog;
        this.favorites = favorites;
        this.cats = cats;
        this.info = info;
        this.job = job;
    }

然后在 XML 中注入即可:

    <bean class="com.dong.Dog" id="dog">
        <property name="name" value="小黑"/>
        <property name="age" value="1"/>
    </bean>
    <bean class="com.dong.Cat" id="cat">
        <property name="age" value="2"/>
        <property name="name" value="小米"/>
    </bean>
    <bean class="com.dong.User" id="user">
        <!--通过下标去设置参数-->
        <!--        <constructor-arg index="0" value="lisi"/>-->
        <constructor-arg name="name" value="dong"/>
        <constructor-arg name="address" value="shanxi"/>
        <constructor-arg name="age" value="10"/>
        <constructor-arg name="dog" ref="dog"/>
        <constructor-arg name="cats">
            <list>
                <bean class="com.dong.Cat" name="cat2">
                    <property name="name" value="xiaobi"/>
                    <property name="age" value="3"/>
                </bean>
                <ref bean="cat"/>
            </list>
        </constructor-arg>
        <constructor-arg name="favorites">
            <array>
                <value>羽毛球</value>
                <value>足球</value>
                <value>篮球</value>
            </array>
        </constructor-arg>
        <constructor-arg name="info">
            <map>
                <entry key="nation" value="汉族"/>
                <entry key="deu" value="本科"/>
            </map>
        </constructor-arg>
        <constructor-arg name="job">
            <props>
                <prop key="position">Java工程师</prop>
                <prop key="salary">15000</prop>
            </props>
        </constructor-arg>
    </bean>

🌟🌟 3.3、p 名称空间注入

<bean class="com.dong.Dog" id="dog02" p:name="小黄" p:color="黄色"/>

🌟 四、属性自动注入

bean 标签中的 autowire 属性有五种

取值含义
no默认取值即此。表示不做自动注入,如果有需要注入的值,需要用户明确的手动去指定注入
byName这个会分析当前 Bean 中的属性,然后去 Spring 容器中查找到同名的属性,并调用 set 方法给该 Bean 中对应的属性赋值
byType这个会分析当前 Bean 中的属性,然后去 Spring 容器中查找到同类型的属性,并调用 set 方法给该 Bean 中对应的属性赋值。但是需要注意,如果使用这一种,则去查找的 Bean 只能存在一种有效类型
constructor这个会找到合适的构造方法,通过构造方法给对应的属性注入值
default这个表示使用父标签中的定义处理
<beans default-autowire="constructor">
    <bean class="com.dong.Cat" id="cat">
        <property name="name" value="小花"/>
        <property name="age" value="10"/>
    </bean>
    <bean class="com.dong.Cat" id="cat2">
        <property name="name" value="小菜"/>
    </bean>
    <bean class="com.dong.User" id="user" autowire="default">
        <property name="name" value="张三"/>
        <property name="age" value="99"/>
    </bean>
</beans>

🌟 五、配置文件加载

public class demo01 {
    public static void main(String[] args) {
        FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext("src/main/resources/beans.xml");
        User user = ctx.getBean(User.class);
        System.out.println("user = " + user);
    }
}
  • FileSystemXmlApplicationContext:这个是从当前项目根目录下开始去加载配置文件

  • ClassPathXmlApplicationContext:这个是去 classpath 下查找配置文件

🌟 六、Java 代码配置

public class JavaConfig {

    /**
     * 这个就表示将当前方法的返回值注册到 Spring 容器中,默认情况下,方法名就是 beanName
     * 如果想自定义 BeanName,则可以在 @Bean 注解中进行定义。
     */
    @Bean("u1")
    User user1(Dog dog) {
        User user = new User();
        user.setName("javaboy");
        user.setAge(99);
        user.setDog(dog);
        return user;
    }

    @Bean
    Dog dog() {
        Dog dog = new Dog();
        dog.setName("阿黄");
        dog.setAge(8);
        return dog;
    }

}
  • 当前类没有添加 @Configuration注解
  • 在一个 @Bean标记的方法中,调用另一个 @Bean标记的方法,对于当前这种情况,默认会直接再次执行该方法,从而导致某一个 Bean 被初始化两次
  • 可以在 Bean 方法中,添加参数,Spring 容器在初始化的时候,会自动从 Spring 容器中查找并处理这个参数

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

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

相关文章

js自带的字体图标

let body document.querySelector(body)body.width 100%for (let i 1; i < 10000; i) {let str &#i;let sm str.big()let st document.createElement(span)st.innerHTML smst.style.fontSize 30pxbody.appendChild(st)} 结果如下

Vue2+Vue3基础入门到实战项目全套教程的学习笔记

内容的视频链接点击此处可进入 这套笔记是按照视频和视频笔记总结的笔记&#xff0c;主要是方便vue的学习或温习&#xff0c;基本抛弃css样式的添加&#xff0c;专注于vue的使用。 第一天 Vue 快速上手 Vue的概念 Vue 是一个用于 构建用户界面 的 渐进式 框架 创建实例 …

在线Excel转JSON工具

在线Excel转JSON工具 上传excel将数据转换成json格式

5-3 pytorch中的损失函数

一般来说&#xff0c;监督学习的目标函数由损失函数和正则化项组成。(Objective Loss Regularization) Pytorch中的损失函数一般在训练模型时候指定。 注意Pytorch中内置的损失函数的参数和tensorflow不同&#xff0c;是y_pred在前&#xff0c;y_true在后&#xff0c;而Tenso…

系统IO和标准IO

一.系统IO 系统 I/O&#xff08;Input/Output&#xff09;是计算机操作系统提供给应用程序的一种输入和输出方式。它通过系统调用&#xff08;系统内核提供的函数&#xff09;来实现数据的读取和写入。系统 I/O 可以用于与文件、设备&#xff08;例如磁盘驱动器、网络接口、串…

哪些情况可以使用自动化测试?

通常&#xff0c;软件测试的测试方式分为人工测试和自动化测试&#xff0c;人工测试是由测试人员编写并执行测试用例&#xff0c;然后观察测试结果与预期结果是否一致的过程;自动化测试是通过测试工具来代替或辅助人工去验证系统功能是否有问题的过程。 采用自动化测试需要满足…

blender怎么设置中文界面

你们知道Blender软件是什么吗&#xff1f;你知道blender怎么设置中文界面吗&#xff1f;Blender是个GNU的3D绘图软件&#xff0c;建模、算图、动画等功能都相当的完整&#xff0c;可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键&#xff0c;操作起来相当地轻…

Nano 编辑器中,怎样保存和退出

使用git 修改提交记录时&#xff0c;使用命令&#xff1a; git commit --amend 弹出了nano编辑器&#xff0c;第一次使用的时候不知道怎么保存退出&#xff0c;现在记录下&#xff1a; 1.修改完毕后使用Ctrl x,然后会弹出 点击Y后&#xff0c;界面会退回到如下 这时候点击E…

springboot和vue:四、web入门(静态资源访问+文件上传+拦截器)

静态资源访问 使用IDEA创建Spring Boot项目&#xff0c;会默认创建出classpath:/static/目录&#xff0c;静态资源一般放在这个目录下即可。如果默认的静态资源过滤策略不能满足开发需求&#xff0c;也可以自定义静态资源过滤策略。 在application.properties中定义过滤规则和…

数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程。以下是我之前写的一个自动化测试的小Demo。这个Demo基于Selenium与Java。由于现在Selenium在自动化测试的统治地位&#xff0c;并且随着Selenium 4的即将发布&#xff0c;在未来很长的一段时间里…

【C#】XML的基础知识以及读取XML文件

最近在学读取文件 目录 介绍特点结构XML的语法规则XML 命名规则 C#操作XML新建读取第一种第二种第三种 读取属性 介绍 XML (可扩展标记语言&#xff0c;eXtensible Markup Language) 是一种标记语言&#xff0c;它被设计用来传输和存储数据。 特点 可扩展性&#xff1a;由于…

C++---异常处理

异常处理 异常处理try语句块和throw表达式异常的抛出和捕获异常的抛出和匹配原则 异常安全异常规范标准异常 异常处理 异常是指存在于运行时的反常行为&#xff0c;这些行为超出了函数正常功能的范围。当程序的某部分检测到一个他无法处理的问题时&#xff0c;需要用到异常处理…

港联证券:停牌后复牌股价怎么算?

股票停牌是指买卖所或证券公司暂停一只股票的买卖&#xff0c;并不再出现在股票商场上。停牌的原因或许是公司内部事务调整、财政审计、重大事件或公司被收购等。当一家公司的股票停牌时&#xff0c;这对持有该公司股票的投资者或许会带来一些影响。因而&#xff0c;了解停牌后…

最新医疗界AI资讯,远程评估帕金森病症状的AI工具问世

原创 | 文 BFT机器人 1、AI模型快速评估&#xff0c;自动生成评估报告 罗切斯特大学研究人员开发的一种人工智能工具可以帮助帕金森病患者在几分钟内远程评估其症状的严重程度。《npj数字医学》杂志上的一项研究介绍了这种新工具&#xff0c;它能让用户在网络摄像头前通过敲击…

如何验证高压放大器的性能好坏呢

验证高压放大器的性能好坏&#xff0c;就需要考虑一系列关键指标和测试方法。这些指标包括频率响应、增益、失真、输出功率、噪声以及稳定性等&#xff0c;使我们能够全面评估放大器的性能和质量。下面西安安泰电子将介绍如何验证高压放大器的性能&#xff0c;并针对不同指标提…

眼镜镜片 光致变色镜片

声明 本文是学习GB-T 9105-2023 眼镜镜片 光致变色镜片. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 6 标志 6.1 通用要求 镜片的表面、包装或附带文件中&#xff0c;应标明下列参数&#xff1a; a) 产品名称、商标&#xff1b; b) 制造商或供…

Python面向对象编程:深入理解类、对象、继承和多态

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 面向对象编程&#xff0…

数据结构-----队列

目录 前言 队列 定义 队列的定义和操作方法 队列节点的定义 操作方式 顺序表实现队列&#xff08;C/C代码&#xff09; 链表实现队列&#xff08;C/C代码&#xff09; Python语言实现队列 前言 排队是我们日常生活中必不可少的一件事&#xff0c;去饭堂打饭的时候排队&a…

laravel框架 - 事件与监听器

一&#xff0c;绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…

【笔试强训选择题】Day43.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…