首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Spring】004-Spring依赖注入

【Spring】004-Spring依赖注入

作者头像
訾博ZiBo
发布于 2025-01-06 07:44:28
发布于 2025-01-06 07:44:28
18200
代码可运行
举报
运行总次数:0
代码可运行

一、构造器注入

(前面已详述,不再赘述)

二、Set方式注入【重点】

1、依赖

bean对象的创建依赖于容器

2、注入

bean对象所有的属性,由容器注入;

3、环境搭建

第一步:创建实体类Address
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.pojo;

public class Address {
    private String address;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
}
第二步:创建实体类Student
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.pojo;

import java.util.*;

public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> habits;
    private Map<String,String> card;
    private Set<String> games;
    private Properties info;
    private String wife;

    public String getName() {
        return name;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public String[] getBooks() {
        return books;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public List<String> getHabits() {
        return habits;
    }

    public void setHabits(List<String> habits) {
        this.habits = habits;
    }

    public Map<String, String> getCard() {
        return card;
    }

    public void setCard(Map<String, String> card) {
        this.card = card;
    }

    public Set<String> getGames() {
        return games;
    }

    public void setGames(Set<String> games) {
        this.games = games;
    }

    public Properties getInfo() {
        return info;
    }

    public void setInfo(Properties info) {
        this.info = info;
    }

    public String getWife() {
        return wife;
    }

    public void setWife(String wife) {
        this.wife = wife;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", address=" + address +
                ", books=" + Arrays.toString(books) +
                ", habits=" + habits +
                ", card=" + card +
                ", games=" + games +
                ", info=" + info +
                ", wife='" + wife + '\'' +
                '}';
    }
}
第三步:编写配置文件applicationContext.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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 id="student" class="com.zibo.pojo.Student">
        <property name="name" value="訾博"/>
    </bean>
</beans>
第四步:编写测试类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo;

import com.zibo.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = context.getBean("student", Student.class);
        System.out.println(student.getName());
    }
}
测试结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
訾博

4、注入其他类型的数据

第一步:修改配置文件applicationContext.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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 id="student" class="com.zibo.pojo.Student">
        <!--1、普通值注入-->
        <property name="name" value="訾博"/>
        <!-- 2、bean注入-->
        <property name="address" ref="address"/>
        <!--3、数组注入-->
        <property name="books">
            <array>
                <value>Java核心技术</value>
                <value>增长黑客</value>
                <value>Spring MVC学习指南</value>
            </array>
        </property>
        <!--4、list集合注入-->
        <property name="habits">
            <list>
                <value>写代码</value>
                <value>看电影</value>
                <value>读书</value>
            </list>
        </property>
        <!--5、map集合注入-->
        <property name="card">
            <map>
                <entry key="身份认证号" value="123456"/>
                <entry key="银行卡号" value="1357"/>
                <entry key="学号" value="2468"/>
            </map>
        </property>
        <!--6set集合注入-->
        <property name="games">
            <set>
                <value>CF</value>
                <value>DNF</value>
                <value>LOL</value>
            </set>
        </property>
        <!--7、Properties注入-->
        <property name="info">
            <props>
                <!--也是key与value,只是要注意书写的位置-->
                <prop key="stuNum">123456</prop>
                <prop key="age">22</prop>
            </props>
        </property>
        <!--8null注入-->
        <property name="wife">
            <null/>
        </property>
    </bean>
    <bean id="address" class="com.zibo.pojo.Address">
        <property name="address" value="河南省郑州市"/>
    </bean>
</beans>
第二步:修改测试类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo;

import com.zibo.pojo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student = context.getBean("student", Student.class);
        System.out.println(student.toString());
    }
}
测试结果(为便于查看,已手动换行):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Student{name='訾博', address=Address{address='河南省郑州市'}, books=[Java核心技术, 增长黑客,
 Spring MVC学习指南], habits=[写代码, 看电影, 读书], card={身份认证号=123456, 银行卡号=1357, 
学号=2468}, games=[CF, DNF, LOL], info={stuNum=123456, age=22}, wife='null'}

三、拓展方式

1、p命名空间注入

第一步:创建实体类User
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.pojo;

public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
第二步:创建新的配置文件newBeans.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--p命名空间注入,可以直接注入属性的值:property-->
    <!--p命名空间注入:用于无参构造注入-->
    <bean id="user" class="com.zibo.pojo.User" p:name="訾博" p:age="24"/>
</beans>
第三步:修改测试类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo;

import com.zibo.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("newBeans.xml");
        User user = context.getBean("user", User.class);
        System.out.println(user.toString());
    }
}
测试结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User{name='訾博', age=24}

