spring-framework-中文文档二:Bean概述
Spring IoC容器管理一个或多个bean。这些bean是使用您提供给容器的配置元数据创建的,例如,以XML <bean/>定义的形式 。
在容器本身中,这些bean定义被表示为 BeanDefinition对象,其中包含以下元数据(以及其他信息):
包限定的类名称:通常是所定义的bean的实际实现类。
Bean行为配置元素,它说明bean在容器中的行为(范围,生命周期回调等等)。
引用bean为其工作所需的其他bean; 这些引用也称为 协作者或 依赖关系。
在新创建的对象中设置的其他配置设置,例如,用于管理连接池的Bean的连接数量或池的大小限制。
这个元数据转化为一组构成每个bean定义的属性。
表5.1。这个bean的定义
| 属性 | 在...中解释 |
|---|---|
| 类 class | |
| name | |
| 范围 scope | |
| 构造函数参数 constructor arguments | |
| 性能 properties | |
| 自动装配模式 autowiring mode | |
| 延迟初始化模式 lazy-initialization mode | |
| 初始化方法 initialization method | |
| 销毁方法 destruction method |
除了包含有关如何创建特定bean的信息的bean定义外,这些 ApplicationContext实现还允许用户注册在容器外部创建的现有对象。这是通过getBeanFactory()返回BeanFactory实现 的方法访问ApplicationContext的BeanFactory来完成的DefaultListableBeanFactory。 DefaultListableBeanFactory支持通过方法该登记registerSingleton(..)和 registerBeanDefinition(..)。但是,典型的应用程序只能通过元数据bean定义来定义bean。
5.3.1命名bean
每个bean都有一个或多个标识符。这些标识符在托管bean的容器内必须是唯一的。一个bean通常只有一个标识符,但是如果它需要多个标识符,额外的标识符可以被认为是别名。
在基于XML的配置元数据中,可以使用 id和/或name属性来指定bean标识符。该id属性允许您指定恰好一个ID。通常这些名称是字母数字('myBean','fooService'等),但也可能是特殊字符。如果要将其他别名引入到bean中,还可以在name属性中指定它们,并用逗号(,),分号(;)或空格分隔。作为一个历史记录,在Spring 3.1之前的版本中,该 id属性被键入为一个 xsd:ID,这限制了可能的字符。现在是3.1版本xsd:string。请注意,bean id唯一性仍由容器强制执行,尽管不再由XML解析器执行。
您不需要为bean提供名称或标识。如果没有显式提供名称或标识,容器为该bean生成一个唯一名称。但是,如果您想通过名称来引用该bean,则通过使用ref元素或服务定位器样式查找,您必须提供一个名称。不提供名称的动机与使用内部bean 和自动装配协作者有关。
Bean命名约定
约定是在命名bean时使用标准Java约定作为实例字段名称。也就是说,bean名称以小写字母开头,并且从此开始以骆驼为基础。这种名称的例子将是(不带引号)'accountManager', 'accountService','userDao', 'loginController',等等。
命名bean始终使您的配置更易于阅读和理解,如果您使用的是Spring AOP,则将建议应用于与名称相关的一组bean时会有很大帮助。
在bean定义之外别名一个bean
在bean定义本身中,可以通过使用最多由id属性指定的一个名称和属性中任意数量的其他名称 的组合来为bean提供多个名称 name。这些名称可以等同于同一个bean的别名,并且对于某些情况很有用,例如允许应用程序中的每个组件通过使用特定于该组件本身的bean名称来引用公共依赖项。
然而,指定bean实际定义的所有别名并不总是足够的。有时候需要为其他地方定义的bean引入一个别名。在大型系统中,这种情况通常是这种情况,其中配置分布在每个子系统中,每个子系统都有自己的一组对象定义。在基于XML的配置元数据中,您可以使用该 <alias/>元素来完成此操作。
<alias name= “fromName” alias= “toName” />
在这种情况下,被命名的同一容器中的bean fromName也可以在使用该别名定义之后被称为toName。
例如,子系统A的配置元数据可以通过名称'subsystemA-dataSource引用数据源。子系统B的配置元数据可以通过名称'subsystemB-dataSource'引用数据源。在编写使用这两个子系统的主应用程序时,主应用程序通过名称“myApp-dataSource”引用数据源。要让所有三个名称都引用您添加到MyApp配置元数据中的同一对象,请使用以下别名定义:
<alias name = “subsystemA-dataSource” alias = “subsystemB-dataSource” />
<alias name = “subsystemA-dataSource” alias = “myApp-dataSource” />
现在,每个组件和主应用程序都可以通过一个唯一的名称来引用dataSource,并保证不会与任何其他定义冲突(有效地创建名称空间),但它们引用同一个bean。
5.3.2实例化bean
bean定义本质上是创建一个或多个对象的配方。容器在被询问时查看命名bean的配方,并使用由该bean定义封装的配置元数据来创建(或获取)实际对象。
如果使用基于XML的配置元数据,则可以指定要在元素的class属性中 实例化的对象的类型(或类) <bean/>。这个class 属性在内部是Class一个BeanDefinition实例的属性,通常是强制性的。(有关例外情况,请参阅“使用实例工厂方法实例化”和第5.7节“Bean定义继承”)。您可以通过Class以下两种方式之一使用该 属性:
通常,在容器本身通过反射调用其构造函数直接创建bean的情况下,指定要构建的bean类,这与使用
new操作符的Java代码有些相同。
指定包含实际的类
static将被调用以创建该对象,在容器调用一个不常见的情况工厂方法static,工厂 的一类方法来创建bean。从调用static工厂方法返回的对象类型可以是完全相同的类或另一个类。
内部类名称
如果你想为一个static嵌套类配置一个bean定义 ,你必须使用内部类的 二进制名称。
例如,如果您Foo 在com.example包中调用了一个类,并且此类 Foo具有一个static名为的内部类Bar,那么'class'bean定义上的属性的值 将是...
com.example.Foo$Bar
注意使用$名称中的字符将内部类名与外部类名分开。
用构造函数实例化
当您通过构造函数方法创建一个bean时,所有普通类都可以被Spring使用并兼容。也就是说,正在开发的类不需要实现任何特定的接口或以特定的方式编码。只需指定bean类就足够了。但是,根据您用于特定bean的IoC类型,您可能需要一个默认(空)构造函数。
Spring IoC容器几乎可以管理 任何您想要管理的类; 它不限于管理真正的JavaBeans。大多数Spring用户更喜欢实际的JavaBeans,它只有一个默认的(无参数)构造函数,以及在容器中的属性之后建模的合适的setter和getter。您也可以在容器中使用更具异国情调的非Bean风格类。例如,如果您需要使用绝对不符合JavaBean规范的传统连接池,Spring也可以管理它。
使用基于XML的配置元数据,您可以按如下方式指定您的bean类:
<bean id = “exampleBean” class = “examples.ExampleBean” /> <bean name = “anotherExample” class = “examples.ExampleBeanTwo” />
有关在构造对象后为参数提供参数(如果需要)和设置对象实例属性的机制的详细信息,请参阅注入依赖项。
使用静态工厂方法实例化
在定义一个使用静态工厂方法创建的bean时,可以使用该class属性来指定包含static工厂方法的类和factory-method指定工厂方法本身的名称的属性。您应该能够调用此方法(使用后面介绍的可选参数)并返回一个活动对象,随后将其视为通过构造函数创建的对象。这种bean定义的一个用途是static在旧代码中调用 工厂。
以下bean定义指定将通过调用工厂方法来创建该bean。该定义没有指定返回对象的类型(类),而只指定了包含工厂方法的类。在这个例子中,该 createInstance()方法必须是一个 静态方法。
<bean id = “clientService”
class = “examples.ClientService”
factory-method = “createInstance” />
public class ClientService {
private static ClientService clientService = new ClientService();
private ClientService(){} public static ClientService createInstance(){
return clientService;
}
}
有关从工厂返回对象之后向工厂方法提供参数(可选)和设置对象实例属性的机制的详细信息,请参阅依赖关系和详细配置。
使用实例工厂方法实例化
与通过静态工厂方法实例化类似,使用实例工厂方法的实例化从容器调用现有bean的非静态方法来创建新的bean。要使用此机制,请将该class 属性留空,并在factory-bean 属性中指定当前(或父/祖代)容器中的bean的名称,该容器包含要调用以创建对象的实例方法。使用factory-method属性设置工厂方法本身的名称。
<! - factory bean,它包含一个名为createInstance()的方法 - >
<bean id = “serviceLocator” class = “examples.DefaultServiceLocator” >
<! - 注入此locator bean所需的任何依赖项 - >
< / bean> <! - 要通过工厂bean创建的bean - >
<bean id = “clientService”
factory-bean = “serviceLocator”
factory-method = “createClientServiceInstance” />
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
private DefaultServiceLocator(){} public ClientService createClientServiceInstance(){
return clientService;
}
}
一个工厂类也可以拥有多个工厂方法,如下所示:
<bean ID = “serviceLocator” class = “examples.DefaultServiceLocator” >
<! -通过注入此定位器bean所需的任何依赖关系- >
</bean>
<bean ID = “clientService”
factory-bean= “serviceLocator”
factory-method = “createClientServiceInstance” /> <bean id = “accountService”
factory-bean = “serviceLocator”
factory-method = “createAccountServiceInstance” />
public class DefaultServiceLocator {
private static ClientService clientService = new ClientServiceImpl();
private static AccountService accountService = new AccountServiceImpl();
private DefaultServiceLocator() {}
public ClientService createClientServiceInstance() {
return clientService;
}
public AccountService createAccountServiceInstance() {
return accountService;
}
}
这种方法表明,工厂bean本身可以通过依赖注入(DI)进行管理和配置。详细信息请参阅依赖关系和配置。
![]() |
|
在Spring文档中,工厂bean 指的是在Spring容器中配置的bean,它将通过实例或静态 工厂方法创建对象。相反, |
spring-framework-中文文档二:Bean概述的更多相关文章
- spring boot 中文文档地址
spring boot 中文文档地址 http://oopsguy.com/documents/springboot-docs/1.5.4/index.html Spring Boot 参考指 ...
- Django REST framework 中文文档
Django REST framework介绍 现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势. 显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别是把Dj ...
- Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)
作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...
- Chromium Embedded Framework 中文文档(简介)
转自:http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html 简介 Chromium Embedded Framework ...
- Abp Framework中文文档上线
感谢 ABP框架中国小组 给我们带来的ABP中文翻译,Web+为方便广大学习爱好者随时查阅,现推出了Gitbook风格的在线阅读文档:http://www.webplus.org.cn/documen ...
- spring boot 中文文档
https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/VII.%20Spring%20Boot%20CLI/index. ...
- springcloud 中文文档
spring cloud 中文文档:https://springcloud.cc/spring-cloud-dalston.html spring cloud 中文网:https://springcl ...
- Spring中文文档
前一段时间翻译了Jetty的一部分文档,感觉对阅读英文没有大的提高(*^-^*),毕竟Jetty的受众面还是比较小的,而且翻译过程中发现Jetty的文档写的不是很好,所以呢翻译的兴趣慢慢就不大了,只能 ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)
接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...
随机推荐
- 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast
[源码下载] 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast 作者:webabcd 介绍背水一战 ...
- 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手
.引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...
- Java 使用 int 数据计算百分比
int diliverNum=3;//举例子的变量 int queryMailNum=9;//举例子的变量 // 创建一个数值格式化对象 NumberFormat numberFormat = Num ...
- 音视频编解码——LAME
一.LAME简介 LAME是目前非常优秀的一种MP3编码引擎,在业界,转码成Mp3格式的音频文件时,最常用的就是LAME库.当达到320Kbit/s时,LAME编码出来的音频质量几乎可以和CD的音质相 ...
- numpy中函数shape的用法
shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入参数可以使一个整数表示维度,也可以是一个矩阵.这 ...
- 算法:时间复杂度+二分查找法(Java/Go/Python)实现
导读 曾几何时学好数据结构与算法是我们从事计算机相关工作的基本前提,然而现在很多程序员从事的工作都是在用高级程序设计语言(如Java)开发业务代码,久而久之,对于数据结构和算法就变得有些陌生了,由于长 ...
- C# 结合 using 语句块的三种实用方法
一.简介 阅读 Abp 源码的过程中,自己也学习到了一些之前没有接触过的知识.在这里,我在这儿针对研究学习 Abp 框架中,遇到的一些值得分享的知识写几篇文章.如果有什么疑问或者问题,欢迎大家评论指正 ...
- 在 .NET Core 下的 Swagger UI 自定义操作
1.Swagger UI 是什么? Swagger UI 是一个在线的 API 文档生成与测试工具,你可以将其集成在你的 API 项目当中. 支持 API 自动同步生成文档 高度自定义,可以自己扩展功 ...
- linux 命令 — sort、uniq
sort uniq sort:对行或者文本文件排序 uniq:去除重复的行 常用 sort -n file.txt 按数字进行排序 sort -r file.txt 按逆序进行排序 sort -M f ...
- Perl和操作系统交互(二):fork
fork + exec fork是低层次的系统调用,通过复制父进程来创建子进程. fork的行为 fork用来拷贝当前进程,生成一个基本完全一样的子进程. my $pid=fork(); 如果fork ...
