我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring中bean实例化怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring中bean实例化怎么实现

本文小编为大家详细介绍“Spring中bean实例化怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中bean实例化怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    bean实例化

    bean的基础配置

    在学习bean的实例化之前,我们先来学习bean该如何配置。

    在bean的配置这一块,我们将学习三块内容,分别为:我们先来看一下bean的基础配置bean基础配置、bean别名配置、bean作用范围配置。

    id用来定义bean的名称,通过它可以获取,class用来指定bean的类型,也就是你造出来的bean究竟是哪一个类的

    那么这个时候就有一个问题了,对应的bean的id你写好了,但是你的命名习惯和我的命名习惯不一样,我不想叫这个名称,有没有办法呢,这就是有关bean可以起多个名称,也就是所谓的bean的别名。

    • 接下来我们来看bean的别名配置,在学习之前,我们先来交代一下当前的程序环境

    service层接口

    Spring中bean实例化怎么实现

    service层实现类

    Spring中bean实例化怎么实现

    dao层接口

    Spring中bean实例化怎么实现

    dao层实现类

    Spring中bean实例化怎么实现

    applicationContext.xml配置文件

    Spring中bean实例化怎么实现

    主方法

    Spring中bean实例化怎么实现

    • 在了解了程序环境以后,我们开始来学习别名配置。

    我们知道bean的别名肯定是写在applicationContext.xml配置文件中的 ,怎么写呢,在配置的 bean中,有一个name属性,可以为这个bean指定更多的名称。

    Spring中bean实例化怎么实现

    注意:别名可以有多个,使用逗号,分号,或者空格进行分隔。

    当我们在主方法中将getBean()方法里边的参数改为我们配置的别名,我们会发现程序还可以正常运行,那就说明我们配置的别名是有效的。

    Spring中bean实例化怎么实现

    接下来我们思考:我们在绑定service与dao的关系时,在service层配置的bean里边有一个属性ref表示的是参照dao层配置的bean,属性值为dao层配置的bean的属性id,那么如果我们将ref这个属性改为我们在dao层配置的bean的别名,那么程序还可以正常运行吗?我们来演示一下

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    通过以上演示,我们可以得知别名的作用范围是很大的❗❗虽然我们学习了用别名配置bean的方式,但是还是建议我们ref参照的时候,还是引用id属性。

    • 接下来需要说一说我们需要注意的问题了

    回到我们的主方法中,我们现在在getBean()方法中传递进去一个我们没有的参数service5,这是在配置的service的bean中的id属性和name属性都没有的参数,那我们运行的话会有什么问题呢

    Spring中bean实例化怎么实现

    运行完会报出一个异常,这个异常的意思就是没有一个这样的bean被定义,如果以后我们遇到这个异常的话,只需要检查我们的名字就行了

    Spring中bean实例化怎么实现

    • bean的别名配置我们已经说完了,接下来我们来学习bean的作用范围

    什么叫bean的作用范围呢?其实就是你现在创建的bean的究竟是一个对象还是多个对象,什么意思呢,其实就是说你造的对象是单例的还是非单例的,我们先来看看如下代码

    Spring中bean实例化怎么实现

    我们获取到BookDao的对象,并且打印它的地址

    Spring中bean实例化怎么实现

    那我们将以上代码复制两份并且分别打印它们的地址,会出现什么结果呢

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    通过运行结果我们可以发现,两次打印的结果是同一个地址,那么它们也可以认为是同一个对象了

    由此得出:Spring默认给我们创建的bean是单例的,那么这时候就有新问题了,如果我想要创建一个非单例的该怎么办,这个时候就要通过配置的方法解决这个问题了

    如下,我们在dao层配置的bean后边再加一个属性scope,就是作用范围的意思

    里边有两个值,一个singleton表示单例的,一个prototype表示非单例的,不写的话,默认是signleton,我们设置scope属性为prototype,来看看运行结果

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    通过运行结果我们可以得出,此时的所创建的两个对象是不同的,注意:我们上面所框出的是对象的哈希值,不是对象的地址但是可以当做是对象的地址❗❗

    • 在学完bean的作用范围,我们可以认为它是可以控制创建的bean是一个或者是多个的,那么新的问题来了,为什么bean默认是单例的❓

    我们来解释一下,对于Spring来说,它帮我们管理的bean要放到它的容器中,我们 假定一个场景,如果它造出来的bean不是非单例的,那么这个bean的数量会有多少呢?

    它会无穷无尽,用一次造一个,所以说Spring它并不是帮我们管理这一类bean的

    这样的话,对Spring容器来说也有一个非常大的压力,那Spring帮我们管理的bean都是单例的,那会对我们的业务造成伤害吗

    你想一想,你造一个dao对象,执行完一个方法,下一次你又需要造一个dao对象,再执行另一个方法,那我这两个对象用同一个不行吗?

    好像没有什么问题,就是这个原因,Spring容器在帮我们管理对象的时候其实就是在管理那些你可以复用的对象,就是这个对象你用一次,下一次还用它,所以你下次还会从容器中拿,这样它的效率才会更高一些,

    因此,它就简单一点,给你造的bean就是单例的❗❗。

    • 那么新的问题有又来了,哪些bean适合造单例的呢❓

    我们的表现层对象,比如说我们现在写的Servlet,业务层对象, Service,数据层对象,Dao,或者还有一些工具类的对象,这些对象,你造一次就ok了,就这个对象我可以反复用,这些东西交给Spring管理?。

    • 那哪些东西不适合交给Spring管理呢❓

    封装实体的域对象不适合交给Spring管理,因为它里边会记录一些它的成员变量的一些属性值,到这里我们就知道了bean的作用范围是控制我们bean创建的实例的数量的。

    bean的实例化-构造方法

    上面我们学习完了bean的基础配置,那就有人问了,我们的这个单例bean是如何造出来的呢,和我们以前的写法一样吗,也是用new的方式造出来的吗,我们现在就来学习bean的实例化-构造方法实例化的方式。

    对于bean来说,其本质是对象,在前面我们说过,我们将容器中管理的对象叫做bean,我们以前创造对象是怎么写:new跟构造方法,对于Spring来说,它也是通过构造方法来完成bean的创建的,一起来看一下

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

     以上是我们程序的环境☝️☝️,接下来我们来说以前我们造对象new+构造方法,对于Spring来说,同样的道理,它也是用构造方法来造对象的。

     接下来我们在dao的实现类中生成构造方法,并且在构造方法中打印一句话

    Spring中bean实例化怎么实现

    什么都不动,我们再来运行一下,看看这句话执行了没有,如果执行了,那就意味着Spring容器调用了构造方法造对象

    Spring中bean实例化怎么实现

    结果是用了,造对象都得用构造方法,在这说一个东西,我们将构造方法的权限修饰符改为private,我们说如果以前我们写程序,把构造方法私有化以后,我们在外边还可以造对象吗?显然是绝对造不出来的

    结果是不是出人意料啊,Spring还可以调用它的构造方法

    那就说明了一点,Spring确实是通过构造方法来造对象的,而且不管是公共的还是私有的它都能调到,我们可以猜到它的内部是怎么回事吗,私有的东西它居然可以访问,怎么做的

    是通过反射,后边我们在学习一些内部工作原理的时候,我们再来学习它,现在只需要知道它是通过构造方法造对象的就可以了

    但是这个时候就有人提出来了一个问题,那万一给它加一个参数呢?

    Spring中bean实例化怎么实现

    我们来试一试,并且运行一下,会发现它已经不能正常运行了,这就说明了一点,Spring在创建bean的时候,调用的是无参构造方法,到这里我们就学习完了第一种实例化bean的方式,就是用构造方法来实例化对象❗❗

    Spring中bean实例化怎么实现

    bean的实例化-静态工厂

    • 前面我们学习了用构造方法来实例化bean,接下来我们来说第二种方式,在学习第二种方式之前

    • 我们先来回顾一个东西,我们在前边讲过,用工厂也可以造对象,我们先来看看程序环境

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    • 接下来我提供了一个工厂类

    Spring中bean实例化怎么实现

    • 如果用这个来写的话,会是什么样子的呢?接下来我们来看一下

    先去使用工厂去获得这个对象,然后去运行,我们去运行一下

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    我们发现这是可以运行的,其实这是早些年做程序的一个常用的方式,说的简单一点就是造对象不要自己new,而是用工厂的方式做一定程度的解耦,那么这种方式也是造对象的一种方式

    如果我们的对象是用这样一种方式造出来的,交给Spring管理该怎么管呢?

    这就是我们要学习的第二种方式:用静态工厂来造对象,接下来我们来学习以下该怎么做

    对于它的接口实现类和静态工厂来说,这三个东西是一套东西

    如果我们现在要管理这个bean,首先要写它的配置文件,那么问题来了,这样造出来的对象究竟是dao的对象还是factory的对象❓应该是factory的

    因为你配什么造出来的就是什么,那我们要的是factory的对象吗?

    显然不是,我们要的是factory里边的方法造出来的dao对象,所以我们下面这么写肯定是不行的,我们除了要告诉它的工厂类,还要告诉它一个东西factory-method属性来告诉它工厂是使用哪一个方法来造对象的,到这就可以造出来了,我们来运行一下,当然是用Spring的方式来运行的。

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    到这我们的第二种方式就学完了,但是还有一个问题,为什么不直接new啊,我们要知道工厂中做的有事情,可能会有一些配置,并且不能扔,所以强制你必须要用这个工厂,我们再来运行一下。

    Spring中bean实例化怎么实现

    bean的实例化-实例工厂与FactoryBean

    接下来我们来学习第三种方式,首先我们来看看程序环境。

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    注意:此时这个工厂是非静态的。

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    在了解完程序环境后,我们就开始学习它

    首先也是一样打开配置文件,我们在实例化的时候,必须先去造一个实例工厂类的对象,所以我们先来配置实例工厂类的bean。

    Spring中bean实例化怎么实现

    我们在造出这个工厂类的对象以后,我们再来配置dao层的bean,属性factory-bean指的是这个工厂的实例在哪呢,第二个是这个工厂用哪个方法来造这个对象的。

    Spring中bean实例化怎么实现

    我们来用Spring的方式来运行一下

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    上边我们为了造dao层的对象,专门写了一个factory的bean,其实这个东西挺多余的,除了这个作用以外,无任何意义,还有在dao层的bean里边有一个属性factory-method,方法名不固定,每个里边都得指定,那么这种东西不能写一个通用的名称吗?

    针对以上问题,Spring就做了一次改良:FactoryBean,我们先来看看程序环境

    Spring中bean实例化怎么实现

    • 注意:工厂造什么对象,就写什么泛型,第二个方法返回的是对象的字节码文件.

    我们可能会发现,它和上边的好像没什么区别,但是它在配置的时候可简单多了,我们接下来在配置文件中配bean,并且看看是否可以正常运行

    Spring中bean实例化怎么实现

    结果是可以正常运行,这就是我们所说的第三种方式的改良了,在这里我们覆盖了一个方法isSingleton

    那接下来我们来看看,既然你造出来这个对象了,我们可以想一想,造出来的这个对象是单例的还是非单例,我们来通过getBean()方法获得两个userDao对象,并且分别打印,接下来我们来看一下

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    Spring中bean实例化怎么实现

    我们通过结果可以看出,通过这种方式造出来的对象是单例的,那么怎么样去改非单例的呢,我们在UserDaoFactoryBean中加上isSingleton方法,然后返回值设置为false,就可以改成非单例的了

    Spring中bean实例化怎么实现

    我们再来运行一下,此时就变成非单例的了

    Spring中bean实例化怎么实现

    读到这里,这篇“Spring中bean实例化怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Spring中bean实例化怎么实现

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Spring中bean实例化怎么实现

    本文小编为大家详细介绍“Spring中bean实例化怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中bean实例化怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。bean实例化bean
    2023-07-05

    Spring Bean实例化方式怎么实现

    这篇“Spring Bean实例化方式怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Bean实例化方式
    2023-07-05

    Spring createBeanInstance怎么实例化Bean

    本篇内容介绍了“Spring createBeanInstance怎么实例化Bean”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Sprin
    2023-07-05

    Spring Bean中Bean的实例化分析

    这篇文章主要介绍了Spring Bean中Bean的实例化分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Bean中Bean的实例化分析文章都会有所收获,下面我们一起来看看吧。实例化前阶段pro
    2023-06-29

    Spring Bean的配置与实例化怎么实现

    这篇文章主要介绍“Spring Bean的配置与实例化怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean的配置与实例化怎么实现”文章能帮助大家解决问题。一、 Spring
    2023-07-02

    Spring createBeanInstance实例化Bean

    这篇文章主要为大家介绍了Spring createBeanInstance实例化Bean源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-07

    spring中实例化bean无效怎么解决

    这篇文章主要讲解了“spring中实例化bean无效怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“spring中实例化bean无效怎么解决”吧!spring中实例化bean无效在做S
    2023-06-29

    Spring中实例化bean的方式有哪些

    这篇文章主要为大家展示了“Spring中实例化bean的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring中实例化bean的方式有哪些”这篇文章吧。前言在介绍Bean的实例化的
    2023-05-30

    spring中bean实例化的三种方式 -- Spring入门(二)

    文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了
    2023-08-19

    详解Spring中bean实例化的三种方式

    今天我想来说说如何通过xml配置来实例化bean,其实也很简单。 使用xml配置来实例化bean共分为三种方式,分别是普通构造方法创建、静态工厂创建、实例工厂创建,OK,那么接下来我们来分别看看这几种方式。普通构造方法创建这种创建方式使我们
    2023-05-31

    Spring实例化bean的方式有哪些

    这篇文章主要介绍了Spring实例化bean的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring实例化bean的方式有哪些文章都会有所收获,下面我们一起来看看吧。一、bean实例化&mdash
    2023-07-02

    【Spring(四)】万字详解bean的实例化

    文章目录 前言1.bean实例化1.1 bean的基础配置1.2 bean的实例化-构造方法1.3 bean的实例化-静态工厂1.4 bean的实例化-实例工厂与FactoryBean 总结 前言   在上篇文章,我们已
    2023-08-20

    spring中怎么向一个单例bean中注入非单例bean

    这篇文章主要介绍“spring中怎么向一个单例bean中注入非单例bean”,在日常操作中,相信很多人在spring中怎么向一个单例bean中注入非单例bean问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”s
    2023-06-20

    Spring Bean获取方式的实例化方式详解

    工作中需要对一个原本加载属性文件的工具类修改成对数据库的操作当然,ado层已经写好,但是需要从Spring中获取bean,然而,工具类并没有交给Spring来管理,所以需要通过方法获取所需要的bean。于是整理了Spring获取bean的几种方法
    2023-03-09

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录