首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Spring教程七】Spring框架DI相关内容大揭秘:全面深入理解DI(依赖注入)自动配置以及集合注入详解

  • 24-03-05 07:20
  • 2081
  • 11377
blog.csdn.net

目录

  • 1.自动配置
    • 1.1 什么是依赖自动装配?
    • 1.2 自动装配方式有哪些?
    • 1.3 准备案例环境
    • 1.4 完成自动装配的配置
  • 2.集合注入
    • 2.1 环境准备
    • 2.2 注入数组类型数据
    • 2.3 注入List类型数据
    • 2.4 注入Set类型数据
    • 2.5 注入Map类型数据
    • 2.6 注入Properties类型数据

欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 DI的setter注入与构造器注入详解》。

在这里插入图片描述

1.自动配置

上一节我们花了大量的时间把Spring的注入去学习了下,总结起来就一个字麻烦。
问:麻烦在哪?
答:配置文件的编写配置上。
问:有更简单方式么?
答:有,自动配置
什么是自动配置以及如何实现自动配置,就是接下来要学习的内容:

1.1 什么是依赖自动装配?

  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

1.2 自动装配方式有哪些?

  • 按类型(常用)
  • 按名称
  • 按构造方法
  • 不启用自动装配

1.3 准备案例环境

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件
    这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:
    在这里插入图片描述
    (1)项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类
public interface BookDao {
	public void save();
}

public class BookDaoImpl implements BookDao {

	private String databaseName;
	private int connectionNum;
	
	public void save() {
		System.out.println("book dao save ...");
	}
}
public interface BookService {
	public void save();
}

public class BookServiceImpl implements BookService{
	private BookDao bookDao;
	
	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}

	public void save() {
		System.out.println("book service save ...");
		bookDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

(2)resources下提供spring的配置文件


<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">	
	<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
	<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
		<property name="bookDao" ref="bookDao"/>
	bean>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(3)编写AppForAutoware运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class AppForAutoware {
	public static void main( String[] args ) {
		ApplicationContext ctx = new
		ClassPathXmlApplicationContext("applicationContext.xml");
		BookService bookService = (BookService) ctx.getBean("bookService");
		bookService.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1.4 完成自动装配的配置

接下来,在上面这个环境中来完成自动装配的学习:
自动装配只需要修改applicationContext.xml配置文件即可:
(1)将标签删除
(2)在标签中添加autowire属性
首先来实现按照类型注入的配置


<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">
	<bean class="com.itheima.dao.impl.BookDaoImpl"/>
	
	<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"
	autowire="byType"/>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意事项:

  • 需要注入属性的类中对应属性的setter方法不能省略
  • 被注入的对象必须要被Spring的IOC容器管理
  • 按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException

一个类型在IOC中有多个对象,还想要注入成功,这个时候就需要按照名称注入,配置方式为:


<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">
	<bean class="com.itheima.dao.impl.BookDaoImpl"/>
	
	<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"
	autowire="byName"/>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意事项:

  • 按照名称注入中的名称指的是什么?
    在这里插入图片描述
    • bookDao是private修饰的,外部类无法直接方法
    • 外部类只能通过属性的set方法进行访问
    • 对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名
      • 为什么是去掉set首字母小写?
      • 这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名
    • 所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的
  • 如果按照名称去找对应的bean对象,找不到则注入Null
  • 当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

两种方式介绍完后,以后用的更多的是按照类型注入。
最后对于依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

2.集合注入

前面我们已经能完成引入数据类型和简单数据类型的注入,但是还有一种数据类型集合,集合中既可以装简单数据类型也可以装引用数据类型,对于集合,在Spring中该如何注入呢?
先来回顾下,常见的集合类型有哪些?

  • 数组
  • List
  • Set
  • Map
  • Properties

针对不同的集合类型,该如何实现注入呢?

2.1 环境准备

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件applicationContext.xml

这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:

在这里插入图片描述
(1)项目中添加添加BookDao、BookDaoImpl类

public interface BookDao {
	public void save();
}
public class BookDaoImpl implements BookDao {
	private int[] array;
	private List<String> list;
	private Set<String> set;
	private Map<String,String> map;
	private Properties properties;
	public void save() {
	System.out.println("book dao save ...");
	
	System.out.println("遍历数组:" + Arrays.toString(array));
	
	System.out.println("遍历List" + list);
	
	System.out.println("遍历Set" + set);
	
	System.out.println("遍历Map" + map);
	
	System.out.println("遍历Properties" + properties);
	}
	//setter....方法省略,自己使用工具生成
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

(2)resources下提供spring的配置文件,applicationContext.xml


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

	<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(3)编写AppForDICollection运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class AppForDICollection {
	public static void main( String[] args ) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
		bookDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

接下来,在上面这个环境中来完成集合注入的学习:
下面的所以配置方式,都是在bookDao的bean标签中使用进行注入


<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">
	<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
	bean>
beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.2 注入数组类型数据

<property name="array">
	<array>
		<value>100value>
		<value>200value>
		<value>300value>
	array>
property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3 注入List类型数据

<property name="array">
	<list>
		<value>itcastvalue>
		<value>itheimavalue>
		<value>boxueguvalue>
		<value>chuanzhihuivalue>
	list>
property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.4 注入Set类型数据

<property name="set">
	<set>
		<value>itcastvalue>
		<value>itheimavalue>
		<value>boxueguvalue>
		<value>boxueguvalue>
	set>
property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.5 注入Map类型数据

<property name="map">
	<map>
		<entry key="country" value="china"/>
		<entry key="province" value="henan"/>
		<entry key="city" value="kaifeng"/>
	map>
property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.6 注入Properties类型数据

<property name="properties">
	<props>
		<prop key="country">chinaprop>
		<prop key="province">henanprop>
		<prop key="city">kaifengprop>
	props>
property>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置完成后,运行下看结果:
在这里插入图片描述
说明:

  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写、、、、标签
  • List的底层也是通过数组实现的,所以和标签是可以混用
  • 集合中要添加引用类型,只需要把标签改成标签,这种方式用的比较少
源码获取~定制咨询~非开源
微信名片
注:本文转载自blog.csdn.net的老牛源码的文章"https://biyesheji365.blog.csdn.net/article/details/134755673"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top