我的学习思路

  • 装配方式 + 依赖注入

  • 设计理念

  • BeanDefintion scope beanClass lazy-init method constructor

  • BeanDefintionMap 注册 BeanFactoryRegistry

  • 注解如何解析,如何注册 BeanFactoryPostProcessor

  • beanFactory.getBean("user") singletonObject 单例对象池

  • bean的构建过程 new--属性填充--init

  • bean的循环依赖

  • beanPostPrecessor后置处理器的9次调用

  • AOP init的后置方法里调用的后置处理器

  • 声明式事务 MethodInterceptor

  • WEB DispatherServlet#doDispath

  • Spring扩展点 --IOC的扩展点:

  • BeanFactoryPostProcessor

  • beanPostPrecessor

  • @Import

  • ApplicationListener

  • SmartLiftCycle

这个是我准备的Spring的学习计划,当然也是老师给我的,Spring的源码我准备了一个多月了,还有挺多细节的东西还是无法掌握,但是大致的点都能够懂,总体上有个大致的框架思路。

环境准备

  • Spring Framework5.2
  • JDK1.8
  • IDEA2019.1.3
  • Maven3.6
  • Gradle4.10.2

整一套Sping的环境基础搭建就这几个,这些环境搭建细节就不一一说明,自行百度。具体构建Sping的环境可以留意我的上期的博客,期间的构建问题会出现很多不一样的问题,遇到问题可以留言,能解决的话可以帮你看看。

整体的环境

image.png

图片为gradle环境搭建成功,左侧会出现小蓝色的图标,右侧的模块会展示出现gradle图标。

新建learn-ioc5的模块

image.png

learn-ioc5的模块的用于后面Debug的测试模块,下面是搭建过程:

File->New->Module

image.png

Gradle->ModuleSDK->Java->Next

选择新建的模块为gradle,SDK就是本地的Java环境(前提是idea安装了gradle和jdk)

image.png

New Module

点击模块的继承

image.png

输入ArtifactId为learn-ioc5

image.png

等待完成构建,大约需要3到4分钟。会构建成功出现一个空的module。

创建完成后打开build.gradle, 引入依赖jar

compile(project(":spring-context"))

plugins {
    id 'java'
}

group 'org.springframework'
version '5.2.0.BUILD-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile(project(":spring-context"))
}

在src->main->java下新建好对应的包,目前我们用到的几个:

com.xuchang.bean

package com.xuchang.bean;

public class Fox {

}
package com.xuchang.bean;

public class Cat {

    public  Cat(){
        System.out.println("new Cat()");
    }
}

com.xuchang.config

package com.xuchang.config;

import com.xuchang.bean.Fox;
import com.xuchang.bean.MyImportBeanDefinitionRegistrar;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(MyImportBeanDefinitionRegistrar.class)
@ComponentScan("com.xuchang")
public class AppConfig {

    // method bean   method.invoke
    @Bean
    public Fox fox(){
        return new Fox();
    }
}

·
MyImportBeanDefinitionRegistrar是我定义的BeanDefinition的注册器,未使用到的话可以去掉。

src->main->test->java


import com.xuchang.bean.Cat;
import com.xuchang.config.AppConfig;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IOCTest {

    @Test
    public void test(){

        // ioc容器
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        //NoSuchBeanDefinitionException
        // BeanDefinition   bean定义  承载bean的属性   init-method  scope
        // BeanDefinitionRegistry 注册器
        // registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
        // BeanDefinitionMap    key(beanName)  value: BeanDefinition(Fox.class)
        // beanFactoryPostProcessor
        BeanFactory beanFactory = ((AnnotationConfigApplicationContext) context).getDefaultListableBeanFactory();
        // 注册 Cat.class 的beanDefinition
        // 实现了 BeanDefinitionRegistry   BeanFactory
        BeanDefinition beanDefinition = new RootBeanDefinition(Cat.class);
        ((DefaultListableBeanFactory) beanFactory).registerBeanDefinition("cat",beanDefinition);

        // singletonObjects   map 缓存单例bean  beanName---singletonObject
        Cat cat = new Cat();
        ((DefaultListableBeanFactory) beanFactory).registerSingleton("cat",cat);

        System.out.println(context.getBean("fox"));

    }

}

总结

基本的环境和大致的流程都已经实现,运行测试类没有报错基本上Spring的环境已经准备好了。

后面留意:装配方式 + 依赖注入和设计理念

作者:xuchang_2020
链接:
https://juejin.cn/post/6844903632136224782