本文共 4695 字,大约阅读时间需要 15 分钟。
bean的创建过程:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[]) org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#checkDependencies org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyPropertyValues org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#convertForProperty org.springframework.beans.TypeConverter#convertIfNecessary(java.lang.Object, java.lang.Class, org.springframework.core.MethodParameter) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods org.springframework.beans.factory.BeanNameAware#setBeanName org.springframework.beans.factory.BeanClassLoaderAware#setBeanClassLoader org.springframework.beans.factory.BeanFactoryAware#setBeanFactory org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods org.springframework.beans.factory.InitializingBean#afterPropertiesSet org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
1 FactoryBean
重写三个方法,一个getObject,getObjectType,isSingleton FactoryBean是懒加载的 factorybean对应的单例不是spring容器启动的时候生成的,是调用getBean的时候生成的。 spring启动后,会再单利池中增加一个以FactoryBean名字首字母小写为名称的bean 要获取factoryBean实例,在名称前面增加&符号获取bean后会调用getObjectForBeanInstance方法,这个方法中会判断是不是factorybean
获取到factorybean后,getObjectForBeanInstance中会判断是否是factorybean,如果不是就直接返回。如果是,就强制转换成FactoryBean,然后先从缓存(key为bean的名称,value是对象实例)中获取。获取时,先判断是否是单例,在调用getObject。 factoryBean生成的单例不会放到单例池中 spring整合mybatis就是通过factorybean实现的。是在getObject的时候生成一个接口类型的代理对象 与beanfactory的区别: factorybean是由beanfactory生成的。 factorybean只能生成一中类型的对象实例,beanfactory可以生成多个 beanfactory除了可以获取实例外还有好多功能方法。 2 bean的生命周期 扫描 扫描时没有加载类,怎么判断有没有@Component注解,是asm解析得到的 生成beandefinitio 生成genericBeanDefinition 存放到beanDefinitionMap中 合并beandefinitio 先全mergementBeanDefinitionMap中查找,如果没找到在从beanDefinitionMap拿到后合并 合并后的beandefinition都是rootbeandefinition 加载类 实例化前可实现接口InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation在spring容器实例化前进行实例化,如果这里返回的值非null,则跳过spring容器的实例化,初始化等步骤,直接转到初始化后。
可实现接口InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation在spring容器实例化后做处理。
推断构造方法postProcessProperties方法:在工厂将给定的属性值应用于给定的bean之前对其进行后期处理,而不需要属性描述符
实例化 beandenition的后置处理 填充属性 执行Aware 初始化前 初始化后 要判断是不是factorybean SmartFactoryBean FactoryBean是懒加载的,SmartFactoryBean.isEagerInit 返回true也不会懒加载 getBean的时候,先从beanfactory中查找,如果没找到再从父beanfactory中查找,如果还找不到再创建bean @Dependson 注解表示依赖某些bean,需要先有依赖的bean才能创建当前bean @Dependson 互相注解造成的回 循环依赖:是通过两个map判断的 dependenciesForBeanMap dependentBeanMap bean的作用域:单例,原型,request,session。request,session和scope接口有关系 RequestScope Abstract 生成的对象存储在 request.getAtrribute().get("beanName") 中 SessionScope docreateBean spring自带的创建bean的方法 resolveBeforeInstantation 这个方法中可以创建bean,不用spring自带的创建bean方法。这个方法中会判断是否有实例化前处理器。所有的bean都会调用这个方法。
问题:
使用resolveBeforeInstantation创建的是不是就不调用aware了?是的。直接从实例化前跳到初始化后。 aop是在初始化后执行的转载地址:http://sbbnb.baihongyu.com/