一、寻找外围办法

// == 入口public static void main(String[] args) {    SpringApplication.run(SpringRunner.class, args);}// == 调用链org.springframework.boot.SpringApplication#run(java.lang.Class<?>, java.lang.String...)org.springframework.boot.SpringApplication#run(java.lang.Class<?>[], java.lang.String[])org.springframework.boot.SpringApplication#run(java.lang.String...)org.springframework.boot.SpringApplication#refreshContextorg.springframework.boot.SpringApplication#refresh

记住refresh办法,它十分重要

察看它的外部实现:

// ##### IOC容器初始化 ##### // 告知子类要初始化BeanFactory// BeanDefinition信息的读取是在子类的refreshBeanFactory()办法里实现的ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();// 筹备bean工厂以在此上下文中应用。this.prepareBeanFactory(beanFactory);// ##### 驰名的九大办法 ##### try {    // 设置beanFactory的后置解决    postProcessBeanFactory(beanFactory);    // 调用beanFactory的后置解决,如springboot主动拆卸获取配置的Entity    invokeBeanFactoryPostProcessors(beanFactory);    // 注册beanFactory的后置解决    registerBeanPostProcessors(beanFactory);    // 初始化上下文的音讯    initMessageSource();    // 初始化高低的事件    initApplicationEventMulticaster();    // 初始化一些非凡的bean    onRefresh();    // 查看一些监听的bean并注册到容器中    registerListeners();    // Instantiate all remaining (non-lazy-init) singletons,spring bean对象初始化在这里    finishBeanFactoryInitialization(beanFactory);    // 公布容器事件,完结Refresh过程    finishRefresh();

二、注册和扫描

本节深入分析构建BeanFactory的过程。

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// == 调用链    org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactoryorg.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory// -- 剖析注解形式注入org.springframework.web.context.support.AnnotationConfigWebApplicationContext#loadBeanDefinitions

1.向容器注册对象信息

注入的实质就是向容器(也有叫上下文的,就是Context的直译)——本质就是一个Map注册类的形容信息

用代码形容就是:
beanDefinitionMap.put(BeanDefinition)

看看具体实现:

// == 注册逻辑protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {   AnnotatedBeanDefinitionReader reader = getAnnotatedBeanDefinitionReader(beanFactory);   if (!this.annotatedClasses.isEmpty()) {      reader.register(this.annotatedClasses.toArray(new Class<?>[this.annotatedClasses.size()]));   }}// == 调用链org.springframework.context.annotation.AnnotatedBeanDefinitionReader#registerorg.springframework.context.annotation.AnnotatedBeanDefinitionReader#registerBean(java.lang.Class<?>)org.springframework.context.annotation.AnnotatedBeanDefinitionReader#doRegisterBean

这个办法值得细说一下:

<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,            @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {    //## 被注解润饰的对象,会被封装成BeanDefinition构造    AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);    //为注解Bean定义生成Bean名称    String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));    // BeanDefinition再次封装    BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);    // ## 注入    BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);}// == 调用链org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition// -- 后面创立的工厂是DefaultListableBeanFactoryorg.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition

最终的注入逻辑:

// 存储注册信息的BeanDefinitionprivate final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)            throws BeanDefinitionStoreException {    // ## 注入的实质    this.beanDefinitionMap.put(beanName, beanDefinition);}

2.扫描指定package的配置信息

无它,只为扩充扫描范畴
默认只注入SpringRunner(Starter类)的子包

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {     //为容器设置类门路Bean定义扫描器   ClassPathBeanDefinitionScanner scanner = getClassPathBeanDefinitionScanner(beanFactory);   if (!this.basePackages.isEmpty()) {      scanner.scan(this.basePackages.toArray(new String[this.basePackages.size()]));   }}// == 调用链org.springframework.context.annotation.ClassPathBeanDefinitionScanner#scanorg.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScanprotected Set<BeanDefinitionHolder> doScan(String... basePackages) {    //遍历扫描所有给定的包    for (String basePackage : basePackages) {        // ## 同样执行注入流程        registerBeanDefinition(definitionHolder, this.registry);    }}

未完待续(懒癌发生……)