Spring规定所有的IOC容器都必须实现BeanFactory接口,
BeanFactory是一个顶级的容器接口。
BeanFactory
BeanFactory里有一个特殊的属性,String FACTORY_BEAN_PREFIX = "&";
这个用来获取FactoryBean本身的实例。注意FactoryBean和BeanFactory是完全不一样的两个东西 。
BeanFactory是容器的顶级 接口,定义了Bean工厂的一些操作方法。比如根据名字获取实例,根据类型获取实例==。
而FactoryBean也是一个接口,实现该接口的类实现 getObject
方法来 生成一个Bean.工厂类也是一个类,他的作用是用来生成我们需要的其他的类,而不是注入到其他地方。
Spring在初始化的时候,会把这个接口的实现类给取出来,调用getObject
来生成我们想要的Bean.
例子 :
public class UserFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
<bean class="com.fuyouj.model.factory.UserFactoryBean" id="userFactoryBean"></bean>
可以看到,使用了转义字符的名称获取到的是工程类的本身。
BeanFactory的继承体系
ListableBeanFactory
正如该接口的名字表达的意思,该接口定义了一列表的形式提供Bean的相关信息,这个接口最大的特点就是可以批量列出工长生产的实例信息 。
方法getBeanDefinitionCount
获取该容器内注册的Bean的总数,getBeanDefinitionNames
获取BeanDefinition名字的集合==。
HierarchicalBeanFactory
此接口使得容器具备层次的关系
简单的两个方法,一个是返回本工厂的父工厂,一个是在本层级内查找是否有某个Bean.
实现了本 接口的容器可以在应用中起多个BeanFactory,并且可以设置父子关系关联起来。这样子就可以很好地适配三层架构,比如可以 让A容器管理控制层的Bean,B容器管理业务层的Bean.然后通过层级关系关联起来。
AutowireCapableBeanFactory
赋予了容器具备自动装配Bean的能力(自动满足Bean之间的依赖)
里面定义了5种常量,
我们使用的最多的就是现成的@Autowired标签,该注解最终注入的方式是通过 resolveDependency
来实现的依赖注入。而该接口里面定义的5中常量对应着我们日常使用注入的几种方式。
DefaultListableBeanFactory
DefaultListableBeanFactory是真正第一个可以独立运行的IOC容器
实现了BeanDefinitionRegistry接口,顾名思义,可以注册BeanDefinition.
在本类中,有一个醒目的成员变量。BeanDefinitionMap,存放的是本容器内BeanDefinition