丰富Bean的配置

关于Bean是如何配置的,大家并不陌生。毕竟前文曾有涉及,虽然比较粗浅。却也介绍了如何写份XML配置文件,告诉Spring容器怎样创建Bean,怎样注入依赖,等等。其中要点如下:
1.

2.

因此,假如com.dream包现有这样一些类:

则可这样配置Bean:

这段配置能够告诉Spring容器创建music,player这两个Bean之后,通过属性注入Bean所需的依赖。也就是通过

新的配置引入p-命名空间xmlns:p=”http://www.springframework.org/schema/p”之后,做了两处改动:
1.使用p:musicName=”执着”代替
2.使用p:playingMusic-ref=”music”代替

这是怎么回事呢?

原来,p-命名空间可以代替

因此,修改之后的配置使用p-命名空间p:musicName=”执着”代替描述”执着”这个字面量值的注入;使用p-命名空间p:playingMusic-ref=”music”代替描述music这个Bean引用的注入。

于是我们知道了,p-命名空间能以一种简洁紧凑的方式代替

构造函数注入

很多时候,我们希望一步到位,通过构造函数完成Bean的创建与装配。为了满足这样的需求,Spring提供了些支持,让我们能向XML配置文件提供一些信息,告诉Spring容器创建Bean的时候不是调用默认构造函数,而是调用其它具有某些参数的构造函数;从而能在创建Bean的同时通过构造函数注入Bean所需的依赖,完成Bean的创建与装配。

因此,假如com.dream包现有这样一些类:

则可这样配置Bean:

可以看到构造函数注入是用

就该示例而言,Spring容器读取配置信息之后,发现music这个Bean的创建需要调用的构造函数具有一个String类型的参数。于是,Spring容器根据配置文件提供的信息把字符串”执着”传给符合条件的构造函数,并在调用之后完成Bean的创建与装配;发现player这个Bean的创建需要调用的构造函数具有一个Music类型的参数。于是,Spring容器根据配置文件提供的信息把music这个Bean传给符合条件的构造函数,并在调用之后完成Bean的创建与装配。

讲到这里,兴许大家开始困惑了:”如果配置的构造函数具有多个相同类型的参数,Spring容器调用构造函数的时候,怎么知道该把哪个值传给哪个参数,完成Bean的创建与装配呢?”

关于这个问题,我们可以引入

另外,除了参数索引,我们也能使用

还有,同p-命名空间能够代替

新的配置引入c-命名空间xmlns:c=”http://www.springframework.org/schema/c”之后,做了两处改动:
1.使用c:musicName=”执着”代替
2.使用c:playingMusic-ref=”music”代替

这是怎么回事呢?

原来,c-命名空间可以代替

因此,修改之后的配置使用c-命名空间c:musicName=”执着”代替描述”执着”这个字面量值的注入;使用c-命名空间c:playingMusic-ref=”music”代替描述music这个Bean引用的注入。

读到这里,兴许大家已经察觉:”c-命名空间用到了参数名,而Spring容器获取参数名需要调试标志。如果编译代码的时候没有启用调试标志,这种配置方式岂不是有问题?”

是的,确实如此。因此,c-命名空间也支持参数索引。如下所示:

引入参数索引之后,原来的c:musicName=”执着”变成c:_0=”执着”,原来的c:playingMusic-ref=”music”变成c:_0-ref=”music”。也就是说,原来的参数名变成下划线+索引。其中,索引前面的下划线是必须的,因为XML不允许属性名以数字作为开头。引入参数索引之后,Spring容器创建Bean的时候,会按参数索引指定的顺序依次把相应的参数值传给构造函数,并在调用之后完成Bean的创建与装配。

于是我们知道了,Spring容器既能通过属性注入依赖,也能通过构造函数注入依赖。至于该用属性注入还是构建函数注入,则是个人偏好问题。一般而言,强依赖(也就是只有完成注入,程序才能正常运行的依赖)通常选用构造函数注入,可选依赖(也就是不管注入有没有完成,程序都能正常运行的依赖)通常选用属性注入。

静态工厂方法注入

