spring相关
2021-03-18 17:33:34 14 举报
spring
作者其他创作
大纲/内容
4.为什么spring不直接new,而是需要将class变为bd 有可能不需要new,比如是原型、懒加载等; new不出来,抽象类; 要去推断构造方法;spring内部算法 new完之后,需要注入属性;
初始化工厂obtainFreshBeanFactory
执行后置处理器各种aware接口实现1.如果Bean实现了BeanNameAware接口,Spring将Bean的Id传递给setBeanName()方法;2.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;3.如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用上下文引用传入进来;
使用destory销毁beanend!!!
判断是否需要提前暴露二级缓存工厂singletonFactories满足3个条件:1.是否单例;2.是否支持循环依赖,默认为true,allowCircularReferences;3.判断正在创建的beanset是否包含该bean
1.BeanFactory和FactoryBean的区别:BeanFactory:是一个bean工厂,用于生产出一个bean的,正常在getbean中当判断单例缓 存池中没有该bean时,就会使用该工厂生产bean; FactoryBean:顾名思义,一个工厂bean,一个接口,实现该接口的其中的3个方法,比较重要的是getObject;比如说一个TestFactoryBean实现了FactoryBean。。。未完待续!!!
getSingleton执行beforeSingletonCreation解决循环依赖的关键将beanName放入正在创建bean的set集合中
创建一个读取注解的Bean定义读取器this.reader = new AnnotatedBeanDefinitionReader(this)
getSingleton判断单例缓存池是否存在该bean
若属性中需要填充其他bean,则去重复getbean过程
调用getBean-->doGetBean
transformedBeanName校验name,转化为合格的beanName
register(annotatedClasses)1.正常来说是注册一个配置类:AppConfig2.还可以单独注册一个bean注:正常初始化Context内部加载,也可单独调用,后面接refresh()方法
font color=\"#ff3333\
准备工厂(prepareBeanFactory)
添加一个后置管理器ApplicationContextAwareProcessor如:beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this))实现了BeanPostProcessor接口,会存在postProcessBefore和postProcessAfter方法该aware接口可以将applicationContext传入bean中,比如在单例中引用原型bean,就可以使用该方法
合并父BeanDefinition
存在返回,循环下一个beanName
font color=\"#ff0000\
属性注入populateBean
由此产生的哪些问题:
将BeanDefinition详细信息册到 DefaultListableBeanFactory这个工厂
bean已经创建完成,放入单例缓存池中
存在
3.springbean之间的循环依赖如何解决
调用自定义初始化方法(2种方法)1.方法上加@PostConstruct注解2.xml中声明了init-method=\"xxx\"
2.spring的生命周期如上图
spring在refresh前做了什么
bean的实例化由spring选择构造方法实例化对象;此时,属性注入尚未完成
执行beanFactory的createBean方法
refresh步骤1
否
真正执行BeanFactoryInitialization实例化bean(spring的生命周期)
用来扫描包或者类,继而转换成BeanDefinitionthis.scanner = new ClassPathBeanDefinitionScanner(this)(注:这里为spring内部)
0 条评论
回复 删除
下一页