当前位置: 首页 > news >正文

Bean的一些属性信息总结

        我们知道,在Spring中,一个Bean可以理解为一个对象,但是二者之间肯定是有区别的,比如一个Bean可以实例化成很多个对象、Bean中可以带有某些描述信息。

        学习Bean,能更好地使用Bean。

1、Spring两个核心概念的由来【可忽略】

        Spring最关键的功能就是实现IOC依赖翻转,其依赖翻转的实现靠的是设计模式“工厂模式”,所以,Spring中有一个核心概念,叫做工厂“Factory”。【当然,我们一般使用BeanFactory接口】

        只有工厂,那么每次客户端(如果我们把Spring的客户---即程序员,看成客户端)调用某个对象,就可能要重新new一个对象(或者靠反射实例化一个对象)。

        new对象没有关系,最核心的是我们是在XML文件(或者Java配置类,又或者注解开发)里配置bean属性的,如果每次new对象,都要解析XML文件,那么性能会很低。

        那么,为什么不用一个仓库,把所有的对象实例化后,存储起来呢?

        【保持疑问:懒加载lazy--load属性,能支持每次使用bean时,才创建,好像和new对象没区别?(目标:找出它们的区别)】

        既然想要一个仓库,就得有一个统一的“商品”,否则,我们没法用一种统一的方法,存储某个对象(比如自定义的3个类Student、Teacher、Course,3个类是有区别的)

        由于Java里,所有的类都指向Object,所以用Object当“商品”是个好主意。

        不过,Object想强转为某个类型(比如student),也得事先知道这是student。

        在Spring的早期版本,程序员使用BeanFactory创建Bean时,调用getBean方法,都要强转,这没什么问题。

        然而,随着Spring的发展,我们逐渐摒弃这种做法,更多采用@Autowired注解自动实例化,这时候,强转就是一个问题了。

        先分析这个问题。第一,强转的关键在于,我们事先不知道这个bean,是不是Student类,所以需要交给程序员手动处理。第二,@Autowired注解的关键是,我们要找到@Autowired对象和某个类的联系。【比如你在Student类中,用@Autowired注解了下面的语句“private Teacher tea”,那么要找到Student和Teacher的关系】(当然,这通过反射好像也能解决,不过也许性能问题吧。)

        所以,我们需要一个类,至少有2个属性。第一,标注这个bean指向哪个类;第二,标注这个bean,可能需要哪个类(当然,现在要求指向另一个bean,不过也说得通,如果Spring能够直接拿到另一个非bean的对象,那么其侵入性就太强了)

        当然,这不是BeanDefinition诞生的原因,我们也能发现,早期Spring版本是需要手动强转的。

        不过,举了这个例子,我们能发现,如果用Object类作为“商品”,其拓展性就很低。

        如果用某个类X,继承Object呢?可行,不过问题在于,X会继承Object的所有属性和方法,某种情况下我们不希望这么做。(比如性能损耗、或者希望内外部沟通的方法唯一)

        所以,干脆一不做二不休,采用一个接口BeanDefinition,作为“商品”。

        可能你会问了:Object是所有类和接口的基类,所有类和接口,都直接或间接指向Object,那定义这个接口,不也是一样?

        其实,Java这样定义是为了统一的类结构,在实际使用时,会发现接口无法调用Object的方法,所以其实并没有继承。【这也符合Java中,接口不能继承自具体类的原则】

        (当然了,为了保持拓展性,Spring还定义了一个接口AttributeAccessor,使接口BeanDefinition继承AttributeAccessor)【Spring很多其它概念,都继承了这个接口】

        此时,问题解决了一些,另一个在Java语法层面的问题是:

        接口不能定义变量,任何属性在接口里,都必须是public、static和final的。

        所以,我们需要在BeanDefinition接口的某个实现类中,定义这些属性。

        实现了BeanDefinition接口的抽象类AbstractBeanDefinition中,就定义了这些属性。

        其它实现BeanDefinition接口的类,直接或间接都继承了AbstractBeanDefinition类。【可以说这是最重要的类之一】

