Spring中DI介绍

本文详细介绍了Spring框架中的依赖注入(DI)概念,包括通过XML配置和注解两种方式进行依赖注入。对于XML配置,讲解了有参构造函数、set方法、自定义类型和集合类型的注入。对于注解方式,讨论了@Value、@Resource和@Autowired的用法。文章通过实例展示了如何在Spring中实现DI,帮助读者深入理解这一核心特性。

Spring中DI介绍

DI(Dependency Injection)即依赖注入,对象之间的依赖由容器在运行期决定,即容器动态的将某个依赖注入到对象之中。

一、基于XML配置注入依赖

1. 有参构造函数注入依赖

①bean类实现有参构造函数
在这里插入图片描述
②在配置文件中配置参数通过有参构造函数给对象属性赋值

有参构造是使用constructor-arg标签

 <bean id="student4" class="com.wyscoder.spring.IOC.pojo.Student" >
        <constructor-arg name="id" value="1"/>
        <constructor-arg name="name" value="吕布" />
</bean>

③测试
在这里插入图片描述

2. set方法注入依赖

①给对象的属性提供setter方法
在这里插入图片描述
②在配置文件中通过set方式赋值

通过set方式使用的是property标签

<bean id="student5" class="com.wyscoder.spring.IOC.pojo.Student">
       <property name="id" value="1"/>
       <property name="name" value="王昭君"/>
</bean>

测试
在这里插入图片描述

3. 注入自定义类型

注入的依赖也可以是自定义类型

①添加自定义类型

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

    public User() {
    }

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

    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

在这里插入图片描述
②配置文件

自定义类型也是要交给spring管理,如何获取管理对象实例呢
使用ref属性来获取值,该ref会自动识别为spring中对象的名字
使用value属性来获取值,spring会认为仅仅是一个字符串值

<!--注入自定义类型-->
<bean id="user" class="com.wyscoder.spring.IOC.pojo.User">
    <constructor-arg name="id" value="1"/>
    <constructor-arg name="name" value="ww"/>
</bean>
<bean id="student6" class="com.wyscoder.spring.IOC.pojo.Student" >
    <property name="id" value="1"/>
    <property name="name" value="王昭君"/>
    <property name="user" ref="user"/>
</bean>

③测试
在这里插入图片描述

4. 注入集合类型

①添加集合属性
在这里插入图片描述
②配置文件

<!--注入集合类型-->
<bean id="student7" class="com.wyscoder.spring.IOC.pojo.Student">
    <property name="id" value="1"/>
    <property name="name" value="赵云"/>
    <!--注入list类型-->
    <property name="course">
        <list>
            <value>C++</value>
            <value>Java</value>
            <value>Python</value>
        </list>
    </property>
    <!--注入map类型-->
    <property name="score" >
        <map>
            <entry key="C++" value="100"/>
            <entry key="Java" value="99"/>
            <entry key="Python" value="98"/>
        </map>
    </property>
</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:context="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 http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启扫描:指定到包路径或者类名;会扫描类、方法、属性上是否有注解-->
    <context:component-scan base-package="com.wyscoder.spring.IOC"/>
</beans>
注解说明
@Value注入普通类型属性
@Resource注入对象类型
@Autowired注入对象类型

1. @Value

该注解只能添加到普通类型上, @Value(“1”)注解中可以赋值完成对基础属性的依赖注入。

@Component(value = "student")
public class Student {
    @Value("1")
    private Integer id;
}

2. @Resource

该注解是注入对象类型,该注解是由Java 提供的,注意不是spring框架提供,默认按照名称进行装配

@Component(value = "student")
public class Student {
    //自定义类型
   @Resource(name = "user")
    private User user;

3. @Autowired

注入对象类型 ,是Spring框架提供的,按照类型来注入

@Component(value = "student")
public class Student {
    //自定义类型
   @Autowired
    private User user;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WYSCODER

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值