Spring加载Bean流程解析
比如加载 A 的单例,和原型模式类似,单例模式也会调用匹配到要使用的构造函数,发现构造函数有参数 B,然后使用 BeanDefinitionValueResolver 来检索 B 的实例,根据上面的分析,继续调用 beanFactory.getBean 方法。
设置环境变量(Environment)用来匹配在bean配置文件可能出现的一些占位符。设置资源定位器用来定位bean的xml定义文件。设置xml实体处理器辅助xml的解析工作。
Spring管理bean:从web.xml里面配置的ContextLoaderListener开始。
spring加载bean会把里面的类加载吗
1、我们假设所有的配置和扩展类都已经装载到了 ApplicationContext 中,然后具体的分析一下 Bean 的加载流程。
2、init/bean这样配置你的读取xml的服务,spring框架会在启动的时候自动跑 readXmlServiceImpl中的init方法,所以你只要将读取xml的过程放到init方法里,那在spring启动的时候就会自动将xml中数据读取到内存中。
3、猫头鹰属于鸟类,猫头鹰是鸮形目鸟类的统称。猫头鹰是现存鸟类中在全世界分布最广的鸟类之一。除了北极地区以外、世界各地都可以见到猫头鹰的踪影。猫头鹰完全依靠捕捉活的动物为食。
4、这个顺序不需要关心吧?Spring是先加载配置文件,然后更加配置文件再初始化相应的类 比如你在B配置文件中声明了一个BeanA 在A配置文件中用到了这个BeanA,Spring 不会由于配置文件加载顺序的问题而造成找不到BeanA的错误的。
spring容器已经启动,我怎么动态的加载里面的某个bean
使用的时候,通过Springfactory.getBean(beanName),就可以获取到bean了。注意:这个是静态方法,直接通过类名去调用。
写一个类,实现BeanFactoryAware接口,把该接口配置到spring中,然后把getbean方法写成静态的,就可以动态获取了。
使用了一个 ThreadLocal 变量 prototypesCurrentlyInCreation 来记录当前线程正在创建中的 Bean 对象,见 AbtractBeanFactory#prototypesCurrentlyInCreation : 在Bean 创建前进行记录,在 Bean 创建后删除记录。