2、Spring中,BeanDefinition定义的信息

        其实在应用层面,我们很少使用BeanDefinition,一般都是配置后@Autowired。

        当然,了解BeanDefinition的一些属性,对开发也大有帮助。

第一,BeanDefinition的类特征信息定义

        类信息定义,主要功能是,外部拿bean和内部找到类。

        1.类名:bean的唯一名称,依靠此名称,从工厂Factory找到bean【getBean方法的字符串就是它的名字】

        2.指向的类:bean对应的类,一般是从工程目录java往下的相对路径。

第二,BeanDefinition的内部属性信息定义

        主要功能是,实现内部的一些功能。

        1.Scope作用域(我个人觉得应该叫类型):原生Spring有2种,单例singleton和原型prototype。(在其它情况可能会多出几种)【这定义了,当外部使用bean时,我们Spring是每次重新new一个bean(原型),还是永远返回同一个bean(单例)】

        2.primary主要的:

                假设有1接口叫FX,他有n个实现类。

                其中,类X的配置中,设置了这个属性。

                那么,如果Spring内部某个类AAA有成员变量FX,使用@Autowired时,默认实例化类X。

        3.依赖信息:比如该bean需要依赖哪些类。

        4.懒加载lazy-load:如果定义了这个,Spring不会一开始就实例化bean。

第三,行为信息定义

        主要功能是,定义外部使用bean时,可以做的操作。

        1.初始化方法:在bean实例化后,会调用该方法。

        2.销毁方法:在bean销毁前,会调用该方法。

此外,BeanDefinition还有一些其它属性,所以我用得不多,在此不说明。

         我是蚊子码农,如有补充或者疑问,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

相关文章:

Bean的一些属性信息总结

我们知道,在Spring中,一个Bean可以理解为一个对象,但是二者之间肯定是有区别的,比如一个Bean可以实例化成很多个对象、Bean中可以带有某些描述信息。 学习Bean,能更好地使用Bean。 1、Spring两个核心概念的由来【可忽…...

CentOS 7 安装 Minio

获取MinIO安装包 下载地址如下:下载地址通过以下命令可直接将安装包下载至服务器 wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230809233022.0.0.x86_64.rpm安装MinIO rpm -ivh minio-20230809233022.0.0.x86_64.rpm集成Systemd …...

vue3和vite实现vue-router4版本路由的配置以及自动生成路由配置

这个是普通的手动路由配置:https://blog.csdn.net/weixin_68658847/article/details/130071101 自动路由配置 创建项目 npm create vitelatest my-vue-app -- --template vue // 或者 yarn create vite my-vue-app --template vue// 安装路由 yarn add vue-route…...

Flutter 中的 CupertinoDatePicker 小部件:全面指南

Flutter 中的 CupertinoDatePicker 小部件:全面指南 在 Flutter 中,CupertinoDatePicker 是 Cupertino 组件库的一部分,它提供了一个 iOS 风格的日期选择器。这个选择器允许用户选择日期和时间,非常适合需要符合 iOS 设计指南的应…...

用 Python 编写自动发送每日电子邮件报告的脚本

第一步:安装必要的库 你需要安装 smtplib(Python 自带),但你需要安装 schedule 和 email 库。你可以使用以下命令安装这些库: pip install schedule第二步:编写发送邮件的脚本 这里是一个完整的 Python …...

IT人的拖延——渴望成功与害怕成功的矛盾

很多人都以为,害怕失败是拖延的主要诱因,但其实“害怕成功”也是拖延的主要诱因之一。要说这个原因,我们不得不提起Bible中的一个人“约拿”,让我们先来看看他的故事带给我们什么启示。 约拿情结简介 约拿是Bible中的一名先知&a…...

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序,提供运动场馆运营解决方案,适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码:打造高效便捷的预定体验 一、引言:数字化预定时代的来临 …...

