【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)进行自动装配,以及一些注意事项(知道有这么回事,了解即可)。

相关推荐
东风破_7 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
东风破_7 小时前
danci 项目(三):从 JSON 数据到 AI Coding,真实项目里的数据清洗、Prompt 和工程规范
前端·后端·node.js
东风破_8 小时前
danci 项目(一):从需求到架构,一个单词学习系统为什么会这样设计
前端·后端·node.js
jay神9 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_9620738112 小时前
Spring全面详解(基础版)
java·后端·spring
IT_陈寒12 小时前
Vite打包时的静态资源坑,我帮你踩过了
前端·人工智能·后端
考虑考虑12 小时前
kubectl命令
运维·后端·自动化运维
第五页的你13 小时前
ElasticSearch结合本地消息表实现搜索功能
后端
谢亮_vipxieliang13 小时前
ValidX分组验证详解:不同场景使用不同验证规则
java·spring boot·后端·spring cloud·eclipse·hibernate
超兔一体云13 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql