文章内容
0.Spring整体特性
1.Bean组件的介绍
2.Bean的定义、创建、解析
3.Bean的使用
0.Spring整体特性
Spring的整体架构可划分为两部分:核心组件和特性功能;
其中核心组件功能包括Core、Bean、Context,Core在Spring框架中用于提供基础操作的工具组件;Bean则用于封装Object来进行一系列操作和管理;Context是一个Bean关系的集合,也叫Ioc容器;
特性功能包括AOP、JDBC、Transaction等,主要是基于Spring三大核心组件之上实现的机制;
1.Bean组件的介绍
Bean作为Spring框架中最重要的组件,正是由于Bean的定义和实现才使得Spring可以实现Bean的自动创建和注入,简化了日常开发过程中对依赖关系的维护,都交由Spring来完成;
Bean是对Object的封装,使得Object的创建、销毁、具体操作都可以通过统一的接口来完成;
2.Bean的定义、创建、解析
2.1.Bean的定义
定义接口:org.springframework.beans.factory.config.BeanDefinition
从接口包含的方法可以看出,Bean封装了Object的类名、依赖、构造函数以及相关的配置信息(模式和作用域等);
2.2.Bean的创建
Spring Bean 的创建时典型的工厂模式,顶级接口是BeanFactory;
非顶级的BeanFactory,如ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory;
需要说明的是,这些非顶级的接口定义了新生成的Bean的不同方便的特性;例如,如果这个Bean是由实现了ListableBeanFactory接口的BeanFactory生成的,那么他是可列表的,如果这个BeanFactory还实现了AutowireCapableBeanFactory,那么这个Bean将有自己的装配规则;而在默认情况下,BeanFactory的最终实现类为DefaultListableBeanFactory,而它实现了所有接口,所以通过默认的BeanFactory产生的Bean具有Bean的几乎所有特性
默认BeanFactory实现:org.springframework.beans.factory.support.DefaultListableBeanFactory
分析其中通过类类型获取Bean的方法:
(Assert是一个可以借鉴的设计,文章最后介绍)
public <T> T getBean(Class<T> requiredType) throws BeansException {
//字段验证
Assert.notNull(requiredType, "Required type must not be null");
//获取Bean的名称
String[] beanNames = getBeanNamesForType(requiredType);
if (beanNames.length > 1) {
ArrayList<String> autowireCandidates = new ArrayList<String>();
for (String beanName : beanNames) {
if (getBeanDefinition(beanName).isAutowireCandidate()) {
autowireCandidates.add(beanName);
}
}
if (autowireCandidates.size() > 0) {
beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]);
}
}
if (beanNames.length == 1) {
return getBean(beanNames[0], requiredType);
}
else if (beanNames.length == 0 && getParentBeanFactory() != null) {
return getParentBeanFactory().getBean(requiredType);
}
else {
throw new NoSuchBeanDefinitionException(requiredType, "expected single bean but found " +
beanNames.length + ": " + StringUtils.arrayToCommaDelimitedString(beanNames));
}
}
//逐层向上分析
//AbstractBeanFactory::---->getBean()--->doGetBean()--->getSingleton()--->默认Singleton模式,通过返回的实例是否为null判断是否获取Prototype实