【Spring】自动装配之根据名称(byName)和根据类型(byType)

一、前言

今天我们了解一下,Spring框架中的自动装配功能(自动化注入)。自动装配可以根据Bean的名字 进行自动装配,也可以根据类型进行自动装配。

本文将探讨Spring中两种自动装配方式:根据名称(byName)和根据类型(byType)。

二、内容

2.1 概述

Spring还可以完成自动化的注入,自动化注入又被称为自动装配。

2.2 byName自动装配

(1)编写 Bean

首先,创建两个JavaBean类:UserServiceUserDao

(2)配置 Bean

接着,在Spring的XML配置文件中,配置UserServiceUserDao的Bean。

在之前,我们是使用这样进行配置的:

现在,我们可以在配置UserService时指定使用byName进行自动装配,如下所示:

这个 autowire 配置起到了关键作用:

  • 可以看到,我们在UserService Bean中需要添加autowire="byName",表示通过名称进行装配。

我们来看一些测试代码:

输出 "正在更新用户数据..." ,说明byName自动装配成功。

(3)注意事项

通过名称进行自动装配 的注意事项在于,需要注入的bean的id不能随便写。

也就是说,这里的 UserDao Bean 的 id 不能随便写:

xml 复制代码
<bean id="userDao" class="com.example.dao.UserDao"/>

由于UserService中类有一个UserDao属性,对应的set方法是setUserDao(),那么此时 UserDao Bean 的 id 就必须是 userDao。也就是setUserDao()的方法名去掉 set 后,将其余单词的首字母取小写后是 userDao

并不是因为 UserService类有一个UserDao属性名为 userDao,所以将 UserDao Bean 的 id 设为 userDao

举个例子,比如我们将UserService类中的UserDao属性名改为 uuu

运行测试程序后可以发现,报错了:

因此,我们必须修改UserService类中 set 方法,将方法名改为 serUuu() 即可。

我们再来看效果:

再来看下面这个例子:

现在,我们就能理解根据名称进行装配(byName) ,其底层其实就是反射机制调用 set 方法进行注入。

2.3 byType自动装配

(1)编写 Bean

现在再来看一下使用 byType 进行自动装配。我们仍然使用上面的UserDaoUserService类。

(2)配置 Bean

下面来配置UserServiceUserDao的Bean:

下面测试一把:

这也是没问题的。

(3)注意事项

那使用 byType 进行自动装配有什么注意事项嘛?

确实有。

首先,必须提供 set 方法。没错,无论是byName还是byType,在进行自动装配时都是基于set方法,因此不能省略 set 方法。

其次,如果使用 byType 进行自动装配时,配置文件中不能出现多个同类型的 bean

看下面这个例子:

因此,如果使用了 byType 进行自动装配,那么配置文件中不能有两个类型一样的 bean

三、总结

总的来说,自动装配是Spring框架中一个功能,在某些情况下能够简化配置。

通过本文,我们了解了自动装配的使用方法,即根据名称(byName)和根据类型(byType)进行自动装配,以及一些注意事项(知道有这么回事,了解即可)。

相关推荐
Zane199420 分钟前
@property 到底是怎么把方法伪装成属性的?一文吃透 property、staticmethod、classmethod
后端·python
XWalnut1 小时前
SpringBoot快速入门
java·spring boot·后端
用户8181870627462 小时前
第21章 JDBC 异常全集与连接池诊断
后端
Java内核笔记2 小时前
告别第三方库!Spring Boot 4 原生 API 版本控制全解析:4 种策略 + 实战案例
java·后端
神奇小汤圆2 小时前
把Spring Boot 4的Native Image玩明白了,启动3秒变50毫秒的踩坑全记录
后端
东方小月2 小时前
从零开发一个 Coding Agent(五):使用 TypeBox 校验工具参数
前端·人工智能·后端
Scene2162 小时前
Agent Harness、Loop 与 Graph:构建生产级 AI Agent 的三大架构支柱
后端
SomeB1oody2 小时前
【RustyML入门】2.0. 经典机器学习
开发语言·后端·机器学习·rust·教程
就改了2 小时前
SpringBoot 自定义线程池 + 实时监控指标
java·spring boot·后端
暗黑小白3 小时前
脱敏引擎工程化
后端·ai agent