Spring入门之DI(包含实例代码)

什么是DI注入?

DI(Dependency Injection):依赖注入,在spring框架负责创建bean对象时,动态的将依赖对象注入到bean对象中。
简单地说,依赖注入就是给变量赋值,但是为了避免将代码写死,需要在配置文件中进行变量赋值。

DI注入的方式

  1. 通过属性的set方法注入值
<!--  这里反射默认调用的是无参构造方法,如果不存在无参构造方法就会报错  -->
<bean id = "us" class="实体类的路径(包含到类名)">
    <!--  如果成员变量是简单类型(基本类型+String)用value赋值;如果是自定义引用类型用ref赋值  -->
    <property name="name" value="张三"/>
    <property name="userDao" ref="ud"/>
</bean>

<bean id = "ud" class="UserDao的路径(包含到类名)"/>
  1. 通过属性的构造方法注入值
<bean id = "us" class="实体类的路径(包含到类名)">
	<constructor-arg name="name" value="李四"></constructor-arg>
    <constructor-arg name="userDao" ref="ud"/>
</bean>

<bean id = "ud" class="UserDao的路径(包含到类名)"/>

代码示例

  • 示例项目在IOC项目的基础上进行了完善,完成了一次从Service层到Dao层的模拟。
  • Test测试类中,run()方法通过IOC生成了一个USerService实现类,然后通过USerService操纵USerDao

1. 创建一个UserDao类

package com.qcby.dao;

public interface UserDao {
    public void hello();
}
package com.qcby.dao.impl;

import com.qcby.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public void hello() {
        System.out.println("持久层:你好!");
    }
}

2. 创建UserService类

package com.qcby.service;

public interface UserService {
    public void hello();
}
package com.qcby.service.impl;

import com.qcby.dao.UserDao;
import com.qcby.service.UserService;

public class UserServiceImpl implements UserService {

    private UserDao userDao;
    private String name;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

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

    public UserServiceImpl() {
    }

    public UserServiceImpl(UserDao userDao, String name) {
        this.userDao = userDao;
        this.name = name;
    }

    public void hello() {
        System.out.println("业务层:你好!");
        userDao.hello(); //通过业务层去调用持久层的方法
    }

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

3. 编写配置文件

  • 如果存在多个配置文件,可以在主配置文件中使用<import>标签导入其他的配置文件,例如:<import resource="applicationContext2.xml"></import>;也可以创建IOC工厂时直接加载多个配置文件,例如:ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml","applicationContext2.xml");
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="applicationContext2.xml"></import>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       
    <!--  DI 构造方法注入值的方式  -->
    <bean id = "us" class="com.qcby.service.impl.UserServiceImpl">
        <constructor-arg name="name" value="李四"></constructor-arg>
        <constructor-arg name="userDao" ref="ud"/>
    </bean>

    <bean id = "ud" class="com.qcby.dao.impl.UserDaoImpl"/>

</beans>

4. 编写测试类

import com.qcby.service.UserService;
import com.qcby.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest {

    @Test
    public void run() {
        //创建spring ioc工厂,加载spring配置文件
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext1.xml");
        //获取bean对象 (底层通过反射来获取到对象)
        UserService userService = (UserService)ac.getBean("us");
        //调用方法
        userService.hello();
        System.out.println(userService);
    }
}

5. 测试结果

在这里插入图片描述

DI注入方式汇总

实体类

package com.qcby.service;

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

public class CollectionBean {
    private String[] strings;
    private List<String> list;
    private Map<String, String> map;
    private Properties properties;//属性文件类
    private UserService[] userServices;

    public void setStrings(String[] strings) {
        this.strings = strings;
    }

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

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

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

    public void setUserServices(UserService[] userServices) {
        this.userServices = userServices;
    }

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

配置文件

  • 如果用构造方法注入值,只需要将<property>标签改为<constructor-arg>标签即可。
<bean id="co" class="com.qcby.service.CollectionBean">
    <!--  对不可变字符串数组进行赋值(set方法注入)  -->
    <property name="strings">
        <array>
            <value>张三</value>
            <value>李四</value>
            <value>王五</value>
        </array>
    </property>

    <!--  对可变字符串数组进行赋值(set方法注入)  -->
    <property name="list">
        <list>
            <value>熊大</value>
            <value>熊二</value>
            <value>光头强</value>
        </list>
    </property>

    <!--  对map数组进行赋值(set方法注入)  -->
    <property name="map">
        <map>
            <entry key="name" value="张三"></entry>
            <entry key="age" value="18"></entry>
            <entry key="sex" value=""></entry>
        </map>
    </property>

    <!--  对属性文件类数组进行赋值(set方法注入)  -->
    <property name="properties">
        <props>
            <prop key="username">root</prop>
            <prop key="password">123456</prop>
        </props>
    </property>

    <!--  对UserService类数组进行赋值(set方法注入)  -->
    <property name="userServices">
        <array>
            <bean class="com.qcby.service.impl.UserServiceImpl">
                <!--  给userServices类注入值(set方法注入)  -->
                <property name="name" value="zhangsan"></property>
                <property name="userDao" ref="ud"></property>
            </bean>

            <ref bean="us"></ref>
        </array>
    </property>
</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值