我的学习思路
装配方式 + 依赖注入
设计理念
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的环境可以留意我的上期的博客,期间的构建问题会出现很多不一样的问题,遇到问题可以留言,能解决的话可以帮你看看。
整体的环境
图片为gradle环境搭建成功,左侧会出现小蓝色的图标,右侧的模块会展示出现gradle图标。
新建learn-ioc5的模块
learn-ioc5的模块的用于后面Debug的测试模块,下面是搭建过程:
File->New->Module
Gradle->ModuleSDK->Java->Next
选择新建的模块为gradle,SDK就是本地的Java环境(前提是idea安装了gradle和jdk)
New Module
点击模块的继承
输入ArtifactId为learn-ioc5
等待完成构建,大约需要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