共计 4965 个字符,预计需要花费 13 分钟才能阅读完成。
前言
欢送来到本篇文章,鸽了良久了,明天持续写下 Spring 的内容:Spring 中 Bean 的基本概念、根本写法和 3 种实例化 Bean 的形式等。
什么是 Bean?
咱们回顾下,什么是 Bean?这在上一篇文章中说过了,简而言之,一句话:被 Spring IoC 治理的对象,就是 Bean。
一个 Spring IoC 容器中治理着一个或多个 Bean,这些 Bean 是由咱们提供给容器的 配置元数据 创立的(比方以 XML <bean />
模式定义的 Bean)。
「Bean Definition」的属性
在容器自身中,这些 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 生命周期章节中探讨。 |
Bean 的命名
以 XML 作为配置元数据的形式中,Bean 定义的根本格局是这样写的:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- 该 bean 的协作者和配置写在此处 -->
</bean>
<bean id="..." class="...">
<!-- 该 bean 的协作者和配置写在此处 -->
</bean>
<!-- 更多的 bean 定义写在此处 -->
</beans>
XML 中相似
<bean/>
由尖括号组成的写法,个别称为「标签」或者「元素」,在前面的说法中,可能有时呈现标签的说法或者元素的说法,实际上都是指同一个货色,后续便不再阐明
咱们能够看到,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 起别名:
<bean id = "userService" name="userServiceName" ... ></bean>
<alias name="userServiceName" alias="userServiceAliasName" />
这样,名为 userServiceName
的 Bean 也有了另一个名字:userServiceAliasName
。
Spring 实例化 Bean 的 3 种形式
Spring 能够通过 3 种形式来为咱们创立 Bean 对象,创立的对象是依据咱们定义的配置元数据来进行创立的。
这 3 种形式别离是:
- 通过构造方法实例化
- 通过动态工厂办法实例化
- 通过实例工厂办法实例化
在下面的 Bean 定义的属性中,咱们也看到了,在 <bean />
中有一个 class
属性,就是用来指定要实例化的对象的类型的。个别状况下,这个 class
属性是必须写的,除非是通过实例工厂办法实例化的 Bean,那么它的 Bean 定义能够不须要 class
属性。
1. 通过构造方法实例化
以 XML 为配置元数据为例,在默认的状况下,咱们定义的 Bean 都是以构造方法来实例化 Bean 对象的。
这些交给 Spring 治理的 Bean,不须要实现 Spring 的某某接口或者继承 Spring 的某某类,只须要有一个无参的构造方法,就能够了。
这里也是 Spring 低侵入的特点,咱们的类基本不须要去实现 Spring 特定的接口或继承特定的类进而实现 IoC 的性能。
<bean id="fans" class="cn.god23bin.demo.domain.entity.Fans">
<property name="name" value="god23bin" />
</bean>
以下面这个例子来说,这样定义的 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: god23bin
2. 通过动态工厂办法实例化
假如咱们有一些对象是从动态工厂中获取对象的,有一个动态工厂类,类中定义了一个静态方法,该办法是创建对象的:
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
属性指定创建对象的静态方法:
<bean id="fans" class="cn.god23bin.demo.domain.entity.factory.FansStaticFactory" factory-method="createFansInstance" />
测试:
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
属性是不须要的。
<!-- 配置实例工厂 Bean,该对象蕴含了创立 Fans 对象的名为 createFansInstance 的办法 -->
<bean id="fansFactory" class="cn.god23bin.demo.domain.entity.factory.FansFactory">
<!-- 工厂的其余须要的依赖对象就配置在这里 -->
</bean>
<!-- 这个 Bean 将通过实例工厂创立 -->
<bean id="fans" factory-bean="fansFactory" factory-method="createFansInstance" />
总结
以上,就是本文的所有内容,次要介绍了 Spring 中 Bean 的概念和 Bean 的定义属性。
Bean 由配置元数据创立,比方以 XML 模式定义的 Bean。Bean 在容器中由 BeanDefinition 对象示意,它蕴含类名、行为配置元素、对其余 Bean 的援用以及其余配置设置等元数据属性。
Bean 的命名形式个别就是驼峰命名的。在基于 XML 的配置元数据中,能够应用 id 属性或 name 属性来指定 Bean 的标识符,Bean 的别名能够应用 alias 标签进行定义。
最初,咱们说了 Spring 实例化 Bean 的三种形式:通过构造方法实例化、通过动态工厂办法实例化和通过实例工厂办法实例化。
当然,Bean 的内容不止这些,本文是对 Bean 的初步介绍。下一篇咱们将介绍 Bean 之间的依赖关系,通过依赖注入来实现 Bean 之间的相互依赖。
最初的最初
心愿各位屏幕前的 靓仔靓女们
给个三连!你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!
咱们下期再见!