Bean工厂使用简单示例
pojo类
public class Student {
private String name;
private int age;
private String hobby;
// ellipsis get/set methods
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", hobby='" + hobby + '\'' +
'}';
}
}
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "https://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean class="org.springframework.custom.beans.Student">
<property name="name" value="john"/>
</bean>
</beans>
测试类
public class CustomTest {
@Test
public void testXmlFactory() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader definitionReader = new XmlBeanDefinitionReader(beanFactory);
ClassPathResource classPathResource = new ClassPathResource("spring.xml");
definitionReader.loadBeanDefinitions(classPathResource);
Student bean = beanFactory.getBean(Student.class);
System.out.println(bean);
}
}
不出意料打印了student信息
Student{name='john', age=0, hobby='null'}
核心类介绍
一、DefaultListableBeanFactory
通过对 beanFactory
的简单例子可以对其使用有了一定认识,接下来我们重点关注 示例中的 DefaultListableBeanFactory
类。
DefaultListableBeanFactory
是整个bean
加载的核心部分,是Spring
注册及加载bean
的默认实现,DefaultListableBeanFactory
继承了AbstractAutowireCapableBeanFactory
并实现了ConfigurableListableBeanFactory
以及BeanDefinitionRegistry
接口。下图是DefaultListableBeanFactory
的相关类图。
从上面的类图以及层次结构图中,我们可以很清晰地从全局角度了解DefaultListableBeanFactory
的脉络。如果读者没有了解过Spring
源码可能对上面的类图不是很理解,不过没关系,我会逐渐了解每个类的作用。那么,让我们先简单地了解图中各个类的作用。
AliasRegistry:定义对alias的简单增删改等操作。
public interface AliasRegistry {
void registerAlias(String name, String alias);
void removeAlias(String alias);
boolean isAlias(String name);
String[] getAliases(String name);
}
SimpleAliasRegistry:主要使用map作为alias的缓存,并对接口AliasRegistry进行实现。
SingletonBeanRegistry:定义对单例的注册及获取。
BeanFactory:定义获取bean
及bean
的各种属性。
DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry
各函数的实现。
HierarchicalBeanFactory:继承BeanFactory
,也就是在BeanFactory
定义的功能的基础上增加了对parentFactory
的支持。
BeanDefinitionRegistry:定义对BeanDefinition
的各种增删改操作。
FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry
基础上增加了对FactoryBean的特殊处理功能。
ConfigurableBeanFactory:提供配置Factory
的各种方法。
ListableBeanFactory:根据各种条件获取bean的配置清单。
AbstractBeanFactory:综合FactoryBeanRegistrySupport
和ConfigurableBeanFactory
的功能。
AutowireCapableBeanFactory:提供创建bean
、自动注入、初始化以及应用bean
的后处理器。
AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory
并对接口AutowireCapableBeanFactory
进行实现。
ConfigurableListableBeanFactory:BeanFactory
配置清单,指定忽略类型及接口等。
DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理。
二、XmlBeanDefinitionReader
XML配置文件的读取是Spring中重要的功能,因为Spring的大部分功能都是以配置作为切入点的,那么我们可以从XmlBeanDefinitionReader中梳理一下资源文件读取、解析及注册的大致脉络,首先我们看看各个类的功能。
ResourceLoader:定义资源加载器,主要应用于根据给定的资源文件地址返回对应的Resource。
BeanDefinitionReader:主要定义资源文件读取并转换为BeanDefinition
的各个功能。
EnvironmentCapable:定义获取Environment
方法。
DocumentLoader:定义从资源文件加载到转换为Document的功能。
AbstractBeanDefinitionReader:对EnvironmentCapable
、BeanDefinitionReader
类定义的功能进行实现。
BeanDefinitionDocumentReader:定义读取Docuemnt
并注册BeanDefinition
功能。
BeanDefinitionParserDelegate:定义解析Element
的各种方法。
XmlBeanDifinitionReader
中主要包含以下几步的处理。
-
通过继承自AbstractBeanDefinitionReader中的方法,来使用ResourLoader将资源文件路径转换为对应的Resource文件。
-
通过DocumentLoader对Resource文件进行转换,将Resource文件转换为Document文件。
-
通过实现接口BeanDefinitionDocumentReader的DefaultBeanDefinitionDocumentReader类对Document进行解析,并使用BeanDefinitionParserDelegate对Element进行解析。