Bean实例化过程
2020-06-28 10:30:02 16 举报
Bean实例化过程
作者其他创作
大纲/内容
CommonAnnotationBeanPostProcessor
3、接下来就只剩下反射调用了,把值设置到属性或者方法中
addSingletonFactory
1、构造函数有了,现在就是要获取到构造函数里面的参数值,获取值的过程不要求大家现在掌握,只有一条,值肯定是从spring容器中获取的
反射调用有@PostConstruct注解的方法,从metaData中拿到前面收集到的initMethods容器,该容器里面就是收集到的有@PostConstruct注解的方法
这里会根据当前正在实例化的bean是否有切面来判断到底当前bean是否需要生成代理,如果有切面则生成代理,如果没有不生成代理
applyMergedBeanDefinitionPostProcessors
1、支持@Lookup注解,扫描正在实例化的类中的方法,看看方法上面是否有@Lookup注解,如果有创建一个LookupOverride对象并添加到mbd.getMethodOverrides().addOverride(override)
获取所有的BeanPostProcessor接口类型的对象,然后判断是否是SmartInstantiationAwareBeanPostProcessor类型的,然后循环调用determineCandidateConstructors方法,该方法的作用是获取有@Autowired注解的构造函数
determineCandidateConstructors
instantiateBean
跟AutowiredAnnotationBeanPostProcessor类的方法是同样的逻辑,这里就不赘述了
2、调用@PostConstruct注解的方法,这里是通过BeanPostProcessor接口来实现该功能
代码往下执行
postProcessBeforeInitialization
3、调用实现了InitializingBean接口的类中的afterPropertiesSet方法,调用init-method中配置的方法
1、postProcessMergedBeanDefinition根据该方法收集到的metaData数据,这个数据对象里面就封装了有@Autowired注解的方法或者属性,有这个注解就代表这个方法或者属性需要依赖注入
1、流程跟CommonAnnotationBeanPostProcessor类的postProcessMergedBeanDefinition方法的流程基本上是一模一样的,收集bean的属性和方法上面是否有@Autowired@Value注解,如果有则封装对象。这里就不赘述
1、无参构造函数的实例化,大部分情况都会走这种方式实例化ctor.newInstance(args)
获取所有的BeanPostProcessor接口类型的对象,然后判断是否是MergedBeanDefinitionPostProcessor类型的,然后循环调用postProcessMergedBeanDefinition方法,该方法的作用是对有@Autowired@Resource@PostConstruct@PreDestroy注解的方法或者属性进行收集装配并封装成对象
postProcessMergedBeanDefinition
4、代理实例创建,用BeanPostProcessor接口来完成代理实例的生成
@Autowired的构造函数为空
2、注册过程中DisposableBeanAdapter类中获取DestructionAwareBeanPostProcessor类型的接口,这个BeanPostProcessor接口专门用销毁对象的
3、需要大家牢牢记住一个结论,如果是引用类型的参数用到了@Autowired注解依赖注入属性值,必定会触发该引用的beanFactory.getBean(beanName),从容器中获取该参数的值
no
determineConstructorsFromBeanPostProcessors
1、调用Aware接口
postProcessProperties
createBeanInstance
2、收集正在实例化的Bean的方法中是否有@PostConstruct注解并把method对象封装成LifecycleElement对象
如果构造函数不为空
2、获取需要依赖注入的属性值,这里必定会触发beanFactory.getBean(beanName)操作,这里同学们要有这个理解
populateBean
4、最终把收集到的对象全部封装到LifecycleMetadata对象中,这个对象有一个list,有一个目标类
AbstractAutoProxyCreator
AutowiredAnnotationBeanPostProcessor
postProcessAfterInitialization
BeanPostProcessor接口循环调用
yes
registerDisposableBeanIfNecessary
......
是否配置了factory-method属性,或者是否有@Bean注解
2、获取到值以后,就是反射实例化ctor.newInstance(args),这样就完成了有参构造函数的实例化。并把这个实例包装成BeanWrapperImpl对象
1、构造函数中注册了@PostConstruct和@PreDestroy注解
反射调用factroy-method方法,掉方法时的参数封装暂时不去了解。该方法会返回一个自定义创建的实例,然后return,后面实例化过程就不会走了
init-method属性,和InitializingBean接口方法afterPropertiesSet调用。@PostConstruct注解方法调用。代理对象的生成入口
2、获取bean对应的所有构造器,rawCandidates = beanClass.getDeclaredConstructors();
1、注册过程中DisposableBeanAdapter类中获取BeanDefinition对象中的destroy-method属性
mbd.getFactoryMethodName() != null
AbstractAutowireCapableBeanFactory.doCreateBean()
instantiateUsingFactoryMethod
4、返回有@Autowired注解的构造函数数组
initializeBean
注册bean销毁时的类DisposableBeanAdapter
autowireConstructor
3、收集正在实例化的Bean的方法中是否有@PreDestroy注解并把method对象封装成LifecycleElement对象
0 条评论
下一页