简单解析Spring核心IOC容器原理

将大体流程解析了一边,具体可以看源代码一个方法一个方法的跟下

XmlBeanFactory的功能是建立在DefaultListableBeanFactory这个基本容器的基础上的,并在这个基本容器的基础上实行了其他诸如XML读取的附加功能。

DefaultListableBeanFactoryBeanFactory的一个默认实现类。

public class XmlBeanFactory extends DefaultListableBeanFactory {
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    
    /**
     * Resource是Spring中对与外部资源的抽象,最常见的是对文件的抽象,特别是XML文件。
     * 而且Resource里面通常保存了Spring使用者的Bean定义
     * 比如applicationContext.xml在被加载时,就会被抽象为Resource来处理。
     */
    public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, null);
    }
    
    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader.loadBeanDefinitions(resource);
    }
}

简单示例:

public class MySimpleBeanFactory {
    public static void main(String[] args) {
        ClassPathResource resource = new ClassPathResource("META-INF/beans.xml");
        BeanFactory beanFactory = new XmlBeanFactory(resource);
        User user = beanFactory.getBean("user1", User.class);
        System.out.println(user.getName()+" : "+user.getAge());
    }
}

创建容器的步骤:

  1. 创建bean配置文件的抽象Resource
  2. 创建BeanFactory,例如:XmlBeanFactory
  3. 解析Bean,创建一个BeanDefinition读取器,例如:XmlBeanDefinitionReader->DefaultBeanDefinitionDocumentReader->BeanDefinitionParserDelegate
  4. 得到BeanDefinition后注册到DefaultListableBeanFactory中:
// 最后BeanDefinition就是放到这个map里的
Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);

以后会慢慢完善。

猜你喜欢

转载自www.cnblogs.com/liycode/p/9356384.html