2、c命名空间注入

第一步:修改实体类User
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.pojo;

public class User {
    private String name;
    private int age;

    public User() {

    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
第二步:修改配置文件newBeans.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--c命名空间注入:用于带参构造注入-->
    <!--c命名空间注入,可以直接注入属性的值:下标、属性都行-->
    <bean id="user" class="com.zibo.pojo.User" c:_0="訾博" c:_1="24"/>
</beans>
测试结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
User{name='訾博', age=24}
注意:

导入命名空间的相关约束;

四、Bean的作用域

1、官方文档截图

2、singleton单例模式(默认)

当配置文件被加载时创建所有bean对象,仅创建一次,以后无论调用多少次,所调用的都是同一个对象;

不再代码演示,可参考前面笔记:【Spring】002-探索Spring IOC创建对象的方式

3、prototype多例模式

第一步:创建一个实体类People
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo.pojo;

public class People {
    private String name;
    private int age;

    public People() {
        System.out.println("无参执行了!");
    }

    public People(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("带参执行了!");
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
第二步:新建配置文件peopleBean.xml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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 id="people" class="com.zibo.pojo.People" scope="prototype">
        <property name="name" value="訾博"/>
        <property name="age" value="24"/>
    </bean>
</beans>
第三步:修改测试类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        new ClassPathXmlApplicationContext("peopleBean.xml");
    }
}
测试结果:
第四步:修改测试类,获取对象并使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo;

import com.zibo.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("peopleBean.xml");
        People people = context.getBean("people", People.class);
        System.out.println(people.toString());
    }
}
测试结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
无参执行了!
People{name='訾博', age=24}
说明了什么:

说明在被使用时创建对象;

第五步:修改测试类,再获取一个对象,看是否是同一个对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.zibo;

import com.zibo.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("peopleBean.xml");
        People people = context.getBean("people", People.class);
        People people1 = context.getBean("people", People.class);
        System.out.println(people == people1);
    }
}
测试结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
无参执行了!
无参执行了!
false
结论:

多例模式,配置文件被加载的时候并不立即创建对象,而是等到对象被获取的时候进行创建,且每次获取都会进行实例化,所获取到的不是同一个对象;

4、其他

正在web中使用到,暂不做探究;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
Spring | 依赖注入详解(DI)
在上一节的IOC创建方式中进行了讲解:https://blog.csdn.net/qq_58233406/article/details/127244071
啵啵鱼
2022/11/23
4610
Spring | 依赖注入详解(DI)
【Spring】006-Spring注解开发
属性:value用于指定bean的id,当我们不写时,默认为当前类名,首字母小写;
訾博ZiBo
2025/01/06
610
【Spring】002-探索Spring IOC创建对象的方式
在Spring的入门程序HelloSpring中,我们并没有使用“new 类();”语句,Spring帮我们自动创建了,现在让我们来探索一下Spring帮我的创建对象的过程;
訾博ZiBo
2025/01/06
1260
【Spring】003-Spring配置说明
訾博ZiBo
2025/01/06
1420
【Spring】010-Spring整合Mybatis
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring;
訾博ZiBo
2025/01/06
1850
【Spring教程】配置Bean的三种方式
  1、通过静态工厂方式配置bean(静态工厂,就是将我们的对象直接放在一个静态区里面,想用的时候我们可以直接调用就行)
