1.1 IOC容器初始化过程之构造函数

以AnnotationConfigApplicationContext来学习ioc容器的初始化过程

AnnotationConfigApplicationContext的构造函数

public AnnotationConfigApplicationContext(Class... annotatedClasses) {
        this();
        register(annotatedClasses);
        refresh();
}

this()函数调用默认构造函数

public AnnotationConfigApplicationContext() {
        // 给容器添加注解型bean配置信息的阅读器
        this.reader = new AnnotatedBeanDefinitionReader(this);
        // 添加类路径下的bean配置类的扫描器
        this.scanner = new ClassPathBeanDefinitionScanner(this);
}
  • register()方法
public void register(Class... annotatedClasses) {
        Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");
        //调用AnnotatedBeanDefinitionReader的register方法
        this.reader.register(annotatedClasses);
    }
  • 进入到AnnotatedBeanDefinitionReader的register方法里面
    public void register(Class... annotatedClasses) {
        for (Class annotatedClass : annotatedClasses) {
            // 该循环就是先将配置的config类信息优先加载进去
            registerBean(annotatedClass);
        }
    }

例如:

public static void main(String [] args) {

    ApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class, SecondConfig.class);
    Person person = (Person) context.getBean(Person.class);
    Cat cat = (Cat) context.getBean(Cat.class);
    log.info(person.toString());
    log.info(cat.toString());
  }

当显式创建一个容器,传递容器的配置类则会优先将MainConfig.class和SecondConfig.class这两个类的BeanDefinition优先加载到容器的一个Map里

registerBean方法真实调用doRegisterBean方法()

 void doRegisterBean(Class annotatedClass, @Nullable Supplier instanceSupplier, @Nullable String name,
            @Nullable Class[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {

        // 将配置类包装成AnnotatedGenericBeanDefinition的类型
        AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
        // 是否跳过, @Condition注解(解析改注解类是否需要被注册在容器里)
        if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
            return;
        }

        abd.setInstanceSupplier(instanceSupplier);
        // 解析bean的范围,如request_session、singleton等
        ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
        abd.setScope(scopeMetadata.getScopeName());
        // 决定系统内的BeanName ,如在@Bean注解上用@value或@name等注解,则beanName就是该值,否则返回方法名作为beanName
        String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

        // 处理bean的通用注解信息,比如bean是否是懒加载,是否被@Primary标注,dependsOn是什么,解析出来
        AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
        if (qualifiers != null) {
            for (Class qualifier : qualifiers) {
                if (Primary.class == qualifier) {
                    abd.setPrimary(true);
                }
                else if (Lazy.class == qualifier) {
                    abd.setLazyInit(true);
                }
                else {
                    abd.addQualifier(new AutowireCandidateQualifier(qualifier));
                }
            }
        }
        // 定制beanDefinition的属性,比如是否改为lazy-init 是否为primary等
        for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
            customizer.customize(abd);
        }
        // 装在BeanDefinition的类
        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
        definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
        // 真正去注册beanDefinition的地方
        BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
    }

进入registerBeanDefinition()方法里

public static void registerBeanDefinition(
            BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
            throws BeanDefinitionStoreException {

        String beanName = definitionHolder.getBeanName();
        // BeanDefinitionRegistry类是一个接口,里面定义了一些通用的方法,比如registerBeanDefinition,
        // removeBeanDefinition等方法,就是对一个beanDefinition的增删改查
        registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());

        // Register aliases for bean name, if any.
        String[] aliases = definitionHolder.getAliases();
        if (aliases != null) {
            for (String alias : aliases) {
                // 注册该bean的别名
                registry.registerAlias(beanName, alias);
            }
        }
    }

最后的registerBeanDefinition的最终实现是在DefaultListableBeanFactory里面实现的

@Override
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException {

        Assert.hasText(beanName, "Bean name must not be empty");
        Assert.notNull(beanDefinition, "BeanDefinition must not be null");
        // 注册前验证bean是否合法
        if (beanDefinition instanceof AbstractBeanDefinition) {
            try {
                ((AbstractBeanDefinition) beanDefinition).validate();
            }
            catch (BeanDefinitionValidationException ex) {
                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
                        "Validation of bean definition failed", ex);
            }
        }

        BeanDefinition oldBeanDefinition;

        // 现在装在beanDefinition的map里面查看是否有旧的definition信息
        oldBeanDefinition = this.beanDefinitionMap.get(beanName);
        if (oldBeanDefinition != null) {
            if (!isAllowBeanDefinitionOverriding()) {
                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
                        "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
                        "': There is already [" + oldBeanDefinition + "] bound.");
            }
            else if (oldBeanDefinition.getRole() < beanDefinition.getRole()) {
                // e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
                if (this.logger.isWarnEnabled()) {
                    this.logger.warn("Overriding user-defined bean definition for bean '" + beanName +
                            "' with a framework-generated bean definition: replacing [" +
                            oldBeanDefinition + "] with [" + beanDefinition + "]");
                }
            }
            else if (!beanDefinition.equals(oldBeanDefinition)) {
                if (this.logger.isInfoEnabled()) {
                    this.logger.info("Overriding bean definition for bean '" + beanName +
                            "' with a different definition: replacing [" + oldBeanDefinition +
                            "] with [" + beanDefinition + "]");
                }
            }
            else {
                if (this.logger.isDebugEnabled()) {
                    this.logger.debug("Overriding bean definition for bean '" + beanName +
                            "' with an equivalent definition: replacing [" + oldBeanDefinition +
                            "] with [" + beanDefinition + "]");
                }
            }
            // 覆盖之前的BeanDefinition信息
            this.beanDefinitionMap.put(beanName, beanDefinition);
        }
        else {
            // beanDefinitionMap里面没有当前要注册的definition信息,所以开始将这个信息put进去
            if (hasBeanCreationStarted()) {
                // Cannot modify startup-time collection elements anymore (for stable iteration)
                synchronized (this.beanDefinitionMap) {
                    this.beanDefinitionMap.put(beanName, beanDefinition);
                    List updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
                    updatedDefinitions.addAll(this.beanDefinitionNames);
                    updatedDefinitions.add(beanName);
                    this.beanDefinitionNames = updatedDefinitions;
                    if (this.manualSingletonNames.contains(beanName)) {
                        Set updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);
                        updatedSingletons.remove(beanName);
                        this.manualSingletonNames = updatedSingletons;
                    }
                }
            }
            else {
                // Still in startup registration phase
                this.beanDefinitionMap.put(beanName, beanDefinition);
                this.beanDefinitionNames.add(beanName);
                this.manualSingletonNames.remove(beanName);
            }
            this.frozenBeanDefinitionNames = null;
        }

        if (oldBeanDefinition != null || containsSingleton(beanName)) {
            resetBeanDefinition(beanName);
        }
    }

最终将beanDefinition装在容器维护的一个beanDefinitionMap里面

你可能感兴趣的:(1.1 IOC容器初始化过程之构造函数)