总有那么一些时候,我们的类存在一些专门用于创建对象的静态方法,俗称静态工厂方法。如果我们希望通过静态工厂方法创建Bean,只需向配置文件提供一些信息,告诉Spring容器调用静态工厂方法完成Bean的创建与装配即可。

因此,假如com.dream包现有这样一些类:

则可这样配置Bean:

可以看到

因此,这段配置用于告诉Spring容器:music这个Bean需要调用com.dream.Music类的staticFactory静态工厂方法进行创建,而且调用的时候需要注入”执着”这个字面量值;player这个Bean需要调用com.dream.Player类的staticFactory静态工厂方法进行创建,而且调用的时候需要注入music这个Bean引用。

实例工厂方法注入

工厂方法除了静态工厂方法,还有实例工厂方法。如果我们希望通过实例工厂方法创建Bean,只需向配置文件提供一些信息,告诉Spring容器调用某个Bean的实例工厂方法完成Bean的创建与装配即可。

因此,假如com.dream包现有这样一些类:

则可这样配置Bean:

这里配置了四个Bean:music_1,music_2,player_1,player_2。其中,music_2,player_2就是通过实例工厂方法创建的。

配置实例工厂方法时,需用factory-method属性指定实例工厂方法,factory-bean属性指定实例工厂方法所属的Bean,

因此,这段配置用于告诉Spring容器:music_2这个Bean需要调用music_1这个Bean的instanceFactory实例工厂方法进行创建,而且调用的时候需要注入”执着”这个字面量值;player_2这个Bean需要调用player_1这个Bean的instanceFactory实例工厂方法进行创建,而且调用的时候需要注入music_2这个Bean引用。

NULL值注入

NULL值的注入可用

集合注入

Java提供了多种类型的集合,常见的有List,Set,Map,等等。自然而然的,Spring提供了些支持,用于配置集合的注入。

因此,假如com.dream包现有这样一些类:

则可这样配置Bean:

可以看到List类型的集合能用

当然有的。要知道p-命名空间,c-命名空间是不支持集合的。因此,Spring在spring-util.xsd模式文件里定义了些XML元素,用于描述诸如集合之类的创建信息。而这,需要引入spring-util.xsd模式文件之后修改如下:

可以看到spring-util.xsd模式文件定义了

假如com.dream包现有这样一些类:

则可这样配置Bean:

可以看到Set类型的集合能用

可以看到spring-util.xsd模式文件定义了

假如com.dream包现有这样一些类:

则可这样配置Bean:

可以看到Map类型的集合能用

可以看到spring-util.xsd模式文件定义了

延迟装配

按照正常流程,Spring容器完成Bean的创建之后,开始通过Bean的属性注入Bean的依赖,完成Bean的装配。可是有时候,我们并不希望Spring容器完成Bean的创建之后立即注入依赖,而是希望等到用到的时候才开始注入。这时,就需要用到延迟装配,告诉Spring容器等到用到Bean的时候,才开始注入Bean所需的依赖。如下所示:

这段配置用到

另外,我们还可设置根元素

指定ID

一直以来,我们都用

我们指定id属性的值为music_1,指定name属性的值为music_2,music_3,music_4。因此,该Bean具有四个唯一标识符:music_1,music_2,music_3和music_4。同时我们也注意到了,id属性和name属性有个重大差别:id属性只能指定一个唯一标识符;name属性则不同,可以同时指定多个唯一标识符,标识符之间只要使用逗号,分号或空格隔开就行。

除此之外,Spring还提供了

至此,我们完成了关于如何配置Bean的更多介绍。下章该谈谈自动装配时,Bean的歧义应该如何解决那些事了。欢迎大家继续阅读,谢谢大家!

Original: https://www.cnblogs.com/evanlin/p/15858681.html
Author: 林雪波
Title: 丰富Bean的配置

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571396/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot Error creating bean with name ‘dataSource’ defined in class path resource。。。

    启动spring boot项目出错 解决方法在Application类上增加:@EnableAutoConfiguration(exclude={DataSourceAutoCon…

    Java 2023年5月30日
    060
  • 线程池底层原理

    线程池底层原理 ThreadPoolExecutor 参数 corePoolSize(必填) : 核心线程数 maximumPoolSize(必填):最大线程数 keepAlive…

    Java 2023年6月5日
    088
  • 向有序环形单链表中插入新节点

    一个有序的环形单链表,从头节点开始升序,同时由最后一个结点指回头节点,给定一个环形链表的头节点和一个数值num,创建一个数值为num的新节点,将该节点插入到环形单链表中,要求链表始…

    Java 2023年6月7日
    093
  • 技能篇:docker的简易教程

    虚拟机技术每家公司发展到一定规模都必须考虑的,更好的环境隔离,更好的事故排查,更好的服务部署 docker的原理 docker更换阿里源 docker容器的相关命令 Dockerf…

    Java 2023年6月5日
    085
  • 失物招领网站

    校园失物招领网站 | lijinghai 项目介绍 📖 👉基于Springboot+vue+uni-app的校园失物招领平台. 含平台主体PC端、微信小程序和web后台数据管理平台…

    Java 2023年6月9日
    090
  • mycat高可用-安全管理-监控 看这一篇就够了

    ​ 在之前的操作中,我们已经实现了mysql机器的高可用,可以动态切换master,那么如果mycat崩溃了呢?我们应该如何处理呢?所以此时就需要搭建mycat的高可用集群了。 ​…

    Java 2023年6月7日
    064
  • JavaSE基础——课程笔记

    1.方法概述 1)定义 方法(method):完成特定功能的代码块 2)优点 ①提高了代码的复用性 ②让代码的逻辑更清晰 2.方法的定义和调用 1)定义 2)调用 3.Debug查…

    Java 2023年6月6日
    066
  • vmware虚拟机备忘录

    虚拟机拷贝自其他服务器,有时候IP,网络都配置正确就是没法ping 通网络,重启虚拟机也没用 此时将网卡删除,重新添加 systemctl restart network 即可 O…

    Java 2023年5月30日
    075
  • Tomcat无法启动:报出Server Tomcat v8.5 Server at localhost failed to start

    昨天晚上写Javaweb练习,突然Tomcat报错(Server Tomcat v8.5 Server at localhost failed to start),启动失败 用to…

    Java 2023年6月9日
    067
  • 《人性的弱点》关键结论

    原则一:不要批评、指责或抱怨任何人。 原则二:请不要吝啬发自内心的、不做作的赞美。 原则三:诉诸对方的内在需要。 原则四:真的喜欢别人。 原则五:你,一笑值千金。 原则六:记住对方…

    Java 2023年6月8日
    056
  • Java实现链表

    3、链表 MyLinkedList 有一个头指针,一个尾指针,还有链表长度size 内有两个类,一个是实现了Iterator接口的迭代器类,另一个是Node类,其中Node数据结构…

    Java 2023年6月15日
    069
  • SpringBoot整合MongoDB

    NoSQL(Not Only SQL),即反SQL运动或者是不仅仅SQL,指的是非关系型的数据库,是一项全新的数据库革命运动,是一种全新的思维注入 NoSQL优点 数据库高并发读写…

    Java 2023年6月13日
    079
  • LeetCode.1078-两词出现后的单词(Occurrences After Bigram)

    这是小川的第 392次更新,第 422篇原创 今天介绍的是 LeetCode算法题中 Easy级别的第 254题(顺位题号是 1078)。给出单词 first和单词 second,…

    Java 2023年6月5日
    082
  • 人生苦短,我用JRebel

    昨天看到团子推送的一篇关于热部署的文章,其中介绍了自研的Sonic插件在公司内部的应用。同时晒出来一张对比图: 团子表示我们的插件要比同类插件优秀哦。不过我定睛一看,好家伙,第一列…

    Java 2023年6月5日
    078
  • springboot整合swagger3.0配置集UI界面优化

    添加pom依赖 //swagger 界面优化依赖…

    Java 2023年6月9日
    063
  • Spring Cloud Gateway 网关内置API

    1 时刻与技术进步,每天一点滴,日久一大步!!! 本博客只为记录,用于学习,如有冒犯,请私信于我。 Original: https://www.cnblogs.com/myitne…

    Java 2023年5月30日
    046
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球