音乐系统java在线音乐网站基于springboot+vue的音乐系统带万字文档

文章目录 音乐系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 音乐系统 一、项目演示 在线音乐系统 二、项目介绍 基于springbootvue的前后端分离在线音乐系…...

Python—面向对象小解(1)

一、面向对象 面向对象编程(Object-Oriented Programming,简称 OOP)是一种程序设计范式,它通过使用“对象”和“类”来组织代码。Python 是一种面向对象的编程语言,支持 OOP 的核心概念。 面向过程&#xff1a…...

2024最新TikTok抖音国际版,tiktok正版免拔卡安装来了!

保姆级教程!2024最新TikTok抖音国际版,无限制!tiktok正版免拔卡安装方法来了! TikTok这款APP为何让全球都为之疯狂?因为它更懂人性,懂的人都懂! 我是你的老朋友阿星,今天阿星要给大…...

【Python-OS】os.path.splitext()

作用:将文件路径分割成文件名和扩展名两部分。 slide_id, _ os.path.splitext(slide) print("slide:") print(slide) print("slide_id:") print(slide_id)注: slide是文件名,可以自行赋值...

安卓开发--安卓使用Echatrs绘制折线图

安卓开发--安卓使用Echatrs绘制折线图 前期资料安卓使用Echarts绘制折线图1.1 下载 Echarts 安卓资源1.2 新建assets文件1.3 新建布局文件1.4 在布局文件中布局WebView1.5 在活动文件中调用 最终效果 前期资料 Echarts 官网样式预览: https://echarts.apache.org/examples/zh/…...

每日5题Day9 - LeetCode 41 - 45

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:41. 缺失的第一个正数 - 力扣(LeetCode) 今天这道题没有ac,写不动了,下次再通过吧,先给个半成品下次回…...

进程间通信的方式中,socket和消息队列的区别

进程间通信的方式中,socket和消息队列的区别 进程间通信方式中,socket和消息队列的主要区别在于通信的方式和跨机通信的能力。 socket是通过网络传输的方式来实现进程间通信,并且可以跨主机;而消息队列是通过内核提供的缓冲区进…...

10. C++异步IO处理库和使用libevent实现高性能服务器

C比较有名的异步IO处理库 libevent 这个主要使用的是epoll。libevthplibuvlibev 我们主要介绍libevent。 libevent重要函数 event_base_new 这个可以对应于epoll_create也就是创建一个实例。还可以初始化libevent所有管理相关的代码。比如说所能用到的队列,栈&a…...

React里面useMemo和useCallBack的区别

useMemo 和 useCallback 接收的参数都是一样,第一个参数为回调,第二个参数为要依赖的数据。 相同部分:都是依赖数据发生变化,才会去更新缓存数据 不同部分: useMemo缓存的是二次计算的数据,主要用于缓存…...

css 渐变色边框

效果图&#xff1a; 代码&#xff1a; <style>:root{--br-radius: 12px;}.list{position: relative;}.list_tle{margin-top: 15px;margin-bottom: 5px;}.item{position: relative;display: inline-flex;} .br1 {padding: 10px 16px;clip-path: inset(0 round 6px);borde…...

prompt提示词:如何让AI帮你提一个好问题

我们看完一篇文章的时候&#xff0c;有时候发给AI后&#xff0c;不知道如何问AI&#xff0c;不知道问哪些问题&#xff0c;你使用这个提示词&#xff0c;就可以让AI帮你想一个好问题&#xff0c;然后你用AI想好的问题再去问AI 能提出一个好的问题是非常难的 提示词 结合文章…...

若依ruoyi-vue element-ui 横向滚动条 动态横向滚动条

动态横向滚动条 因为每次横向滑动都要到底部&#xff0c;引入插件 https://github.com/mizuka-wu/el-table-horizontal-scroll //动态横向滚动条移入样式 .el-table-horizontal-scrollbar :hover{//高度 变大10%transform: scaleY(1.5) translateY(-10%);//百分之八十亮度&a…...

