java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring DI依赖注入

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

作者:222you

文章介绍了Spring框架中的IOC(控制反转)和DI(依赖注入)概念,并展示了如何通过配置文件进行属性的set方法注入、构造方法注入及数组、集合等复杂类型的注入,通过实例代码和流程分析,清晰展示了依赖注入在Spring中的实现原理和使用方法,感兴趣的朋友跟随小编一起看看吧

1.IOC和DI的概念

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

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

2.属性的set方法注入值

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

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及其实现类:

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

测试方法:

    /**
     * 测试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为键存入容器

<bean id="od" class="com.qcby.dao.Impl.OrderDaoImpl"/>

然后创建OrderServiceImpl

    <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类

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 + '\'' +
                '}';
    }
}

在配置文件当中配置:

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

测试方法:

    /**
     * 测试构造方法注入
     */
    @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类

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

    <!--给集合属性注入值-->
    <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>

测试代码

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

结果:

到此这篇关于Spring的DI依赖注入(配置文件方式)的文章就介绍到这了,更多相关Spring DI依赖注入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文