《Spring2.0 技术手册》读书笔记三-Bean定义文件的配置与读取
通过前两篇笔记知道Spring是通过配置文件来管理应用组件-Bean的。那本篇详解Bean配置文件!
对Spring的使用分为两步: 定义各类;配置类、及类间的依赖关系。配置文件是往往是一个xml文件,在主程序中,我们有以下两种方法来读取xml配置文件并根据配置文件来初始化Bean。
方法一:
其中Resource和BeanFactory均为接口,ClassPathResource、FileSystemResource、InputStreamResource、ServletContextResource、UrlResource实现了Resource接口。XmlBeanFactory实现了BeanFactory接口,XmlBeanFactory只接受实现Resource接口的对象。在这里,BeanFactory就是Spring提供的IoC容器,负责读取Bean定义文件;管理对象的加载、生成;维护Bean对象间的依赖关系;负责Bean的生命周期。然后通过getBean()方法取得Bean实例。
注意:使用BeanFactory,只有在真正需要Bean对象时,才会建立实际的Bean实例,而不是在一开始建立BeanFactory时就建立Bean实例。
BeanFactory接口提供了6种方法有:
boolean containsBean(String):测试BeanFactory是否包含指定名称的Bean。
Object getBean(String):指定Bean定义文件中设置的Bean的id,取得对应的Bean实例。
Object getBean(String,Class):获得相应Bean实例,并转换为指定的类。
Class getType(String):获得相应Bean的Class实例。
boolean isSingleton(String):测试对应Bean的scope是否为singleton,即容器只有一个此Bean的实例。
String[] getAliases(String):取得对应Bean的所有别名。
方法二:
BeanFactory只是管理Bean的容器,若要使用Spring的一些特色及高级容器功能,就需要使用ApplicationContext。它是一个接口,基于BeanFactory建立,除具备读取Bean定义文件,维护Bean间关系外,还提供了应用程序所需要的更完整的框架功能,如:更方便的取得资源文件、提供解析文字消息的方法、支持国际化消息、可以发布事件等。
实现此接口的类有:FileSystemXmlApplicationContext-指定xml定义文件的相对路径或绝对路径来读取xml文件;ClassPathXmlApplicationContext-从classpath下读取xml文件,即源代码所在根目录;XmlWebApplicationContext-在web应用程序的文件架构中,指定相对位置读取定义文件。
下面详解Bean定义文件
Bean的实例化:
在代码中调用applicationContext.getBean("bean1")方法均可获得XXXBean1的实例。
Bean的scope和别名:
从BeanFactory或ApplicationContext取得的实例默认为Singleton模式。
Bean定义的继承:
在Bean定义文件中,可能会许多Bean都有相同的属性,且大部分设置都是相同的值,这时就可以考虑继承某个Bean定义,省去相同的设置。有两种继承设置方法-抽象继承和实例继承:
通过getBean("someBean")方法获得Bean实例中属性name为Jack,age为18。注意:Bean的属性设置有两种形式,一个是通过<property>标签的子标签<value>设置,一个是通过<property>标签的value属性设置。其中value均可改为ref,属性的值是对另外一个Bean实例的引用。
Bean的依赖设置:
上篇已经介绍了依赖注入的三种方法,Spring中主要使用设置注入:通过<property>标签来设置依赖关系。也可以使用构造函数注入
,前提是类中需要有包含相应参数的构造函数。
类HelloBean中有属性String name,int age;构造函数HelloBean(String,int)。也可以使用<constructor-arg>标签的属性name指定对应的构造函数的参数。name/index都不使用,就必须保证定义文件中的参数顺序与构造函数的参数顺序保持一致。
<constructor-arg>的type属性可以指定参数的类型。如果参数不是基本类型,也可以用ref来代替value,指向某个类的实例(<ref bean=""/>或者使用constructor-arg的属性ref)。
引用设置:
前面都提到了ref标签或者ref属性,下面详写例子如下:value用于指定字符串或基本数据类型
ref用于设置属性引用某个实例
如果Bean1实例化前要求Bean2必须先实例化,可以设置如下:
自动绑定:
自动绑定是指不用使用<value><ref><bean class="">标签来显式指定属性引用某对象或值,而让容器自动将符合Bean中属性
类型的其他Bean实例绑定到属性上。这虽然简化了配置,但是可读性减弱,不鼓励使用。在spring 2.0以后,自动绑定就做了限制,不支持
字符串、基本类型、类(简单类型的数组)的自动绑定。
集合对象的设置:
对数组、java.util.List、java.util.Set、java.util.Map、java.util.Properties等集合对象的注入,如下:
使用util标签简化,如下:
Look Up 方法注入
如上,类MessageManager中的方法createMessage可以为抽象没有实现的,如果类中调用此方法,则返回sysMessage实例。
多个bean定义文件读取
ApplicationContext可以读取多个Bean定义文件,
也可以在配置文件中进行设置,代替代码中的实现