Spring 中 Bean 的配置细节
大家好,我是 god23bin,今天继续说 Spring 的内容,关于 Spring 中 Bean 的配置的,通过上一篇文章的学习,我们知道了 Spring 中的依赖注入,其中有两种主要的方式,分别是基于构造方法的 DI和 基于 Setter 的 DI。
我们知道,当写完一个普通的 Java 类后,想让 Spring IoC 容器在创建类的实例对象时使用构造方法完成实例对象的依赖注入,那么就需要在配置元数据中写好类的 Bean 定义,包括各种标签的属性。
如果你是第一次看我这个系列的文章,可能不知道什么是配置元数据,不知道什么是依赖注入,那么请你先去看看我之前的文章,相信对你是有帮助的~
【资料图】
现在我们来说说这其中的配置细节,废话不多说,开始啦!
Bean 定义中的基本标签propertyproperty
标签:用于注入简单属性值,可以通过 name
属性指定属性名称,通过 value
属性指定属性值,或者通过 ref
属性指定引用其他 Bean。
constructorconstructor
标签:使用构造方法参数值进行注入。通过 value
属性指定了参数的具体值,或通过 ref
属性指定了对其他 Bean 的引用。这样,在容器创建 Bean 实例时,会使用指定的参数值调用构造方法,实现构造方法注入。
listlist
标签:用于注入 List 集合类型的属性值,可以通过value
子标签指定元素的值,或者通过 ref
子标签指定引用其他 Bean。
Java Spring MySQL
setset
标签:用于注入 Set 集合类型的属性值,用法和 list
标签类似。
Value 1
mapmap
标签:用于注入 Map 集合类型的属性值,可以通过 entry
子标签指定键值对,键可以通过 key
属性指定,值可以通过 value
属性指定,或者通过 ref
子标签指定引用其他Bean。
props
标签:用于注入 Properties 类型的属性值,可以通过 prop
子标签指定键值对,键可以通过 key
属性指定,值可以通过 value
属性指定。
Value 1 Value 2
以上是 Spring XML 配置文件中 Bean 注入的常用标签和集合注入的标签。
depend-on 的使用正常情况下,举个例子:
public class A { private B b; // 省略 getter 和 setter}
B 这个 Bean 被写成是 A 的属性,也就是说,A 类依赖 B 类,这种正常的依赖关系下,我们在以 XML 为配置元数据的配置文件中,可以使用 ref
属性来指定 A 的依赖项是 B。
这种依赖关系,是很明显的,一下子就能看出 A 是依赖 B 的,所以我们可以使用 ref
属性来指定依赖项,与此同时,这个依赖项会被注入到需要它的 Bean 中,这里就是 B 的对象被注入到 A 中作为 b 属性。
那么对于依赖关系不明显,但是又有依赖关系的时候,就可以使用 depend-on
属性。
比如有一个类 C,它是间接依赖D 类的,也就是说 D 没有作为 C 的属性。此时,想要实例化 C,那么需要 D 先实例化好后,才能去实例化 C。
标签中的 depend-on
属性就能够做到这一点,让这种依赖关系不明显的,也能保证你在使用某个 Bean 时,该 Bean 的依赖项会先实例化。
这样,在使用 C 时,是能够保证 C 的依赖项 D 是已经实例化好的。
如果有多个依赖项,那么可以使用有效的分隔符进行分割(英文逗号、英文分号或者空格):
同理,销毁对象的时候,在销毁 C 对象之前,D 就会被先销毁。
lazy-init 的使用
标签中的 lazy-init
属性是用来指定某个 Bean 是否开启懒加载的。
默认情况下,Bean 定义中这个属性默认值是 false,也就是说默认的 Bean 都不是懒加载的,当 Spring IoC 容器创建后,容器就会立即去创建并完全配置所有的单例作用域的 Bean。
如果我们想让某个 Bean 不在一开始就被实例化,那么就可以使用这个懒加载属性开启某个 Bean 的懒加载。懒加载的 Bean,只有在被第一次使用时,才会被实例化。
在以 XML 为配置元数据为例,直接使用 lazy-init
属性,设置该属性为 true
就 OK。
当然,如果这个懒加载的 Bean 被其他没有懒加载的单例 Bean 给引用了,那么这个懒加载的 Bean 也会在容器创建后被容器所创建,因为容器必须确保单例 Bean 的依赖项都被实例化了。
自动注入依赖项Spring 支持 Bean 之间依赖关系的自动注入。它能根据 ApplicationContext
的内容帮我们处理 Bean 之间的依赖关系,这样我们就可以不用手动在配置元数据中指定 Bean 之间的依赖关系。
自动注入的优点网上有很多博客把「自动注入」说成「自动装配」的,在我看来,这是两回事,实际上从它们的英文名来看,就是两回事。
说到自动装配(Auto Configuration),一般都是联系到 Spring Boot 的,因为它的特点就是开箱即用,省去大量的配置,而之所以能省去大量的配置,就得益于它的自动装配。而自动注入(Autowiring Collaborator)是指自动注入协作者,换句话说,指 Bean 之间的依赖项 Spring 能帮你去注入。
可以大大减少我们在配置元数据中进行指定属性或构造方法的参数
可以随着对象的发展而更新配置,比如你需要给某个类添加一个新的依赖项,那么你不需要去修改配置元数据,自动注入就帮我们处理
以 XML 作为配置元数据的情况下,我们可以使用
标签中的 autowire
属性来指定自动注入的模式。
默认没有自动注入,这就是最开始学习的写法,Bean 的依赖项需要用 ref
属性来指定。
byName
:容器会默认根据属性名找到一个同名的 Bean 进行自动注入。
byType
:容器会默认根据属性的类型找到一个同类型的 Bean 进行自动注入,如果存在多个同类型的 Bean,那么 Spring IoC 容器就不知道注入哪一个 Bean,就会抛出异常。
constructor
:类似 byType,不过它是基于构造方法参数的自动注入。
需要注意的是,自动注入只对那些具有依赖关系的 Bean 起作用,而不是所有的 Bean。因此,在配置 Bean 的时候,需要确保被注入的属性在其他 Bean 中是存在的。
自动注入的限制和缺点在配置元数据中,使用
和
编写的明确的依赖关系会覆盖自动注入的,换句话说,它的优先级比自动注入的方式高。还有就是自动注入是不能注入简单的类型的,比如基本数据类型、String、Class 等类型(包括这些类型的数组也是不能自动注入的)。这里的限制是设计上的限制。自动注入是单靠 Spring 帮我们注入的,精确度不如我们手动去明确设置 Bean 之间的依赖关系的,某些情况下可能由于我们的疏忽会注入错误的 Bean 导致意想不到的结果。自动注入的信息对于一些用来生成文档的工具可能是没用的。自动注入的时候找到了多个匹配上的 Bean,对于数组和集合来说是正常的,没什么问题,但是如果要注入的 Bean 是单值属性的依赖关系,那么 Spring IoC 就不知道该注入哪一个 Bean,就会抛出异常。这个就在上面的 byType
中说过的。对于自动注入匹配到了多个 Bean,有以下解决方案:
不用自动注入,改为明确手动注入使用
中的 primary
属性,设置为 true
,那么在多个同类型的 Bean 定义当中,如果匹配上了,那么这个 Bean 就是主要的候选者,就会注入这个 Bean。使用基于注解的自动注入(@Autowired
、@Primary
等)这几个使用注解实现自动注入的,在后面的文章中再讲。
总结我们总结一下,关于 Spring 中 Bean 的配置与依赖注入的重要内容。
Bean 的配置元数据可通过 XML 文件进行定义和配置,当然后续我们会介绍使用注解
和 Java 配置
作为配置元数据的方式。基本标签包括 property
、constructor-arg
、list
、set
、map
和 props
,用于注入属性值或集合类型的属性。depend-on
属性用于指定 Bean 之间的依赖关系,确保指定的 Bean 先于当前 Bean 实例化,这种依赖不是显式的依赖。lazy-init
属性用于指定 Bean 是否懒加载,默认为 false
,即容器启动时立即实例化所有单例 Bean。自动注入可减少配置元数据中的显式指定依赖项,提供 autowire
属性以设置自动注入的模式。自动注入模式包括 byName
、byType
和 constructor
,通过属性名或类型进行自动匹配完成依赖注入。自动注入存在一定的限制和缺点,需注意配置的精确性和冲突解决。对于多个匹配的自动注入,可通过手动注入、primary
属性或基于注解的自动注入来解决。以上就是本篇所有的内容了,对屏幕前的你有帮助的话,麻烦点点关注,点个免费的赞,给予我支持与鼓励,感兴趣的话可以关注我这个专栏,谢谢你们!
最后的最后希望各位屏幕前的靓仔靓女们
给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!
咱们下期再见!
-
Spring 中 Bean 的配置细节
博客园 2023-07-10
-
【转会中心】姆巴佩无限接近今夏加盟皇马|奥纳纳曼联签5年达协议
直播吧 2023-07-10
-
汽车的基本组成和工作原理(汽车工作原理简介介绍)
互联网 2023-07-10
-
冒险岛扎昆头盔 粉色扎昆头盔
城市网 2023-07-09
-
云南省思茅市2023-06-26 04:14发布暴雨橙色预警
互联网 2023-07-09
-
芮怎么读 蕊怎么读
城市网 2023-07-09
-
乌克兰国防部承认此前袭击克里米亚大桥
华声在线 2023-07-09
-
“无动于衷”,是一种很高级的智慧
布衣粗食 2023-07-09
-
避暑游催热中国“夏日经济”
新华社 2023-07-09
-
哈弗汽车回应“竞品视频”事件:坚决维护权益,担忧行业乱象
懂车帝 2023-07-09
-
Spring 中 Bean 的配置细节
博客园 2023-07-10
-
【转会中心】姆巴佩无限接近今夏加盟皇马|奥纳纳曼联签5年达协议
直播吧 2023-07-10
-
汽车的基本组成和工作原理(汽车工作原理简介介绍)
互联网 2023-07-10
-
冒险岛扎昆头盔 粉色扎昆头盔
城市网 2023-07-09
-
云南省思茅市2023-06-26 04:14发布暴雨橙色预警
互联网 2023-07-09
-
芮怎么读 蕊怎么读
城市网 2023-07-09
-
乌克兰国防部承认此前袭击克里米亚大桥
华声在线 2023-07-09
-
“无动于衷”,是一种很高级的智慧
布衣粗食 2023-07-09
-
避暑游催热中国“夏日经济”
新华社 2023-07-09
-
哈弗汽车回应“竞品视频”事件:坚决维护权益,担忧行业乱象
懂车帝 2023-07-09
-
日媒:预计日本政府或于8月开始核污染水排海
央视新闻 2023-07-09
-
首列“中老铁路+中欧班列”过境货物列车顺利发运
中国日报网 2023-07-09
-
临近CBD,房子“免费送”?郑州一博主:贷款90万已还了5年...小区房价从2万跌到1.2万
互联网 2023-07-09
-
(时政)11部门联合部署开展论坛活动专项清理整治
新华网 2023-07-09
-
以高质量党建引领保障现代化新重庆建设
金台资讯 2023-07-09
-
强化行政履职能力 推动争议实质化解
法治日报-法治网 2023-07-09
-
河北四建保定分公司(河北四建)
互联网 2023-07-09
-
如何将office设置为默认打开方式win7(如何将office设置为默认打开方式)
互联网 2023-07-09
-
华硕i7笔记本电池(华硕i7笔记本怎么样)
互联网 2023-07-08
-
7月9日,闵行这些地方计划停电
凯迪网 2023-07-08
-
不予批捕怎么写申请书?
法师兄 2023-07-08
-
哲科:输欧冠决赛很遗憾;生涯最佳进球?欧冠攻破切尔西大门
懂球帝 2023-07-08
-
高质量发展看中国丨向“绿”而行 “黔景”无限好
杭州网 2023-07-08
-
师说一句一句对照翻译(师说翻译全文)
车百科 2023-07-08
-
爆料:Take-Two要出两款新作 但没有《GTA4》重制版
游侠网 2023-07-08
-
蒲县贴吧名妆老板(蒲县贴吧)
互联网 2023-07-08
-
山东省地矿局第七地质大队应邀参加2023年地学哲学学术年会
鲁网临沂频道 2023-07-08
-
2楼窗外长满葡萄,年产七八十斤,住户:起初只为遮阳
凯迪网 2023-07-08
-
河南持续高温 专家详解成因
正观新闻 2023-07-08
-
以“悦己”为理念 阿维塔必创辉煌
鲁南网 2023-07-08