程序员云帆哥
2022/05/12
3560
【Spring】005-Bean的自动装配
②在java中显式配置(见【Spring】007-使用JavaConfig实现配置);
訾博ZiBo
2025/01/06
1470
【Spring】005-Bean的自动装配
Spring-03 依赖注入(DI)
几种作用域中,request、session作用域仅在基于web的应用中使用,只能用在基于web的Spring ApplicationContext环境。
张小驰出没
2021/04/15
3120
Spring-03  依赖注入(DI)
Spring系列——依赖注入的几种方式,你都了解吗?
思维导图: 一、属性注入; 比方说我刚开始输出一个对象的话,看代码: 先建立一个实体类People: package com.java.entity; public class People {
程序员的时光001
2020/07/14
1.5K0
Spring系列——依赖注入的几种方式,你都了解吗?
Spring学习2:依赖注入(DI)
Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。
zstar
2022/06/14
2190
Spring学习2:依赖注入(DI)
推荐学java——Spring第一课
这里的Spring Boot 和 Spring Cloud 相信各位都听过,后面我们也会学习,今天的主角是 Spring Framework 也就是我们平时所说的 Spring框架,后面本文都称之为Spring .
逆锋起笔
2022/01/20
3271
推荐学java——Spring第一课
注解与依赖注入
1.Product package com.how2java.pojo; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.Resource; import org.springframework.stereotype.*; @Component("p") public class Product { private int id; private String na
互联网金融打杂
2018/04/03
5340
Spring 中的依赖注入(DI),你都知道多少?
Spring 中,用来组成应用程序的主体以及由 Spring IoC 容器所管理的对象叫做 Bean。简而言之,Bean 就是由 IoC 容器来进行初始化、装配和管理的对象。
村雨遥
2020/07/29
6630
Spring 中的依赖注入(DI),你都知道多少?
Spring之DI依赖注入
​ name:对应bean中的属性名,要求该属性必须提供可访问的set方法(严格规范为此名称是set方法对应名称)
楠羽
2022/11/18
5430
Spring之DI依赖注入
spring太强了!两万多字干货 超详细讲解
本文原创首发CSDN,本文链接https://blog.csdn.net/qq_41464123/article/details/108118680 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本链接,谢谢配合。
Designer 小郑
2023/08/01
4240
spring太强了!两万多字干货 超详细讲解
springEL表达式_Spring详解
解释:这里使用了表达式#{systemProperties['user.language']}来设置值,用来检索用户语言系统的属性。
全栈程序员站长
2022/10/01
5490
springEL表达式_Spring详解
【Spring】011-Spring声明式事务
D:持久性:事务一旦提交,无论系统发生什么问题,结果都不会被影响,都被被持久化地写到了存储器中;
訾博ZiBo
2025/01/06
1180
【Spring】011-Spring声明式事务
Spring-IOC实现【01-XML配置方式】
IOC概念 IoC控制反转(IoC,Inversion of Control), 是一个概念,是一种思想。控制反转就 是对对象控制权的转移,从程序代码本身反转到了外部容器。把对象的创建、初始化、 销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。 DI依赖注入:Dependency Injection。 依赖注入DI是指程序运行过程中,若需要调用另 一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创 建后传递给程序。 依赖注入是目前最优秀的解耦方
用户4919348
2019/04/02
6150
Spring-IOC实现【01-XML配置方式】
Spring使用注解配置依赖注入
大部分情况下,使用Spring配置依赖注入时,都是使用注解来进行配置,因为注解比xml要方便和简单。不过类似于数据源对象这种配置信息容易变更的对象除外,这种对象使用xml文件来进行配置会更适合,方便于在外部进行修改,而不需要打开代码来进行修改。
端碗吹水
2020/09/23
1K0
【JAVA】Spring 框架
本博文专用于软件创新实验室 Spring 框架课堂,由于课堂时间有限,选取了 Spring 框架中比较重点的几个来介绍。 Spring 框架的诞生是为了使开发更加高效简洁,同时减少耦合程度,主要还是思想上的一个转变,想要深入了解 Spring 框架的,可以查阅 Spring 官方文档,也推荐一下狂神老师的视频教学,值得一看。  
sidiot
2023/08/31
4450
【JAVA】Spring 框架
相关推荐
Spring | 依赖注入详解(DI)
更多 >
LV.3
这个人很懒,什么都没有留下~
目录
  • 一、构造器注入
  • 二、Set方式注入【重点】
    • 1、依赖
    • 2、注入
    • 3、环境搭建
      • 第一步:创建实体类Address
      • 第二步:创建实体类Student
      • 第三步:编写配置文件applicationContext.xml
      • 第四步:编写测试类
      • 测试结果:
    • 4、注入其他类型的数据
      • 第一步:修改配置文件applicationContext.xml
      • 第二步:修改测试类
      • 测试结果(为便于查看,已手动换行):
  • 三、拓展方式
    • 1、p命名空间注入
      • 第一步:创建实体类User
      • 第二步:创建新的配置文件newBeans.xml
      • 第三步:修改测试类
      • 测试结果:
    • 2、c命名空间注入
      • 第一步:修改实体类User
      • 第二步:修改配置文件newBeans.xml
      • 测试结果:
      • 注意:
  • 四、Bean的作用域
    • 1、官方文档截图
    • 2、singleton单例模式(默认)
    • 3、prototype多例模式
      • 第一步:创建一个实体类People
      • 第二步:新建配置文件peopleBean.xml
      • 第三步:修改测试类
      • 测试结果:
      • 第四步:修改测试类,获取对象并使用
      • 测试结果:
      • 说明了什么:
      • 第五步:修改测试类,再获取一个对象,看是否是同一个对象
      • 测试结果:
      • 结论:
    • 4、其他
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档