一、前言
今天我们了解一下,Spring框架中的自动装配功能(自动化注入)。自动装配可以根据Bean的名字 进行自动装配,也可以根据类型进行自动装配。
本文将探讨Spring中两种自动装配方式:根据名称(byName)和根据类型(byType)。
二、内容
2.1 概述
Spring还可以完成自动化的注入,自动化注入又被称为自动装配。
2.2 byName自动装配
(1)编写 Bean
首先,创建两个JavaBean类:UserService
和UserDao
。

(2)配置 Bean
接着,在Spring的XML配置文件中,配置UserService
和UserDao
的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
进行自动装配。我们仍然使用上面的UserDao
和UserService
类。

(2)配置 Bean
下面来配置UserService
和UserDao
的Bean:

下面测试一把:

这也是没问题的。
(3)注意事项
那使用 byType
进行自动装配有什么注意事项嘛?
确实有。
首先,必须提供 set
方法。没错,无论是byName
还是byType
,在进行自动装配时都是基于set方法,因此不能省略 set
方法。
其次,如果使用 byType
进行自动装配时,配置文件中不能出现多个同类型的 bean
。
看下面这个例子:

因此,如果使用了 byType
进行自动装配,那么配置文件中不能有两个类型一样的 bean
。
三、总结
总的来说,自动装配是Spring框架中一个功能,在某些情况下能够简化配置。
通过本文,我们了解了自动装配的使用方法,即根据名称(byName
)和根据类型(byType
)进行自动装配,以及一些注意事项(知道有这么回事,了解即可)。