一、BeanFactory和ApplicationContext接口的选择
ApplicationContext是BeanFactory的扩展,具备BeanFactory的所有能力和行为,并进行了扩展。
二、容器和Bean的基本原理
Spring中的Bean就是由Spring容器初始化、装载的Bean,Bean的定义和之间的相互依赖关系通过配置文件定义。
1.容器
BeanFactory接口就是Spring的IoC容器,负责管理Bean,职责包括:实例化,定位,配置这些Bean和管理他们之间的相互关系。Spring提供了很多该接口的实现,就是多种的管理Bean的方式,例如XMLBeanFactory,就是通过XML配置文件管理Bean。
(1)配置元数据
Spring通过读取元数据,实例化,配置,组装Bean,Spring提供三种方式配置元数据:XML格式,Java属性文件,Spring公共API实现。IoC容器可以通过多种途径加载元数据,例如Java文件系统,ClassPath等。
(2)实例化容器
Resource resource=new FileSystemResource("beans.xml");
BeanFactory factory=new XmlBeanFactory(resource);
或
ClassPathResource resource=new ClassPathResource("beans.xml");
BeanFactory factory=new XmlBeanFactory(resource);
或
ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml","applicationContext-part2.xml"});
BeanFactory factory=(BeanFactory)context;
(3)将配置文件拆分成多个
象上面的代码一样通过String数组加载多个配置文件,也可用import元素指定包含多个XML文件,放在<bean>元素之前用。
2.Bean的属性
(1)Bean命名
每个Bean有一个或多个id,id必须唯一,如果有多个id,其他的id被认为是别名,id和name构成标识符。
(2)Bean的别名
<alias>元素
3.实例化Bean
Spring容器通过反射机制实例化Bean,Spring不仅可以管理标准JavaBean,还可以管理任意类。
(1)用构造器来实例化
需要一个默认构造器
(2)用静态工厂方法实例化
需要指定factory-method属性指定静态工厂方法。
(3)使用实例工厂方法实例化
class属性为空,factory-bean属性指定工厂bean,factory-method属性指定该工厂的静态工厂方法。
4.使用容器
InputStream is=new InputStream("beans.xml");
BeanFactory factory=new XmlBeanFactory(is);
5.依赖
(1)注入依赖
setter注入:通过调用默认构造器或静态工厂方法实例化Bean后,通过调用setter方法注入对象。
构造器注入:通过构造器注入对象。
提倡使用setter注入,Spring容器创建时会验证Bean的配置,在Bean被创建之前,其属性不会被设置,对于Singleton Bean会在Spring容器创建时被实例化。
循环依赖,不能通过构造器注入依赖,可以用setter方法,Spring容器会在创建时检测循环依赖。被注入的Bean必须在注入前实例化完毕。
6.构造器参数解析
对于类型明确的构造器参数定义非常简单。特殊的一些可采用下列办法
(1)对于简单类型参数
可通过type属性指定参数类型。
(2)构造器参数的索引
可通过index属性指定是第几个参数,从0开始
7.Bean属性及构造器参数详解
(1)直接量(基本类型、String类型等)
<value>元素和<idref>元素,<idref>等同于<value>,但会多出对Bean的验证。如果被应用Bean在同意XML文件中,且Bean的名字就是Bean id,那么可以使用local属性
(2)引用其他Bean
三种形式:
<ref bean=""/>引用任何Bean
<ref local=""/>引用同一文件中的Bean
<ref parent="">引用父容器中的Bean
8.内部Bean
不需要有id和name属性
9.集合
通过<list/>、<set/>、<map/>及<props/>元素可以定义和设置与Java Collection类型对应的List、Set、Map及Properties的值。
(1)集合合并
(2)强类型集合(仅能在J2SE5.0以上版本使用)
10.Nulls
<null/>元素
11.简写形式
12.组合属性名称
13.方法注入
(1)Lookup方法注入