spring整套源码系列之【ioc加载流程源码分析】
2024-04-10 18:46:19 0 举报
spring整套源码系列之【ioc加载流程源码分析】
作者其他创作
大纲/内容
注册了处理@Autowired 注解的处理器AutowiredAnnotationBeanPostProcessor
// 第四:留个子类去实现该接口\t\t\t\tpostProcessBeanFactory(beanFactory);
setMessageSource
InstantiationAwareBeanPostProcessorbean后置处理器
(3)
注册配置类的bean定义
ApplicationContextAwareProcessor postProcessBeforeInitialization
否
构造方法里
// 初始化 bean,这个过程其实是调用 createBean() 方法singletonFactory.getObject();
说明
一系列的后置处理器跟事件
invokeAwareMethods()
//注册一些配置的后置处理器\t\tAnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
(2)
不需要创建
结束
setEmbeddedValueResolver
BeanFactoryAware
回调传入的方法
BeanPostProcessorbean后置处理器
后置处理器执行MergedBeanDefinitionPostProcessor
代表方法里面
这里如果我们设置了一个bean需要另外一个bean之前创建就在这里处理(dependsOn)
//调用构造函数this();AnnotationConfigApplicationContext()构造函数
doCreateBean()开始bean生命周期
setApplicationEventPublisher
init
setBeanFactory
这个方法同样的很复杂,这里也不进入看,反正就是通过反射或工厂创建实例
只是
代表同一个方法里
后面那个参数是一个对象,只是把实现方法写在内部而已,这个getSingleton()里面会调用我们传入的对象的方法
postProcessAfterInitialization
创建了读取配置类的对象用来读取配置AnnotatedBeanDefinitionReader(this);
可直接返回bean,停止创建AOP解析切面
实现这个接口重写postProcessBeforeInstantiation()方法就会直接返回我们返回的bean
//获取我们容器中所有bean定义的名称\t\tList<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
MessageSourceAware
new AnnotationConfigApplicationContext(MainConfig.class)入口,通过配置类方式获取applicationContext上下文
// 创建事件多播器\t\t\t\tinitApplicationEventMulticaster();
此处scanner实例不作为配置类中的扫描实例,此实例是给applicationContext单独去扫描包的,也就是我们可以不指定配置类然后直接context.scan(\"自己添加需要扫描包路径\");这种方式去扫描类,才会用到这个对象
BeanClassLoaderAware
doGetBean(...)
postProcessBeforeInstantiation()
// 这个方法同样也是留个子类实现的springboot也是从这个方法进行启动tomat的.\t\t\t\tonRefresh();
第二个参数传入的对象createBean方法
根据bean定义判断是不是抽象的&& 不是单例的 &&不是懒加载的
通过配置指定的方法
postProcessAfterInstantiation()
setBeanName
首先会调用父类GenericApplicationContext的无参构造函数
ApplicationContextAware
//尝试去缓存中获取对象 Object sharedInstance = getSingleton(beanName);当然我们在ioc加载阶段是拿不到的
这个方法里面有12个重要的方法,这里只是分析ioc加载流程所以不会每个都深入进去
setEnvironment
这里有一个FactoryBean,如果我们的bean实现了FactoryBean接口,那么直接返回我们自己的getObject
调用
afterPropertiesSet
DefaultListableBeanFactory有BeanFactory跟BeanDefinitionRegistry能力
// 初始化国际化资源处理器.\t\t\t\tinitMessageSource();
有
postProcessBeforeInitialization()
是
可以看到是一个bean工厂后置处理器、bean定义注册器后置处理器
被注解标注的方法
init-method
bean创建完成
//IOC容器刷新接口,特别重要的一个方法 refresh();
postProcessAfterInitialization()
BeanPostProcessors
这个方法会循环bean定义,调用getBean,是bean的生命周期体现
//实例化我们剩余的单实例bean.\t\t\t\tfinishBeanFactoryInitialization(beanFactory);
初始化
初始化后AOP:创建代理
很重要的一个方法,只要你用spring都会跑这个方法去,可以说学习spring源码就是学这个方法
注册了bean工厂后置处理器ConfigurationClassPostProcessor
InitializingBean
ServletContextAware
入口
BeanNameAware
这些后置处理器都非常重要!在我们Bean的创建过程中起着至关重要的作用, 属于开Bean元勋.
setBeanClassLoader
@PostContruct
//冻结所有的 bean 定义 , 说明注册的 bean 定义将不被修改或任何进一步的处理beanFactory.freezeConfiguration();也就是设置configurationFrozen = true;说明bean已经在创建中不能被其他修改
初始化前调用@PostContruct
填充属性
// 注册我们bean的后置处理器 registerBeanPostProcessors(beanFactory);
getSingleton()
代表说明
在这个类中,会解析加了@Configuration的配置类,还会解析@ComponentScan、@ComponentScans注解扫描的包,以及解析@Import等注解。
setResourceLoader
(1)
createBean()
//非工厂Bean 就是普通的beangetBean(beanName);
这里是配置类的方式就是通过后置处理器进行扫描以及创建bean定义,如果是xml形式的是耦合在一起的,耦合在构造函数中
//把我们的事件监听器注册到多播器上\t\t\t\tregisterListeners();
setServletContext
setApplicationContext
this.beanFactory = new DefaultListableBeanFactory();创建了一个BeanFactory对象
ResourceLoaderAware
EnvironmentAware
会调用bean工厂后置处理器
EmbeddedValueResolverAware
//实例化剩余的单实例bean\t\tbeanFactory.preInstantiateSingletons();
创建我们的classPath类型的bean定义扫描器ClassPathBeanDefinitionScanner(this)
//1:准备刷新上下文环境\t\t\tprepareRefresh();
//3:对bean工厂进行填充属性\t\t\tprepareBeanFactory(beanFactory);
循环我们所有的bean定义对象
没有
//2:获取告诉子类初始化Bean工厂\t\t\tConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
isFactoryBean(beanName)
// 最后容器刷新 发布刷新事件(Spring cloud也是从这里启动的)\t\t\t\tfinishRefresh();
ApplicationEventPublisherAware
// 调用我们的bean工厂的后置处理器. invokeBeanFactoryPostProcessors(beanFactory);
处理dependsOn的依赖(这个不是我们所谓的循环依赖 而是bean创建前后的依赖)
这个代码很深,不是我们这里所需要深入的。这个会执行我们的后置处理器,spring就是通过后置处理器将我们扫描出来的类全部创建成bean定义对象并且放到beanDefinitionMap中供BeanFactory使用
实例化
//注册我们的配置类 register(annotatedClasses);
0 条评论
下一页