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

相关文章

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA