欢迎来到本篇文章,鸽了好久了,今天继续写下 Spring 的内容:Spring 中 Bean 的基本概念、基本写法和 3 种实例化 Bean 的方式等。
什么是 Bean?我们回顾下,什么是 Bean?这在上一篇文章 Spring 核心概念之一 IoC 中说过了,简而言之,一句话:被 Spring IoC 管理的对象,就是 Bean。
【资料图】
一个 Spring IoC 容器中管理着一个或多个 Bean,这些 Bean 是由我们提供给容器的配置元数据创建的(比如以 XML 形式定义的 Bean)。
在容器本身中,这些 Bean 定义被表示为 BeanDefinition对象,它包含(除其他信息外)以下元数据(metadata)。
cn.god23bin.demo.controller.DemoController,这就是 Bean Definition 的实际实现类。Bean 的行为配置元素:它说明了 Bean 在容器中的行为方式(比如 scope、生命周期回调等等)。对其他 Bean 的引用:这些被引用的 Bean 被称为协作者或依赖(collaborators or dependencies)。其他配置的设置:比如,数据库连接池的大小限制或使用的连接数。这些元数据对应着每个 Bean Definition 的一组属性。下表描述了这些属性:
| 属性 | 解释… |
|---|---|
| Class | 该属性是必需的,它指定了用于创建 bean 的 bean 类。 |
| Name | 该属性唯一地指定 bean 标识符。 在基于 XML 的配置元数据中,我们可以使用 id 或 name 属性来指定 bean 标识符。 |
| Scope | 该属性指定从特定 bean 定义创建的对象的范围,将在 bean 范围一章中讨论。 |
| Constructor arguments | 这用于注入依赖关系,将在后续章节中讨论。 |
| Properties | 这用于注入依赖关系,将在后续章节中讨论。 |
| Autowiring mode | 这用于注入依赖关系,将在后续章节中讨论。 |
| Lazy initialization mode | 懒加载模式,让 bean 告诉 IoC 容器在第一次被请求时创建一个 bean 实例,而不是在启动时。 |
| Initialization method | 在容器设置了 bean 上的所有必要属性之后调用的回调。 它将在 bean 生命周期章节中讨论。 |
| Destruction method | 当包含 bean 的容器被销毁时要使用的回调。 它将在 bean 生命周期章节中讨论。 |
以 XML 作为配置元数据的方式中,Bean 定义的基本格式是这样写的:
XML 中类似
由尖括号组成的写法,一般称为「标签」或者「元素」,在后面的说法中,可能有时出现标签的说法或者元素的说法,实际上都是指同一个东西,后续便不再说明
我们可以看到,bean 标签有 id、class属性。
这个 id是每个 Bean 都有的一个标识符(identifier),这些标识符在 Spring IoC 容器中必须是唯一的。
一个 Bean 一般只有一个标识符。如果它需要一个以上的标识符,那么多余的标识符可以被视为别名。
在基于 XML 的配置元数据中,我们可以使用 id属性、name属性或两者来指定 Bean 的标识符。
命名习惯
习惯上,这里对于 Bean 定义的命名和对于我们命名 Java 类中的属性名是一样的,就是驼峰命名,小写字母开头。比如
userService、userDao、loginController等等。还有,如果想起多个别名,那么用
name属性指定别名是什么,比如name="别名1,别名2,别名3",多个别名之间可以用英文逗号、英文分号或者空格分隔。
Bean 的别名
除了使用 Bean 定义中的 name 属性来对 Bean 起别名,还可以使用 alias标签给 Bean 起别名:
这样,名为 userServiceName的 Bean 也有了另一个名字:userServiceAliasName。
Spring 可以通过 3 种方式来为我们创建 Bean 对象,创建的对象是根据我们定义的配置元数据来进行创建的。
这 3 种方式分别是:
通过构造方法实例化通过静态工厂方法实例化通过实例工厂方法实例化在上面的 Bean 定义的属性中,我们也看到了,在 中有一个 class属性,就是用来指定要实例化的对象的类型的。一般情况下,这个 class属性是必须写的,除非是通过实例工厂方法实例化的 Bean,那么它的 Bean 定义可以不需要 class属性。
1. 通过构造方法实例化
以 XML 为配置元数据为例,在默认的情况下,我们定义的 Bean 都是以构造方法来实例化 Bean 对象的。
这些交给 Spring 管理的 Bean,不需要实现 Spring 的某某接口或者继承 Spring 的某某类,只需要有一个无参的构造方法,就可以了。
这里也是 Spring 低侵入的特点,我们的类根本不需要去实现 Spring 特定的接口或继承特定的类进而实现 IoC 的功能。
以上面这个例子来说,这样定义的 Bean 就是通过 cn.god23bin.demo.domain.entity.Fans的构造方法实例化的:
package cn.god23bin.demo.domain.entity;public class Fans { private String name; public Fans() { System.out.println("粉丝无参构造方法被调用了!"); } // 省略 getter 和 setter}从 Spring IoC 容器中获取被管理的 Fans 对象,这个过程,Spring 就会根据配置元数据去使用构造方法实例化 Fans 对象。
测试:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Fans fans = applicationContext.getBean(Fans.class);System.out.println("fans name: " + fans.getName());输出:
粉丝无参构造方法被调用了!fans name: god23bin2. 通过静态工厂方法实例化
假设我们有一些对象是从静态工厂中获取对象的,有一个静态工厂类,类中定义了一个静态方法,该方法是创建对象的:
package cn.god23bin.demo.domain.entity.factory;import cn.god23bin.demo.domain.entity.Fans;public class FansStaticFactory { // 返回 Fans 对象的静态方法 public static Fans createFansInstance() { System.out.println("粉丝静态工厂!"); Fans fans = new Fans(); fans.setName("练习两年半 | 你干嘛哎哟~~"); return fans; }}接着在配置元数据中定义 Bean,将通过调用工厂的静态方法来创建 Bean 对象,使用 class属性指定包含了静态工厂方法的类,使用 factory-method属性指定创建对象的静态方法:
测试:
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Fans fans = applicationContext.getBean(Fans.class);System.out.println("fans name: " + fans.getName());输出:
粉丝静态工厂!粉丝无参构造方法被调用了!fans name: 练习两年半 | 你干嘛哎哟~~3. 通过实例工厂方法实例化
实例工厂:
package cn.god23bin.demo.domain.entity.factory;import cn.god23bin.demo.domain.entity.Fans;public class FansFactory { public FansFactory() { } public Fans createFansInstance() { System.out.println("粉丝工厂"); Fans fans = new Fans(); fans.setName("练习两年半 | 你干嘛哎哟~~ | 记得关注我噢~"); return fans; }}和静态工厂实例化 Bean 对象类似,我们这里用实例厂方法进行 Bean 的实例化,从 Spring IoC 容器中调用现有工厂 Bean 的非静态方法来创建一个新的 Bean。
这里需要注意 Fans 这个 Bean 的
class属性是不需要的。
总结以上,就是本文的所有内容,主要介绍了 Spring 中 Bean 的概念和 Bean 的定义属性。
Bean 由配置元数据创建,比如以XML形式定义的 Bean。Bean 在容器中由 BeanDefinition 对象表示,它包含类名、行为配置元素、对其他 Bean 的引用以及其他配置设置等元数据属性。
Bean 的命名方式一般就是驼峰命名的。在基于XML的配置元数据中,可以使用 id 属性或 name 属性来指定 Bean 的标识符,Bean 的别名可以使用 alias 标签进行定义。
最后,我们说了 Spring 实例化 Bean 的三种方式:通过构造方法实例化、通过静态工厂方法实例化和通过实例工厂方法实例化。
当然,Bean 的内容不止这些,本文是对 Bean 的初步介绍。下一篇我们将介绍 Bean 之间的依赖关系,通过依赖注入来实现 Bean 之间的相互依赖。
最后的最后希望各位屏幕前的靓仔靓女们给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!
咱们下期再见!
标签:
欢迎来到本篇文章,鸽了好久了,今天继续写下Spring的内容:Spring中Be
1、想买净水器,可以先看看哪个牌子的净水器比较好。2、目前品牌有美的
“希望你们不要因为权力的吸引力而变得‘精致’圆滑,不要因为权力的支
爱情就像战场。首先要重视高层的努力,然后要给女人自己的动力。深圳生
09年江淮瑞鹰的综述江淮瑞鹰是一款于2009年发布的车型,它在上市后引起
截至2023年6月23日收盘,比亚迪股份-R(81211 HK)报收于236 2港元,下跌
与此同时,一些此前主推低度酒品类的酒企也在推出白酒,上海贵酒旗下的
我是东方时讯的客服小方,我来为大家解答以上问题。炮仗花耐寒吗的很多
上证报中国证券网讯据中国天气网6月23日消息,继昨天之后,今天(6月23
@山西高考考生6月26日开始第一段填报志愿---记者从山西省招生考试管理
为进一步加强产教融合型课程建设,提升应用型人才培养质量,6月21日上
1、疾病分析:肿大的腮腺炎称为流行性腮腺炎,腮腺炎又分为化脓性腮腺
据英国《每日电讯报》22日爆料,有英国政府消息人士称,美国总统拜登不
1、没有的。2、真的兰博基尼都是更换汽车MOD。本文分享完毕,希望对大
日前,国家卫生健康委办公厅、国家中医药局管理局综合司联合印发《关于
据中国驻美国大使馆官方微信消息,自2023年3月15日起,中国政府对
据宁夏日报消息,6月22日,银川市印发《银川市安全生产大排查大整治专
6月22日,在尼泊尔旅游胜地博克拉,一名嘉宾在启用仪式上体验微信扫码
图说:截至6月23日10时,上海高速路网车流增大,但暂未出现缓行路段来
电商报快讯:6月23日消息,快手发布公告,于2023年6月21日该公司斥资27