您的位置:首页 > 编程语言 > Java开发

spring技术手册阅读笔记(二) spring bean的使用

2006-09-15 11:43 253 查看
Spring的依赖注入容器的核心是Bean工厂。Bean工厂负责管理组件和它们之间的依赖关系。一般说来,你的beans应该遵守JavaBeans规范,但是这不是必须的,如果使用构造器依赖注入来连接的beans的时候,就没有遵守beans规范(beans规范中的javabean构造函数没有参数)。
一个BeanFactory可以用接口org.springframework.beans.factory.BeanFactory表示, 这个接口有多个实现。 最常使用的的简单的beanFactory实现是org.springframework.beans.factory.xml.XmlBeanFactory。
如果通过配置文件来完成配置,在内部是通过实现了BeanDefinition接口的类的实例来表现的。Bean的配置不仅存储着关于bean自己的信息,同时还有其依赖的beans的信息。对于任何实现了beanDefinitionRegistry接口的BeanFactory类,从配置文件中读取Bean定义(BeanDefinition)数据,既可以通过PropertiesBeanDefinitionReader(基于.properties文件)也可以通过XMLBeanDefinitionReader(基于XML文件)。
XmlBeanFactory派生于DefaultListableBanFactory并且简单的扩展了它,使它能够通过XmlBeanDefinitionReader自动获取配置信息。用户不需要实例化BeanFactory, 因为Spring框架代码会做这件事。
一个XmlBeanFactory中的Bean定义包括的内容有:
classname:这通常是bean的真正的实现类。但是如果一个bean使用一个静态工厂方法所创建而不是被普通的构造函数创建,那么这实际上就是工厂类的classname
bean行为配置元素:它声明这个bean在容器的行为方式(比如prototype或singleton,自动装配模式,依赖检查模式,初始化和析构方法)。
BeanFactory调用某个类的静态的工厂方法来创建bean, class属性指定了实际包含静态工厂方法的那个类。有以下3个途径创建bean:
1.通过构造函数创建bean
2.通过静态工厂方法创建Bean
3.通过实例工厂方法创建bean
每一个bean都有一个或多个id(也叫作标志符,或名字;这些名词说的是一回事)。这些id在管理bean的BeanFactory或ApplicationContext中必须是唯一的。 一个bean一般只有一个id,但是如果一个bean有超过一个的id,那么另外的可以认为是别名。
Beans被定义为两种部署模式中的一种:singleton或prototype。
如果一个bean是singleton形态的,那么就只有一个共享的实例存在, 所有和这个bean定义的id符合的bean请求都会返回这个唯一的、特定的实例。
如果bean以non-singleton,prototype模式部署的话,对这个bean的每次请求都会创建一个新的bean实例。这对于例如每个user需要一个独立的user对象这样的情况是非常理想的。
Beans默认被部署为singleton模式,除非你指定。要记住把部署模式变为non-singletion(prototype)后,每一次对这个bean的请求都会导致一个新创建的bean,而这可能并不是你真正想要的。所以仅仅在绝对需要的时候才把模式改成prototype。(我仅在ThrowawayController时使用过singleton="false)
反向控制/依赖注射存在两种主要的形式:
1.基于setter的依赖注射,是在调用无参的构造函数或无参的静态工厂方法实例化你的bean之后, 通过调用你的bean上的setter方法实现的。 在BeanFactory中定义的使用基于setter方法的注射依赖的bean是真正的JavaBean。 Spring一般提倡使用基于setter方法的依赖注射,因为很多的构造函数参数将会是笨重的, 尤其在有些属性是可选的情况下。
2.基于构造函数的依赖注射,它是通过调用带有许多参数的构造方法实现的, 每个参数表示一个合作者或者属性。  虽然Spring一般提倡在大多数情况下使用基于setter的依赖注射, 但是Spring还是完全支持基于构造函数的依赖注射, 因为你可能想要在那些只提供多参数构造函数并且没有setter方法的遗留的bean上使用Spring。 另外对于比较简单的bean,使用构造函数方法以确保bean不会处于错误的状态。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息