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);
    }

结果:

相关推荐
喵手2 小时前
线程同步:确保多线程环境中的数据一致性!
java·线程同步
后端小张2 小时前
【JAVA进阶】Docker 2025完全指南:从容器入门到企业级实践
java·运维·开发语言·spring·docker·容器·springboot
Hui Baby2 小时前
K8S蓝绿发布
java·容器·kubernetes
ChineHe2 小时前
Golang并发编程篇_context包详解
开发语言·后端·golang
盛世宏博北京2 小时前
弹药库房 “感知 - 传输 - 平台 - 应用” 四层架构温湿度监控方案
java·大数据·人工智能·弹药库房温湿度监控
深兰科技2 小时前
坦桑尼亚与新加坡代表团到访深兰科技,促进AI在多领域的应用落地
java·人工智能·typescript·scala·perl·ai大模型·深兰科技
a努力。2 小时前
阿里Java面试被问:如何分析Full GC的原因?jmap -histo和jmap -dump区别?
java·开发语言·后端·面试·架构
我笔记3 小时前
.net4和core的差异与iis部署差异
java
白宇横流学长4 小时前
基于SpringBoot实现的垃圾分类管理系统
java·spring boot·后端