Java Spring Bean的实例化
创始人
2024-02-11 10:36:24

Java Spring Bean的实例化

Spring框架支持两种方式去进行Bean的管理:BeanFactoryApplicationContext

BeanFactory:pom文件引入spring-context坐标,创建对应的待IOC类,然后在bean.xml注入,最后在调用处初始化BeanFactory及xml加载获取

ApplicationContext:内部封装了BeanFactory,在基础上进行了扩展,ApplicationContext的API更加方便使用继承关系和扩展关系

联系:ApplicationContext封装BeanFactory
在这里插入图片描述

区别:Bean的初始化时机不同,BeanFactory(懒汉)是首次调用getBean()进行创建,ApplicationContext(饱汉)是加载配置文件,容器创建就将Bean实例化初始化


Bean 实例化的基本流程

在这里插入图片描述

Spring容器在进行初始化时,会将xml配置的bean的信息封装成一个BeanDefinition对象,所有的BeanDefinition存储到一个名为beanDefinitionMap的Map集合中去,Spring框架在对该Map进行遍历,使用反射创建Bean实例对象,创建好的Bean对象存储在一个名为singletonObjects的Map集合中,当调用getBean方法时则最终从该Map集合中取出Bean实例对象返回

在这里插入图片描述


Bean的作用范围:默认情况下,单纯的Spring环境Bean的作用范围有两个:SlingletonPrototype,在Spring-webmvc中还有request和session

Slingleton:单例,默认值,Spring容器创建时进行Bean的实例化,存到Spring容器内部的singletonObjects单例池中,每次getBean都是从单例池中获取相同的Bean实例

Prototype:原型,Spring容器初始化时不创建Bean实例,调用getBean时实例化Bean,每次getBean都会创建一个新的Bean的实例


Spring Bean的实例化(指的是BeanFactory内)有两种方向:构造方式实例化工厂方式实例化

其中工厂方式实例化时,又可以区分几种类型:静态工厂方式非静态工厂实现FactoryBean接口

构造方式实例化:底层通过构造方法对Bean进行实例化,配置类路径通过反射加载通过构造方法创建

public class PeopleServiceImpl implements PeopleService {public String name;public PeopleServiceImpl() {}public PeopleServiceImpl(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
        

获取时直接调用getBean()方法,里面指定peopleService信息

静态工厂方式:单例池中Key为工厂名,value为Bean对象

public class MyBeanFactory {public static PeopleServiceImpl peopleService(){return new PeopleServiceImpl();}
}

获取时直接调用getBean()方法,里面指定myBeanFactory信息

非静态工厂:bean.xml中配置两个,单例池中存在两个

public class MyBeanFactory2 {public PeopleServiceImpl peopleService(){return new PeopleServiceImpl();}
}
        

获取时直接调用getBean()方法,里面指定peopleService2信息

实现FactoryBean接口:在getBean()时创建,即延迟创建

public class MyBeanFactory3 implements FactoryBean {public Object getObject() throws Exception {return new PeopleServiceImpl();}public Class getObjectType() {return PeopleServiceImpl.class;}
}
        

通过断点观察发现Spring容器创建时,FactoryBean被实例化了,并存储到了单例池singletonObjects中,但是getObject() 方法尚未被执行,PeopleServiceImpl也没被实例化,当首次用到PeopleServiceImpl时,才调用getObject() ,此工厂方式产生的Bean实例不会存储到单例池singletonObjects中,会存储到 factoryBeanObjectCache 缓存池中,并且后期每次使用到PeopleService都从该缓存池中返回的是同一个PeopleService实例

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...