spring源码 创建bean的过程(仅供笔记)

//getBean方法,获取单例bean:
1.   public Object getBean(String name, Object... args) throws BeansException {
//参数含义见底下的方法
        return this.doGetBean(name, (Class)null, args, false);
    }
    //传进来的beanName
 2.    protected  T doGetBean(String name, Class requiredType, final Object[] args, boolean typeCheckOnly)
 //解析beanName
 //	调用getSingleton(String beanName),
 调用defaultsingletonbeanreregistry类中的getSingleTon(){
 //这个singletonObejcts 在类中有定义,见下图
private final Map singletonObjects = new ConcurrentHashMap(64);
//这一步已经拿到了实例,剩下的就是一系列安全检查之类的,主要过程已经晚了
   Object singletonObject = this.singletonObjects.get(beanName);
 }

3.singletonObjects 被定义为一个final 的map,存放着所有初始化时创建的单例实例,包括配置的和注解的spring源码 创建bean的过程(仅供笔记)_第1张图片
4.所有的bean工厂最终的实现类都是defaultListableBeanFactory
5.spring 容器启动时可以分解成两部分,第一部分为元数据的加载,第二部分即为bean的实例化,
6.解析生成beanFactory时会先将bean的所有name拿到
7.生成非单例bean(单例生成的方式应该差不多)的过程

    protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) {
  ...
  //调用方法
            instanceWrapper = this.createBeanInstance(beanName, mbd, args);
        }
        //方法摘要
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
//首先反射获得beanName对应的bean的class
        Class beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);

8
createbean. Docreatebean最终落实在createBeanInstance方法,其中层层调用,最终用不管构造方法有参还是无参都是通过constructor.newInstance创建实例
9.https://blog.csdn.net/finalcola/article/details/81451019反射创建实例的过程

你可能感兴趣的:(spring)