Spring中bean的创建

针对Spring中bean的创建在很多面试中出现。下面我来总结一下,大家都能看的懂的,大白话写好;

其实简单来说,Spring中bean的创建可以总结为:就是对象通过xml定义好,然后通过java的反射机制new出对象,最后放在一个map里,想用就就从map里get出来。

下面从内层到外层的顺序来说一下;

1. 加载XML文件,封装成Resource对象
2. 调用Reader对象方法读取XML文件内容,并将相关属性放到BeanDefinition实例
3. 将BeanDefinition对象放到BeanFactory对象
下面我就通过一个例子来给大家说一下:

一共三个工具:一个application.xml,一个bean,一个测试工具类

分别是:

application.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
  3.  
    <beans>
  4.  
    <bean id="myBean" class="com.hushenjian.MyBean"></bean>
  5.  
    </beans>

bean:

 
  1. public class MyBean{
  2.  
    public void getName(String name) {
  3.  
    System.out.println("我的名字是:" + name);
  4.  
    }
  5.  
    }

一个测试类:


  1. public class MyTest {
  2.  
     
  3.  
    public static void main(String[] args) {
  4.  
    ClassPathResource res = new ClassPathResource("applicationContext.xml");
  5.  
     
  6.  
    XmlBeanFactory bf = new XmlBeanFactory(res);
  7.  
     
  8.  
    MyBean bean = (MyBean)beanFactory.getBean("myBean");
  9.  
     
  10.  
    bean.getName("高");
  11.  
    }
  12.  
    }

c从上面测试类打印的结果为“我的名字是:高”。

(一)获取配置文件:ClassPathResource res = new ClassPathResource("applicationContext.xml") 

Spring中有很多Resource这里简要处理说明,这里获取了配置文件;

(二)解析配置文件并注册成bean:

这里其实内部处理非常复杂,真正的过程是:将配置文件application.xml中的bean信息解析到BeanDefinition中,然后通过beanFactory的实现类注册到工厂的map中,这样就形成了我们的bean的工厂了;获取时getBean(类名)就行了;

内部处理详细过程为(网上总结的):

    a. 构造XmlBeanFactory时,会调用Reader对象的loadBeanDefinitions方法去加载bean定义信息

    b. 在Reader对象的doLoadBeanDefinitions验证文档(配置文件)模式,然后通过documentLoader对象处理资源对象,生成我们Document对象;
    c. 调用BeanDefinitionDocumentReader对象的doRegisterBeanDefinitions去注册bean定义信息;
    d. parseBeanDefinitions从xml文档根节点递归循环处理各个节点,对bean节点真正的处理工作委托给了BeanDefinitionParserDelegate,方法parseBeanDefinitionElement将一个bean节点转换成一个BeanDefinitionHolder对象,这才是最终的解析过程;
    e. DefaultListableBeanFactory.registerBeanDefinition利用解析好的beanDefinition对象完成最终的注册,其实就是把beanName和beanDefinition作为键值对放到beanFactory对象的map;

(三)最后就是直接通过getBean()直接实例化bean了;

 

posted @ 2020-10-20 15:33  瞌睡青年  阅读(175)  评论(0)    收藏  举报