CET-4 听力高频词

1. 生活故事 architect /ˈɑːkɪtekt/ n. 建筑师anxiety /ŋˈzaɪəti/ n. 焦虑attack /əˈtk/ v./n. 批评&#xff1b;攻击assume /əˈsjuːm/ v. 假定auditorium /ˌɔːdɪˈtɔːriəm/ n. 观众席&#xff1b;礼堂bonus /ˈbəʊnəs/ n. 奖金campaigner /kmˈpeɪnə…...

ARM鲲鹏920-oe2309-caffe

参考链接:Caffe | Installation 安装依赖包 dnf install dnf update dnf install leveldb-devel snappy-devel opencv.aarch64 boost-devel hdf5-devel gflags-devel glog-devel lmdb-devel openblas.aarch64 dnf install git wget tar gcc-g unzip automake libtool autoco…...

这款网站测试工具,炫酷且强大!【送源码】

随着互联网的普及和发展&#xff0c;Web 应用程序的数量也越来越多&#xff0c;各种网络问题也是层出不穷&#xff0c;因而监测这些 Web 应用程序的性能和可用性变得非常重要。 今天的文章&#xff0c;了不起和大家分享一款十分好用的的网站分析项目 - Web-Check。 项目简介 …...

成功案例(IF=7.4)| 代谢组+16s联合分析助力房颤代谢重构的潜在机制研究

研究背景 心房颤动&#xff08;AF&#xff09;是临床上最常见的持续性心律失常&#xff0c;具有显著的发病率和死亡率。高龄是房颤发病率、患病率和进展最显著的危险因素。与年龄在50-59岁之间的参与者相比&#xff0c;80-89岁之间的参与者患房颤的风险增加了9.33倍。目前尚不…...

【LeetCode:496. 下一个更大元素 I + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

软考案例题总结

数据库故障与恢复 E-R图 关系规范化 SQL 涉及的知识点一般包括&#xff1a;表的创建、视图和索引创建的关键字、表的查询、聚集函数、子查询、分组查询、集合操作、外连接存储过程、游标、触发器以及表的更新、插入和删除...

第二证券炒股知识:股票破发后怎么办?

当一只新股的价格跌破其发行价时&#xff0c;往往会受到商场出资者的关注。关于股票破发后怎么办&#xff0c;第二证券下面就为我们具体介绍一下。 股票破发是指股票的商场价格低于其发行价格或最近一次增发价格&#xff0c;股票破发往往是由于多种要素共同作用的结果&#xf…...

Angular中,@HostListener装饰器

HostListener(input, [$event]) onInput(event: KeyboardEvent) {// 将输入值转换为大写const currentValue this.el.nativeElement.value;const upperCaseValue currentValue.toUpperCase();// 更新输入框的值if (currentValue ! upperCaseValue) {this.el.nativeElement.va…...

lammps案例:reaxff势模拟Fe(OH)3高温反应过程

大家好&#xff0c;我是小马老师。 本文分享一个reaxff反应势的案例。 该案例主要模拟Fe(OH)3在高温下的反应过程&#xff0c;主要代码来自lammps自带的案例。 lammps自带案例没有产物输出&#xff0c;故在此基础上稍加修改&#xff0c;增加了产物输出命令。 反应过程如下图…...

基于springboot实现政府管理系统项目【项目源码+论文说明】

基于springboot实现政府管理系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff…...

5.28_Java语法_运算符,接收键盘数据

1、运算符 具体应用同我C语言操作符详解博客相同,另有补充会直接写 1.1、基本的算术运算符、符号做连接符 CSDN 具体应用同我C语言操作符详解博客相同 符号做连接符&#xff1a; ""符号与字符串运算连用的时候是用作连接符的&#xff0c;其结果依然是一个字符串…...