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

结果:

相关推荐
侠客行03175 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪5 小时前
深入浅出LangChain4J
java·langchain·llm
Victor3565 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor3565 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术7 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚7 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎7 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Yvonne爱编码7 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚7 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂7 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言