白话Spring源码(四):BeanFactory

一、什么是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();

}

猜你喜欢

转载自blog.csdn.net/haoxin963/article/details/84894396