Bean的顶层接口是BeanFactory,在源码的位置是
/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
DefaultListableBeanFactory实现了所有的接口。但是为什么需要定义这么多的接口?为了区分在spring的内部对象的传递和转化过程中,对对象的数据访问所做的限制。ListableBeanFactory表示这些bean是可列表的,HierarchicalBeanFactory表示这些bean是有继承关系的,AutowireCapableBeanFactory定义这些bean的自动装配规则。
核心是RootBeanDefinition,在源码的位置是
/spring-framework/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java
当spring成功的解析了一个
<bean></bean>
中定义的节点后,在spring的内部被转化成BeanDefinition对象。以后所有的操作都是基于这个对象的
Bean的解析主要是对spring的配置文件的解析。
Bean在spring中的作用就像OOP对于java的作用,没有bean就没有spring存在的意义。
spring解决了一个重要的问题,把对象之间的依赖关系转用配置文件来管理,也就是依赖注入机制。依赖注入在spring的IOC容器中进行管理,而IOC容器的主要操作对象就是bean。
下面是BeanFactory的源码,在BeanFactory里只对IOC容器的基本行为作了定义,至于如何产生具体的bean,由BeanFactory的实现类具体来实现。
public interface BeanFactory {
/**
* 这里是对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象, 如果需要得到工厂本身,需要转义
*/
String FACTORY_BEAN_PREFIX = "&";
//这里根据bean的名字,在IOC容器中得到bean实例,这个IOC容器就是一个大的抽象工厂。
Object getBean(String name) throws BeansException;
//这里根据bean的名字和Class类型来得到bean实例,如果根据名字取得的bean实例的Class类型和需要的不同的话,它会抛出异常
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//这里提供对bean的检索,看看是否在IOC容器有这个名字的bean
boolean containsBean(String name);
//这里根据bean名字得到bean实例,并同时判断这个bean是不是单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//判断给定名字的bean是不是Prototype
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
//判断给定名字的bean是否与给定的类型相匹配
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//这里对得到bean实例的Class类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/weiyongxuan/article/details/47213231