【一】Spring IoC 最全源码详解之 Spring容器创建流程

《圣经》旧约.创世纪:起初,神创造天地。地是空虚混沌,渊面黑暗; 神的灵运行在水面上。神说:“要有光。”就有了光。 神看光是好的,就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。

                                                                                                                                《圣经》旧约.创世纪

目录

1.什么是BeanDefinition?

2.Spring是如何使用BeanDefinition的呢?

3. Spring容器的初始化过程

3.1.无参构造函数

3.1.1 创建AnnotatedBeanDefinitionReader

3.1.2 创建ClassPathBeanDefinitionScanner


1.什么是BeanDefinition?

Spring的Bean具有自己的属性、构造函数参数和很多具体的相关信息。BeanDefinition是用来描述Bean的这些信息的。类似与Java世界中,class Class这个类用来描述各种对象一样。

在java项目中,用户定义的各种xx.java文件要让JVM认识,需要事先通过编译器将其编译成xx.class文件。然后再通过ClassLoader读取xx.class文件将其加载到JMM的方法区Method Area。

在Spring项目中,用户定义了可以让Spring管理的注解类(@Component, @Service, @Repository)。Spring容器初始时,Spring就通过AnnotatedBeanDefinitionReader去获取这些类的注解信息,并将其翻译整合到beanDefinitionMap、beanDefinitionNames两个数据结构的实体中,等待后续的bean实例化过程使用。

BeanDefinition是什么模样呢?

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

	String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
	String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
	int ROLE_APPLICATION = 0;
	int ROLE_SUPPORT = 1;
	int ROLE_INFRASTRUCTURE = 2;
	void setParentName(@Nullable String parentName);
	String getParentName();
	void setBeanClassName(@Nullable String beanClassName);
	String getBeanClassName();
	void setScope(@Nullable String scope);
	String getScope();
	void setLazyInit(boolean lazyInit);
	boolean isLazyInit();
	void setDependsOn(@Nullable String... dependsOn);
	String[] getDependsOn();
	void setAutowireCandidate(boolean autowireCandidate);
	boolean isAutowireCandidate();
	void setPrimary(boolean primary);
	boolean isPrimary();
	void setFactoryBeanName(@Nullable String factoryBeanName);
	String getFactoryBeanName();
	void setFactoryMethodName(@Nullable String factoryMethodName);
	String getFactoryMethodName();
	ConstructorArgumentValues getConstructorArgumentValues();
	default boolean hasConstructorArgumentValues() {
		return !getConstructorArgumentValues().isEmpty();
	}
	MutablePropertyValues getPropertyValues();
	default boolean hasPropertyValues() {
		return !getPropertyValues().isEmpty();
	}
	void setInitMethodName(@Nullable String initMethodName);
	String getInitMethodName();
	void setDestroyMethodName(@Nullable String destroyMethodName);
	String getDestroyMethodName();
	void setRole(int role);
	int getRole();
	void setDescription(@Nullable String description);
	String getDescription();
	boolean isSingleton();
	boolean isPrototype();
	boolean isAbstract();
	String getResourceDescription();
	BeanDefinition getOriginatingBeanDefinition();
}

从定义中可以看出,BeanDefinition (bd)可以记录bean的相关定义,比如bean父类关系,作用域scope,是否懒加载islazy,依赖对象,是否可以被自动注入isAutowireCandidate,是否是FactoryBean等等常见属性。

2.Spring是如何使用BeanDefinition的呢?

我们以注解方式编写的项目举例来说,首先还是定义几个类:

package com.Hodey.learn.bean;

import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Component("yadang")
public class Adam {

    private String name;

    @PostConstruct
    private void init(){
        name = "Adam";
    }

    public void sayHello(){
        System.out.println("你好,我是&#
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值