Spring依赖注入容器的核心就是BeanFactory。BeanFactory负责管理组件和组件的依赖。在Spring,任何由容器管理的组件都可以称作Bean。
应用是通过BeanFactory接口与Spring DI容器进行交互。在某些地方,你必须创建一个实现了BeanFactory接口的实现类的实例,用来管理bean和bean的依赖信息。这样,你就可以通过BeanFactory来访问Bean及进行进一步处理。有些情况下,这些步骤都是自动处理的。但是在大多数情况,你需要自己编码来实现。
虽然BeanFactory可以编程式的配置,但是更常见的是使用各种配置文件来外部化配置。
为了能够在BeanFactory内识别Bean,每个Bean都会分配一个名字。每个Bean至少该拥有一个名字,还可以拥有多个名字。Bean的任何第一个名字之外的名字都叫做Bean的别名。这样你就可以使用Bean的名字从BeanFactory中取回Bean,及建立依赖关系。
在BeanFactory的内部,任何Bean配置都会成为一个实现了BeanDefinition接口的类的实例。Bean配置不仅仅保存了它自身Bean的信息,而且还保存了它的依赖Bean的信息。同样,任何BeanFactory都需要实现BeanDefinitionRegistry接口。
我们可以从配置文件中读取BeanDefinition数据,使用PropertiesBeanDefinitionReader或XmlBeanDefinitionReader。这是两个实现了BeanDefinitionRegistry的BeanFactory的两个主要实现。PropertiesBeanDefinitionReader用于从Properties文件中读取Bean定义,而XmlBeanDefinitionReader用于从xml文件中读取Bean定义。选用哪种方式来配置Bean呢?xml还是properties文件。虽然,properties文件对于一些小型,简单的项目是非常好的。但是当需要处理大量的Bean时,你就会十分讨厌properties了。Xml配置就更好一些。
基于Spring的项目的非常关键的一步就是为你的应用创建一个BeanFacory配置文件。在这个配置文件中定义Bean的定义。
每一个Bean都使用<bean>标签定义在<beans>标签之下。
<bean>有两个必须的属性:id和class。Id属性代表Bean的默认的名字。Class属性指定Bean的具体类型,并且必须包括完整的类路径。<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE beans PUBLIC "-//LWC//DTD BEAN//EN" "lwc-beans.dtd">
<beans>
<bean id="userInfo" class="com.ang.userApp.dto.UserInfoDTO"/>
</beans>
package com.ang.test;
public class BeanWithDI {
public static void main(String[] args)throws Exception{
BeanFactory factory = getBeanFactory();
UserInfoDTO userInfo = (UserInfoDTO)factory.getBean("userInfo");
System.out.println(userInfo);
}
private static BeanFactory getBeanFactory()throws Exception{
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("com/ang/test/beans.xml"));
return factory;
}
}
上面的例子,我们并没有使用依赖注入的特性。我们来使用Setter方法注入,为UserInfoDTO在外部注入一些属性
<bean id="userInfo" class="com.ang.userApp.dto.UserInfoDTO">
<property name="userId">
<value>001</value>
</property>
<property name="userName">
<value>李四</value>
</property>
</bean>
注入组件
<bean id="beanOne" class="com.ang.test.BeanOne">
<property name="beanTwo">
<ref bean="beanTwo"/>
</property>
</bean>
<bean id="beanTwo" class="com.ang.test.BeanTwo"/>
注入集合