Spring IOC之Bean 概述
1.Bean概述
一个Spring IOC容器管理一个或者多个bean。这些bean是根据你提供给容器的配置数据信息创建的,例如XML形式的的定义。
在容器内部,这些bean的定义表示为BeanDefinition对象,这些对象包含下面的元数据信息:
- 一个包含包的类的名字:一般是实际的继承实现类
- Bean行为配置元素,表明bean在容器中的行为(scope, lifecycle callbacks等等)
- bean起作用所需要的其他bean的引用;这些引用也被称为collaborators 或者 dependencies(依赖)。
- 在新的创建的对象中的配置设置,例如,在连接池中使用bean的连接的数目或者是池的数目限制。
这些元数据信息含有的一些力属性集合组成了每一个bean的定义。
(class、name、scope、constructor arguments、properties 、autowiring mode 、lazy-initialization mode、initialization method 、destruction method)
除了包含怎么创建一个具体的bean的定义的信息外,ApplicationContext的实现也是允许用户在容器外部创建的对象进行再注册。这是通过经由返回BeanFactory的实现DefaultListableBeanFactory的getBeanFactory()方法得到ApplicationContext的BeanFactory来实现的。DefaultListableBeanFactory支持这个再注册通过registerSingleton(..)和registerBeanDefinition(..)方法。但是,
一般情况下application但是使用的bean是在bean定义配置文件中。
2.bean的命名
每一个bean有一个或者多个标识符。这些标识符在bean的容器内部必须是唯一的。一个bean一般只会有一个标识符,但是如果它需要多于一个的话,那么额外可以被当做是别名。
在基于XML配置文件中,你可以使用id或者name属性去指明一个bean的标识符。id属性允许你去指明一个唯一的id。按照惯例这些名字是字母数的(myBean, fooService等等),但是也可能包括特殊的字符。如果你想去给bean起一些别名,那么你可以在那么属性中指明,可以用,
和;
以及
空格来分割他们。因为历史的版本,在Spring3.1之前,id属性被定义为xsd:ID
类型,不能是其他的字符。在3.1版本中,它被定义为xsd:string
类型。需要注意的是bean的id尽管不被XML解析器限制了可是仍然被容器中仍然是限制要是唯一的。
你没有被要求去提供一个名字或者id对于一个bean。如果没有显示的提供一个名字,那么容器救赎生成一个唯一性的名字针对这个bean。但是,如果你想去通过使用ref属性或者Service Locator
风格通过名字来引用一个bean,,你必须提供一个名字。不提供一个名字的动机主要和使用内部类和自动注入功能有关。
Bean命名惯例:这个惯例就是当命名bean的时候,使用标准Java实例域的名字。也就是说,bean的名字一个小写字母开头,遵循驼峰命名规则。这样名字的例子可以是 accountManager, accountService,userDao, loginController 等等。
3.在bean的定义的外部引用一个bean
在一个bean自己的定义中,对于每个bean你可以使用一个或者多个名字通过至多一个在id属性里或者任何数量的其他名字在name属性里,这些名字
对于相同的bean都是等价的,在某些情景下还是很有用的。例如,允许在一个应用程序中执行一个共同的依赖的组件中通过使用一个bean名字去指明那个组件。
在bean定义的时候指明所有的依赖并不是总是充分够用的。它只是有事需要去引用一个其他地方定义的bean的依赖。在大的系统中配置是在每一个子系统中都是分开的,每个子系统有自己的对象定义的集合。在基于XML配置中,你可以使用元素来指明他;
<alias name="fromName" alias="toName"/>
在这个例子中,在同一个容器中,一个名字为fromnName的bean,在使用这个依赖定义完成后,就可以引用 toName了。
比如,子系统A的配置通过subsystemA-dataSource的名字引用了一个数据源,子系统B的配置通过subsystemB-dataSource的名字引用了一个数据源。使用了两个子系统组成了主应用通过myApp-dataSource的名字引用了数据源。为了将所有的三个名字指向一个相同的对象,你可以通过下面的依赖定义加入到MyApp的配置中:
<alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/>
<alias name="subsystemA-dataSource" alias="myApp-dataSource" />
现在每一个组件和主程序都可以通过一个唯一的不和塔器定义冲突的名字指向数据源了,也即是说它们指向了同一个bean。
基于Java 的配置:如果你使用java配置,@bean注解被用于提供依赖.
4.bean的实例化
一个bean的定义是创建一个或者多个对象必不可少的。容器在请被请求一个bean的时候货查看这些配置,然后容器会通过提供的配置数据创建一个实际的对象。
如果是你使用基于XML配置,你需要在元素的class属性中指明将要被实例化的对象的类型。class属性在Spring内部会被强制封装到BeanDefinition的Class属性中。你在下面的两种方式之一来使用class属性:
- 一般来说,当容器自己通过调用自己的构造器来直接创建bean的时候需要指明需要被构建的bean的class.,这个在Java代码中使用new操作符是等价的。
- 在包含可以被调用去创建对象的静态工作中指明实际具体的class.这个通过调用静态工长方法返回的对象可能是想通过的class 也可能是另外一个class。
4.1通过构造函数实例化
当年你通过构造器途径来创建一个bean的时候,所有正常的类都是可用的而且和Spring兼容。也就是说,
开发中用到的类是不用实现任何规范的接口。简单的话只需要指明是具体的类就够了。但是,和你使用的IOC容器的类型有关,你可能需要一个缺省的构造函数。
Spring IOC容器能够几乎管理所以他想让它管理的类;它不限制管理镇长的JavaBeans。大部分是Spring用户更偏向于只有一个缺省的构造函数的Javabean而且在属性的后面还有setter和getter方法。你可以在你的容器中有其他更多的非bean风格的类。如果,举个例子
你需要使用一个遗留的连接词但是它完全不符合JavaBean规范,Spring也是可以管理的。
你可以向下面这样来指明你的bean泪的基于XML配置的信息:
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
4.2使用静态工程方法来实例化
当定义一个你通过静态工厂方法来创建的bean时,你使用classs属性来指明具体的类,而且包含了static工厂方法,通过factory-method方法来指明工厂方法的名字。你可以调用这个方法然后返回一个就像是通过构造函数创建的存活的对象一样。
对于这样的bean的定义的使用之一就是在遗留的代码中调用static工厂。
下面的bean定义指明这个bean将会通过调用一个工厂方法来创建。定义没有指明返回对象的类型,只是包含了静态工厂的类。在这个例子中,creativeInstace肯定是静态方法。
<bean id="clientService"
class="examples.ClientService"
factory-method="createInstance"/>
public classClientService {
private staticClientService clientService = newClientService();
privateClientService() {}
public staticClientService createInstance() {
returnclientService;
}
}
4.3通过实例工厂方法来实例化
和通过金泰工厂方法实例化类似,通过一个实例工厂方法调用一个存在的类的非静态的方法从一个从其中去创建一个新的
bean。为了使用这个机制,需要将class属性设置为空,在factory-bean属性中,指明当前容器中bean的名字,它需要
含有被调用创建对象的实例化方法。 用factory-method属性来指明工厂方法。
<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<!-- the bean to be created via the factory bean -->
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
public classDefaultServiceLocator {
private staticClientService clientService = newClientServiceImpl();
privateDefaultServiceLocator() {}
publicClientService createClientServiceInstance() {
returnclientService;
}
}
一个工厂类可以有一个或者多个工厂方法:
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
<!-- inject any dependencies required by this locator bean -->
</bean>
<bean id="clientService"
factory-bean="serviceLocator"
factory-method="createClientServiceInstance"/>
<bean id="accountService"
factory-bean="serviceLocator"
factory-method="createAccountServiceInstance"/>
public classDefaultServiceLocator {
private staticClientService clientService = newClientServiceImpl();
private staticAccountService accountService = newAccountServiceImpl();
privateDefaultServiceLocator() {}
publicClientService createClientServiceInstance() {
returnclientService;
}
publicAccountService createAccountServiceInstance() {
returnaccountService;
}
这种方式表明工厂bean通过DI自己能够管理和注册。
Spring IOC之Bean 概述的更多相关文章
- 使用Spring IoC进行Bean装配
Spring概述 Spring的设计严格遵从的OCP(开闭原则),保证对修改的关闭,也就是外部无法改变spring内部的运行流程:提供灵活的扩展接口,也就是可以通过extends,implements ...
- Spring IOC 之Bean作用域
当你创建一个bean定义的时候,你创建了一份通过那种bean定义的bean的创建类的真正实力的处方.bean的定义是一个处方 的想法是很重要的的.因为这意味着,对于一个类你可以创建很多对象实例从一个单 ...
- Spring IOC之容器概述
1.SpringIOC容器和beans介绍 IOC的依赖注入是这样的,对象定义他们的依赖也就是他们需要在一起起作用的对象是通过构造器参数以及工厂方法的参数或者是当他们被构建或者是从工厂中返回时设置在对 ...
- Spring IOC的Bean对象
---恢复内容开始--- 在Spring IOC模块中Bean是非常重要的.在这里我想给大家讲讲关于Bean对象实例化的三种注入方式: 首先,我先讲一下关于Bean对象属性值的两种注入方式:set注入 ...
- spring IOC装配Bean(注解方式)
1 Spring的注解装配Bean (1) Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean (2) Spring的框架中提供了与@Componen ...
- Spring IOC 和 AOP概述
IoC(控制反转,(Inversion of Control):本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IoC容器,Spring的IoC容器主要使用DI方 ...
- Spring——IOC与Bean容器
[IOC] (1)IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护.也就是说由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中 (2)DI: ...
- Spring基础03——Spring IOC和DI概述
1.什么是IOC与DI IOC(Inversion of Control):其思想是反转资源获取方向,传统的资源查找方式要求组件想容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了IOC之后 ...
- Spring IOC 之Bean定义的继承
一个Bean的定义可以包含大量的配置信息,包括构造器参数.属性值以及容器规范信息,比如初始化方法.静态工厂方法名字等等.一子bean的定义可以从父bean的定义中继承配置数据信息.子bean定义可以覆 ...
随机推荐
- Visual Studio Team Services使用教程--Readers tfs组checkin权限修改
你也可以只开启部分代码的权限 把上面开启的整个应用的权限先去掉 只开启一个文件的权限
- boostrap-非常好用但是容易让人忽略的地方------row
row是非常好用但是却非常容易忽略的地方. 想实现内部元素相对父级的padding=0,则在父子中间加个row.如下图 列嵌套也是同样的道理 经验之谈:学会row的用法,在手机版布局的时候会很方便,否 ...
- Androids含文档erver结束(工具包 Httputils)两
在同server在...的基础上,本文client还登录界面 Andriod简单http get请求基础上,用户注冊后跳转到下载界面,本文下载界面仅仅有两个View,一个是textView显示注冊后u ...
- Unable to load Virtual engine
相关:GenyMotion自带VirtualBox 解决办法:首先确认genymotion及virtualBox正确安装,然后右键点击启动程序选属性,在兼容性里选以兼容模式运行,同时勾选以管理员身份运 ...
- 详细说明C++笔试题,调查超载、盖、多态
C++可见版本,他说,这本书是采访的主题,调查超载.盖.多态性等概念,比较有代表性的.今天上午,远程辅导 Yan Wang 学生们学习 Qt 时还觉得这个话题,假设你能正确地理解这一主题,注意对于 C ...
- 2款不同样式的CSS3 Loading加载动画 附源码
原文:2款不同样式的CSS3 Loading加载动画 附源码 我们经常看到的Loading加载很多都是转圈圈的那种,今天我们来换一种有创意的CSS3 Loading加载动画,一种是声波形状的动画,另一 ...
- JSP/Servlet线程安全
携带servlet开发时间.线程安全是非常重要的.否则会导致一些意想不到的结果. Servlet的生命周期是由Web负责集装箱,什么时候client第一个请求Servlet时间,容器负责初始化Serv ...
- ActiveMQ与RabbitMQ采用camel综合
著名EIP实施框架Camel它起源于ActiveMQ的一些基于消息的集成需求.然后逐渐发展成为一个ActiveMQ的子项目,最后这一块的功能越来越完好.就成为了Apache的顶级项目. 所以,从一開始 ...
- 深入Java虚拟机——类型装载、连接(转)
来自http://hi.baidu.com/holder/item/c38abf02de14c7d31ff046e0 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Ja ...
- Unity3D脚本--真实1
1. Unity3D动作脚本 Unity3D脚本用于Unity3D发动机订单公布. JavaScript全局变量:在Inspector中能够看到,且能够改动其值.其他脚本可调用此变量. C#公有(pu ...