您好,登录后才能下订单哦!
本篇内容主要讲解“spring Bean创建方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring Bean创建方法是什么”吧!
写在前面:建议大家一定要自己用实例跑一遍,做好记录。如果只是看看会非常抽象。此流程图作为梗概,便于加强记忆和理解,新手或无基础的有个印象即可。等跟随本文走通一遍,在回过头看这个图,或许会有收获
源码走一遍bean的定义这是我的bean目录结构,只是做一个例子
获取核心容器对象,bean最后都会放在此容器对象中
* ApplicationContext的三个实现类 * ClassPathXmlApplicationContext 它可以加载类路径下的配置文件,要求必须在类路径下 * FileSystemXmlApplicationContext 可以加载任意路径下的配置文件,必须有访问权限 * AnnotationConfigApplicationContext 用于读取注解创建容器的 这里我用ClassPathXmlApplicationContext来做演示 public class MyTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); } }
建议用IDEA的debug模式来观察Spring的IOC过程
进入到此类的构造方法中
查看setConfigLocations,就是将配置文件加载到configLocations里去
向下执行,查看refresh()
this.prepareRefresh(): 此方法是准备工作,大家感兴趣可以点进去看一下,可以看到里面是获取时间,获取环境信息的一些设置。
this.obtainFreshBeanFactory(): 这一步是创建beanFactory,并且读取Bean的信息,源码注释中还有写到
// Tell the subclass to refresh the internal bean factory.会告诉子类去刷新内部bean工厂
this.refreshBeanFactory:
* This implementation performs an actual refresh of this context's underlying * bean factory, shutting down the previous bean factory (if any) and * initializing a fresh bean factory for the next phase of the context's lifecycle. 这个实现类的方法会刷新容器中的beanFactory,关闭之前存在的并且初始化新的beanFactory
利用this.createBeanFactory() 创建了一个beanFactory,类型为DefaultListableBeanFactory
这个类接着往下走:this.loadBeanDefinitions(beanFactory);
* Load bean definitions into the given bean factory, typically through * delegating to one or more bean definition readers. 这个方法会将beandefinitionsReader读取到的bean definitions放入bean工厂,我们以上提出的三种 注入方式都会走到这里,将bean信息丢进去
返回上述 refresh()
this.prepareBeanFactory(beanFactory); 设置和忽略一些对象值
this.postProcessBeanFactory(beanFactory); 空方法可自定义扩展
this.invokeBeanFactoryPostProcessors(beanFactory);
* Instantiate and invoke all registered BeanFactoryPostProcessor beans, * respecting explicit order if given. * <p>Must be called before singleton instantiation. 实例化所有beanFactory组件
registerBeanPostProcessors(beanFactory);
Instantiate and register all BeanPostProcessor beans, //先注册再调用
initApplicationEventMulticaster(); 观察者模式监听器, 监听组件的相关状态,并决定相关调用方法。
finishBeanFactoryInitialization(beanFactory); 重要!!
* Finish the initialization of this context's bean factory, * initializing all remaining singleton beans. 完成了容器bean factory的初始化,并且初始化其他的bean单例对象
beanFactory.preInstantiateSingletons(); 实例化方法
此方法最后this.getBean(beanName)
继续
Return an instance, which may be shared or independent, of the specified bean. 注释已经很清楚了,此方法会返回一个实例,就是我们的bean对象
进入到createBean方法中
继续进入
继续进入
Instantiate the given bean using its default constructor. 这个方法注释说明了实例化对象是用构造器完成的
继续看他如何构造的
ca 就是Constructor,从这里我们基本可以看出容器内,bean对象的实例化 是利用反射的基本原理,获取类构造器,然后newInstance来实现的
以上就是bean对象实例化的基本过程,下面是实例化完成后的初始化过程
回到这里,实例化完成后
注释说明了在populateBean完成bean的初始化
继续
会看到在此方法里会调用前置和后置处理器来初始化Bean
到此,相信大家对“spring Bean创建方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
开发者交流群:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。