Spring的DI依赖注入(配置文件方式)

目录

1.IOC和DI的概念

2.属性的set方法注入值

3.属性的构造方法注入值

[4.数组,集合(List,Set,Map),Properties 等的注入](#4.数组,集合(List,Set,Map),Properties 等的注入)


1.IOC和DI的概念

IOC:InverseofControl,控制反转,将对象的创建权反转给Spring。

DI:DependencyInjection,依赖注入,在Spring框架负责创建Bean对象时, 动态的将依赖对象注入到Bean组件中。

2.属性的set方法注入值

编写持久层OrderDao及其实现类:

java 复制代码
package com.qcby.dao.Impl;

import com.qcby.dao.OrderDao;

public class OrderDaoImpl implements OrderDao {
    @Override
    public void saveOrder() {
        System.out.println("持久层:保存订单........");
    }
}



package com.qcby.dao;

public interface OrderDao {

    void saveOrder();

}

业务层OrderService及其实现类:

java 复制代码
package com.qcby.service.Impl;

import com.qcby.dao.OrderDao;
import com.qcby.service.OrderService;

public class OrderServiceImpl implements OrderService {

    //提供该属性的set方法,IOC容器底层通过属性的set方法注入值
    private OrderDao orderDao;

    public void setOrderDao(OrderDao orderDao) {
        this.orderDao = orderDao;
    }

    //消息
    private String msg;
    //年龄
    private int age;

    public void setMsg(String msg) {
        this.msg = msg;
    }

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

    @Override
    public void saveOrder() {
        System.out.println("业务层:保存订单:"+msg+" - "+age);
        orderDao.saveOrder();
    }
}


package com.qcby.service;

public interface OrderService {

    void saveOrder();

}

测试方法:

java 复制代码
    /**
     * 测试DI注入
     */
    @Test
    public void testDI(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取到了OderService的Bean,这个Bean里面的信息在配置文件里面配置好了
        OrderService orderService = (OrderService) context.getBean("os");
        orderService.saveOrder();
    }

运行:

流程分析:

Spring读取配置文件后,会首先创建OrderDaoImpl,以od为键存入容器

XML 复制代码
<bean id="od" class="com.qcby.dao.Impl.OrderDaoImpl"/>

然后创建OrderServiceImpl

XML 复制代码
    <bean id="os" class="com.qcby.service.Impl.OrderServiceImpl">
        <!--找到OrderDao的setOrderDao方法,把这个bean注入到os里面-->
        <property name="orderDao" ref="od"/>
        <!--给OrderServiceImpl赋值,也是通过set方法赋值-->
        <property name="msg" value="你好"/>
        <property name="age" value="19"/>
    </bean>

通过无参构造方法创建OrderServiceImpl实例,再通过setOrderDao、setMsg和setAge方法来获取值,也就是依赖注入

测试代码首先读取配置文件(第一行代码),获取到了orderServiceImpl这个Bean(第二行代码),最后调用对象的saveOrder方法。

3.属性的构造方法注入值

新建Car类

java 复制代码
package com.qcby.eneity;

public class Car {

    //名称
    private String name;
    //金额
    private String money;

    public Car() {
    }

    public Car(String name, String money) {
        this.name = name;
        this.money = money;
    }

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

在配置文件当中配置:

XML 复制代码
    <!--构造方法注入值-->
    <bean id="car" class="com.qcby.eneity.Car">
        <constructor-arg name="name" value="福特"/>
        <constructor-arg name="money" value="1000000"/>
    </bean>

测试方法:

java 复制代码
    /**
     * 测试构造方法注入
     */
    @Test
    public void testConstructor(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Car car = (Car) context.getBean("car");
        System.out.println(car);
    }

运行:

constructor-arg是构造器参数,用于构造方法注入,name是参数名字,value是参数的值

4.数组,集合(List,Set,Map),Properties 等的注入

新建CollectionBean类

java 复制代码
package com.qcby.eneity;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class CollectionBean {
    //数组
    private String[]strs;
    public void setStrs(String[]strs){
        this.strs=strs;
    }

    private List<String> list;
    public void setList(List<String>list){
        this.list=list;
    }

    private Map<String,String> map;
    public void setMap(Map<String,String>map){
        this.map=map;
    }

    private Properties properties;
    public void setProperties(Properties properties){
        this.properties=properties;
    }

    @Override
    public String toString(){
        return"CollectionBean{"+
                "strs="+ Arrays.toString(strs)+
                ",list="+list+
                ",map="+map+
                ",properties="+properties+
                '}';
    }
}

配置Bean

XML 复制代码
    <!--给集合属性注入值-->
    <bean id="collectionBean" class="com.qcby.eneity.CollectionBean">
        <property name="strs">
            <array>
                <value>美美</value>
                <value>凤凤</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>熊大</value>
                <value>熊二</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="aaa" value="老王"/>
                <entry key="bbb" value="小王"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>

测试代码

java 复制代码
    /**
     * 引用类型的注入
     */
    @Test
    public void testReferenceType(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        CollectionBean collectionBean = (CollectionBean) context.getBean("collectionBean");
        System.out.println(collectionBean);
    }

结果:

相关推荐
海边的Kurisu3 小时前
苍穹外卖日记 | Day1 苍穹外卖概述、开发环境搭建、接口文档
java
uzong5 小时前
后端线上发布计划模板
后端
C雨后彩虹6 小时前
任务最优调度
java·数据结构·算法·华为·面试
uzong6 小时前
软件工程师应该关注的几种 UML 图
后端
heartbeat..6 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
Jing_jing_X6 小时前
AI分析不同阶层思维 二:Spring 的事务在什么情况下会失效?
java·spring·架构·提升·薪资
上进小菜猪7 小时前
基于 YOLOv8 的 100 类中药材智能识别实战 [目标检测完整源码]
后端
元Y亨H8 小时前
Nacos - 服务发现
java·微服务
微露清风8 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi02278 小时前
Java趣闻
java