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

2024-09-01 16:44
文章标签 java 代码 入门 spring 实例 di

本文主要是介绍Spring入门之DI(包含实例代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 什么是DI注入?
  • DI注入的方式
  • 代码示例
    • 1. 创建一个UserDao类
    • 2. 创建UserService类
    • 3. 编写配置文件
    • 4. 编写测试类
    • 5. 测试结果
  • 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(); //通过业务层去调用持久层的方法}@Overridepublic 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 {@Testpublic 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;}@Overridepublic 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>

这篇关于Spring入门之DI(包含实例代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127491

相关文章

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首