一、什么是BeanFactory
我们先学习Spring最核心的功能:IoC,控制反转又叫依赖注入,这概念是不是很难理解,这是出于商业的目的才起这么个高大上的概念,其实我们阅读源码后发现其实很简单:就是对象通过xml定义好,然后通过java的反射机制new出对象,最后放在一个map里,想用就就从map里get出来。我们很多时候是被概念吓住了。但是我们要开发出很稳定的,扩展性好的还是很不容易。
好了,我们先从最基础的BeanFactory开始吧!
BeanFactory是什么?这是个工厂模式,工厂模式就是我们不直接new一个对象,而是从工厂里取,工厂会创建给我们。
那BeanFactory就是我们不直接new一个bean,而是BeanFactory创建好返回给我们。
可能有人会问什么是bean啊?可能很多人一直在用,但不一定能回答上来
bean英文豆子的意思,我们知道java一种咖啡,那javabean就是咖啡豆,所以javabean就java中很基础的一个组件,注意这不是spring发明的,是jre自带的。
它通常具有如下特点:
- 这个Java类必须具有一个无参的构造函数
- 属性必须私有化。
- 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
为什么要这些规范呢?我们得要了解组件,国外的程序员喜欢用图像化的方式来做业务的开发,就是类似vb,.net的拖拖放放,然后修改属性和添加事件,这些可以拖拽的图形就是组件啦!现在国外还是有很多用图形化来生成java对象,开发业务的功能的。所以这些规范就方便创建对象,设置属性值,设置对象的依赖的。
javabean的demo
public class StudentsBean implements java.io.Serializable
{
private String firstName = null;
private String lastName = null;
private int age = 0;
public StudentsBean() {
}
public String getFirstName(){
return firstName;
}
public String getLastName(){
return lastName;
}
public int getAge(){
return age;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
}
二、BeanFactory的结构
beanFactory及子接口的结构图:
看到这边,我们是不是想起了设计模式原则里的接口隔离原则
Interface Segregation Principle(ISP):客户端不应该依赖它不需要的接口;类间的依赖关系应该建立在最小的接口上
这边清晰地定义了如下的体系:
根接口BeanFactory(基础容器)
第二层: 第三方集成,继承体系,遍历bean
第三层: 配置功能
第四层: 配置+迭代
具体源码如下:
1.BeanFactory源码,主要就是获取bean对象
public interface BeanFactory {
/**
* 通过名称获取bean对象
*/
Object getBean(String name) throws BeansException;
/**
* 通过名称获取bean对象,并验证bean的类型
*/
Object getBean(String name, Class requiredType) throws BeansException;
/**
* 是否包含改名称的bean
*/
boolean containsBean(String name);
/**
* 判断是否是单列
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 获取别名数组
*/
String[] getAliases(String name) throws NoSuchBeanDefinitionException;
}
2.HierarchicalBeanFactory :工厂可以分层,有父工厂
public interface HierarchicalBeanFactory extends BeanFactory {
/**
* 获取父级工厂
*/
BeanFactory getParentBeanFactory();
}
3.AutowireCapableBeanFactory :是工厂可以自动装配(设置类字段的值)
public interface AutowireCapableBeanFactory extends BeanFactory {
/**
* 按名称装配
*/
int AUTOWIRE_BY_NAME = 1;
/**
* 按类型装配
*/
int AUTOWIRE_BY_TYPE = 2;
/**
* 按构造发放装配
*/
int AUTOWIRE_CONSTRUCTOR = 3;
/**
* 首先会尝试使用constructor进行自动装配,如果失败再尝试使用byTypeegy
*/
int AUTOWIRE_AUTODETECT = 4;
/**
* 通过自动装配实例化对象
*/
Object autowire(Class beanClass, int autowireMode, boolean dependencyCheck)
throws BeansException;
/**
* 自动装配存在的对象的属性
*/
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException;
/**
* 初始化前执行的方法
*/
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String name)
throws BeansException;
/**
* 初始化后执行的方法
*/
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String name)
throws BeansException;
}
4.ListableBeanFactory:提供所有bean 实例的枚举,不再需要客户端通过一个个bean name查找.BeanFactory实现类预加载bean定义(如通过实现xml的工厂)需要实现这个接口.
public interface ListableBeanFactory extends BeanFactory {
/**
* 返回bean定义的数量
*/
int getBeanDefinitionCount();
/**
* 返回bean定义的名称数组
*/
String[] getBeanDefinitionNames();
/**
* 通过Class 返回bean定义名称数组
*/
String[] getBeanDefinitionNames(Class type);
/**
* 检查时候存在改名称的bean定义
*/
boolean containsBeanDefinition(String name);
/**
* 通过类型返回bean的实例
*/
Map getBeansOfType(Class type, boolean includePrototypes, boolean includeFactoryBeans)
throws BeansException;
}
5.ConfigurableBeanFactory :是工厂可以配置
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory {
/**
* 设置父级bean工厂
*/
void setParentBeanFactory(BeanFactory parentBeanFactory);
/**
* 注册自定义属性
*/
void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor);
/**
* 设置自动装配忽略的Class
*/
void ignoreDependencyType(Class type);
/**
* 增强bean初始化前后的操作
*/
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
/**
* 通过名称获取bean的定义
*/
BeanDefinition getBeanDefinition(String beanName) throws BeansException;
/**
* 注册bean的别名
*/
void registerAlias(String beanName, String alias) throws BeansException;
/**
* 注册单例
*/
void registerSingleton(String beanName, Object singletonObject) throws BeansException;
/**
* 销毁单例
*/
void destroySingletons();
}
6.ConfigurableListableBeanFactory: 集大成者,并增加预加载单例的方法
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, ConfigurableBeanFactory, AutowireCapableBeanFactory {
/**
* 预处理单例
*/
void preInstantiateSingletons();
}