咱们已经完成了入门案例的学习,在入门案例中,我们讲了三块东西,首先并怎么样定义配置, d i 怎么样去制作配置, 以及我们的容器对象怎么去获取。在接下来的内容中呢?咱们就将针对这三块内容展开讲解。首先我们先来讲解与病相关的配置的知识,在病的配置这一节,我们将讲解三个内容, 基本配置,别名的配置以及作用范围的配置。我们先来看一下,现在我们已经完成了基本配置的学习,也就是 id 用来定义并的名称,通过它可以获取 class 用来指定并的类型,也就是你造出来这个并究竟是哪个类的。那这个时候就提出一个 问题了,对应的病的 id 你写好了,但是你的命名习惯和我的命名习惯不太一样,我呢不想叫这个名称,有没有办法呢?哎,这就是有关病可以起多个名称,也就是所谓的病的别名来。进入到矮垫中, 在演示并的别名之前,先交代一下当前的程序环境,新建了一个模块,这个模块中的所有的代码和我们刚才做的入门案例是完全一样的。 so 注入 dl, dl 中非常的简单,配置中一个 solis 的病,一个 dl 的病, sold 死中注入 dl, 然后运行程序和前面写的一样,也是调 silis 啊,来咱们运行一下,运行完一看没有问题,我们来说说这个 别命,那么对于病的名称的定义要写只可能在配置文件中,对吧?怎么写呢?看清楚,在他的属性中,有一个叫做内蒙的属性, 可以为他指定更多的名称,比如说再起个名叫做 sures, 可不可以呢?是可以的, 他的多个别名之间可以用逗号风格,风号风格或者空格风格都可以。 比如说我再起个名称, sorry 死二,这也是可以用的。当然你说这个名称我看了不舒服,我以前呢叫做 ebi b o k e b i, 这样就 ok 了。有人说这个 e b i 什么意思?叫做 enter price bini, 类似 interface, 叫做企业业务并,那这三个名称现在其实我都可以用来,咱们试一下,在这边呢,我们把这个名称改一下, 改名叫 so vs, 现在这个名称对应的使用的就是他了。来我们运行一下,看一看效果, 运行以后呢,我们看能不能出来是不是 ok 的。那同样对于下边来说,我们也可以给他加名称,比如说就叫 dl 了 啊,非常简单。那这个时候就提出一个东西,你原来 reference 参照我这个名称,能参照这个吗?来试一下啊, 试完大家就知道其实这个名称起到的作用范围有多大了啊,来运行是不是 ok 的?也就是说现在在 spa 用容器中, 这两个名称是等同的,都是对应我们的病的对象啊。好,咱们把这个东西给他恢复过来啊,只是给大家说能这么写,不过我们还是建议大家用 id 引用,这是有 关病的别名。那这里呢,要给大家说一个需要注意的问题了,来回到我们的应用程序照,现在在这个地方呢,我写一个别的名称,比如说我写一个三位四四, 这个名称在我们这里边是没有定义的,对吧?那现在运行会有什么效果呢?运行下看一看, 他将会爆出一个错误,这个错误需要大家去会阅读,对于异常来说,包名不用管,你从这个异常名开始阅读就行了,叫做 no such ok 吧,也就是这个病不存在,然后下面说没有病叫这个名称。好,以后遇到这样的一个信息,你就告诉自己啊,要么是你这边写错了, 要么就是你这边写对了,但是这边手滑写错了,明白啥意思吧,就不好说,总之你检查名字就行了。好,这是大家需要注意的东西啊。关于病的别名呢,咱们就说到这里,回到资料上, 病的别名其实就是给病定义多个名称,中间呢使用逗号、封号,空格风格。 那么在这里需要给大家强调一下啊,如果你并定义的名称不存在的话,他会抛这样一个异常,刚才已经给大家演示了,那么如果发现这种问题呢,你就记得两边检查就好了啊,不一定是哪边写错的。 那么有关病的别名这一部分知识咱们就说到这,接下来咱们再说这一节我们要说的第二个东西,叫做病的作用范围,来回到 我们的矮第二种。那么什么叫做病的作用范围呢?其实就是你现在创建出来的病呢?究竟是一个对象还是多个对象?啥意思呢?其实就是问你,你造的对象是单例的还是非单例的?来,咱们把这个关掉,把这一个打开, 在这一段程序中呢,用的还是刚才那一段啊,没有问题,我们在这把这个不可 da 获取以后,我做了一个输出,我们来运行一下这个程序, 运行完以后呢,给大家看一下,这是不是出现了一个他的地址,那有没有想过,如果我把这段程序给复制一下, 这个叫不可 dao 一,这个叫二,然后我把这俩对象打印一下,这是不是同一个对象呢?来我们看一下,运行完你会发现他们两个地址相同。我们得到一个结论, spring 默认给我们创建的病是一个单例的,对不对?那这时候就提出问题了,那我要想造个非单例的怎么办?哎,这个时候就要通过配置的形式完成了,在这我们需要在病的属性中再加一个属性,叫做 stop, 是靠谱。什么意思?范围作用范围里边有两个,指一个 singleton, 一个婆婆态度,看到这你就知道了,其实我们不写他默认的就是这个 singleton, ok 吧。来我们运行一下,你可以看一下这么两个有没有区别,是不是没区别啊?把它换成婆婆太婆 prototype 啊。来,再来运行一下,这次就有区别了,他会是两个不同的地址。好,到这呢咱们就知道了,通过这种方式可以 控制一个病造出来的对象是不是同一个对象,也就是否为单立对象。来回到资料上,对于病的作用范围呢?就是控制病创建的时候实力的数量到底是一个还是多个?默认用 c 沟疼, 如果想切换成非单立的,使用婆婆太不就可以。但是这里边就有一个问题要思考了,为什么并默认为单立的?来我们说一下啊,对于 spring 来说,他帮我们管理的,并要放到他的容器中。 我们假定一个场景,如果他造出来的病不是非单例的,那么这个病的数量会有多少呢?他会无穷无尽用一次造一个,用一次造一个,是不是这样?所以说死不定他并不是 帮我们管理这一类病的,这样的话对 spa 用的容器来说也有一个非常大的压力。那 spa 用帮我们管的病都是单立的,那会对我们的业务造成伤害吗?你想一想, 你造一个 do 对象,执行完一个方法,下一次你又需要造一个 do 对象,再执行另一个方法,那我这两个对象用同一个不行吗? 好像没有什么问题啊,哎,就是这个原因。 suring 在帮我们管理对象的时候,其实就是管理那些你可以服用的对象, 就是这个对象你用一次,下次还用他,所以你下次还会从容器中拿,这样他的效率才会更高一些,因此他干脆就简单点给你造的病就是单例的。那下面问题来了,哪些病适合造单例呢?注意看 我们的表现层对象,比如说现在我们写的 sole, 业务层对象 so is, 数据层对象 do, 或者还有一些其他的工具类的对象,这些对象呢,就是你造一次就 ok 了, 就这个对象我可以反复用这些东西交给 super 用管理。那哪些东西不适合交给他管理呢?比如说我们写的杜曼, 你这次封装的数据是一,全部是一,下次全是二,下次全是三,你会感觉这个对象你下次都没法用,里边有数据了,所以这种对象我们不太适合交给 spring 管理。 那这种对象有个什么特征呢?其实叫做有状态的,也就是说他里边会记录一些他的成员变量的一些属性值, ok 吧?好到这里我们就知道了病的作用范围, 他实际上是控制我们并创建的实力的数量的。那到这里咱们这一节就讲完了,在这一节中我们讲了三个知识,首先并的基础配置, id、 class, 然后我们又讲解了病的联名的位置内幕,内幕用来控制一个病可以有多个名称,他和 id 的功能呢基本是等同的。 最后我们讲了病的作用范围,就是控制一个病创建出来是否是单例的对象。那么到这里呢,咱们就完成了病的基础配置的讲解。 这个时候呢,有人就会想到一个问题,我们现在这个单粒病是怎么造出来的呢?和我们以前的写法一样吗?也是用 no 的方式造出来的吗?有关这部分内容我们到下节再讲。
粉丝7.8万获赞29.1万

如何控制病的创建顺序?那么我们在开发的过程中间可能会遇到这么一种场景,就是我们需要呃某些病一定得在其他的很多病之前去创建, 那么什么场景呢?我这里大概举一个例子,比如说我现在这边有一个系统信息服务的一个病,那么我们说的信用信息啊,反正你可以理解的就是当前的应用的一些信息吧。那么像这种应用的信息首先可能会存在数据库,就是我这里需要用到 my benice 去把它查出来,查出来之后呢,我就会把它放到一个哈士麦口去缓存起来, 我们这里就用到了 supreme 的初始化机制。关于这个问题的详细文字版,我已经整理了一份八十万字的抓好名师大图笔记,放在视频的最后面,坚持看完一定对你有关注,然后负责去查,然后把它放到缓存里面。同时我还提供了一个静态的是 get 方法,可以更方便的从缓存里面去拿到对应的一些系统的信息,所以这是呃这个病对不对?那么很明显,假设我在其他 的病里面,比如说这里有个 case service, 那么他的初次化逻辑里面,他就会去获取系统信息,所以假设我们这个 cast service 他创建的时间点比较早啊,他优先于我们 cci info service 创建的话,那么这个病他在创建的时候,他会来执行初次化方法,然后会去拿信息,而且这个时候就拿不到啊,因为我们的 呃 c 神因否胜利时,他还没有穿件,然后穿件的对不对?所以这就会有问题啊。当然我们一般的情况下面我们会按照 spring 他这个书写的顺序去穿件,但是我这只是讲的呃大部分啊,或者说有可能他也不是 啊,这个其实不太确定,因为最终其实要看你的,呃编译出来的文件的真的那个 class 文件的顺序到底怎么样子的?包括你的操作系统的那个文件的排序的规则是怎样子的啊?最后,反正这个顺序是呃不一定的,所以我们看啊,比如说我现在的项目里面,我的创建的顺序其实就是他们三个依次创建, 所以我现在如果说来运行我们的代码的话,因为呃咖色位置里面会去拿,对不对?然后呢,周瑜设备时的出售外号里面也会去拿,所以我现在代码一跑,我们会发现,呃,第一个拿到的是空,第二个又能够拿到我们缓存里面的信息, 第一个就是咖色卫士这边他就是没拿到东西啊,所以现在要解决这个问题,那么怎么解决呢啊?首先呢,就可能想到的就是用呃这种 word 注解,对不对? survey 里面他有这么一个注解,但是呢,呃,这个注解他并不能解决我们的问题, 懂吗?你可能会以为啊,我设置一个优先级嘛,设置一个顺序嘛?对,那么你顺序高的,那你就先创建,比如说你一是不是优先创建我们这里所设置的这个二呢, 并不能解决的,我们看他就是还是拿到的是空,刚刚看了,对不对?那同样的假设,我把这个一把它改成三,对不对?那么是不是数字越大又信息越高呢?啊?也不是啊,所以他根本就不能解决我们的问题啊,我们这里只是快速的验证一下 拿到的还是空。对,所以说拿没拿到嘛,所以还是表示设备是,呃,这个 ces enforce 还是没有创建的好,所以这个注解解决不了。那么有没有什么注解可以解决呢?啊?有一个 depends on 的注解,他是可以解决我们这个问题的。比如说这个注解的意思是我现在要创建咖色 beats, 那么你得先去创建,因为这里表示了一种依赖关系 啊,我创建他设备时,你要先去创建我这边所依赖的那个设备时,那么你依赖哪个设备时呢?那不就依赖他吗?所以我就可以把这个设备时的呃这个病的名字把它写到这里来,首字母小写。哎,这样子其实就可以解决我们的问题啊,但是这种解决方案他只适应于呃像我们的这种场景,一个病优先于另外一个病 这种款式。但是如果说你现在假设有一个病他需要优先于很多很多的病的话,那么你就需要在很多的病上面都去写上这个注解,那就不太合适。对,那你写很多 这个注解啊,那么有没有更加通用的解决办法呢?也有啊,我们可以不使用这个注解来解决。那么用什么方式呢?这里就要去讲一些 supreme 的比赛原理啊,所以大家可以呃认真听一下啊。首先我们要知道我们刚刚说的咖 service 啊,包括 c c 英国 service 啊,包括周瑜 service 啊,他们最终 呃是怎么出来的?其实是被扫描扫出来的,而扫描它其实会针对你这边定义的这些类的信息去生成一个病敌肺类型的对象,所以它实际上我们说的这三个病,它一开始其实就会生成三个对应的病敌肺类型对象,然后把它放到一个历史的里面,在 spring 的内部放到一个历史的里面,然后 spring 它在基于你这个历史的里面的顺序 去真正的去创建一个一个的病啊,创建一个一个的病对象等等。所以呃,这个顺序其实就很重要,相当于说我现在就要去控制这个历史的里面的顺序,你现在历史里面的顺序可能是咖色位置在最前面,那我 我就需要保证 system 因否设备时你对应的便利费,那决定下在这个历史的最前面,这样子你就能够先穿件啊,就这么一个点。那么呃,怎么做到呢?我刚说了,在 spring 里面我们刚要说的这些,它是通过扫描扫出来的,那么我们有没有什么机制能够在扫描之前我就能够往这个历史的里面 放一些这种 benefit 写呢?哎,是可以的,这就需要我们自己去写一些些类啊,比如说你首先要写一个,呃容器的初始化器 啊,写一个这个啊,写一个类啊,实现这个接口。当然这个类呢你就需要定义在我们的 spring 点 fact 作为字母列里面啊,先定一下,表示你这里有一个 容器出水化气,自定义了一个,然后就重写一下它的方法,然后在这个方法里面你就会去添加一个 being factory poster process。 所以你这还要做一件事情,就是要去定义一个,自定义一个自己的 being factory poster process, 当你可以实现这个接口 啊,这这这个这个情况其实就是一个 infectory plus plus, 好吧?所以这个其实就是最关键的,相当于啊,就相当于说我现在在这个方法里面,我就可以自己去定义一个病体分类选对象,然后我就可以把它添加到识别容器里面去,所以这么一个注册病体分类选的方法,它相当于就是往我刚刚说的那个历史的里面去存一个 bd 分类型的对象,存到类似人里面去,懂吧?所以说啊,我只要能够保证啊,比如说你的这个方法啊,就是比如说在扫描之前执行这个方法的话,那么就能够解决我们的问题, 在扫描之前只用这个方法,你这里这个逆时的,你就是放在了,呃,你这里这个病的分类情况下,你就是放在了逆时的最前面,然后你再去扫描,你再去扫描的话,你就一个一个的,又把他们两个逆时的呃病的分类,先把它放到逆时的里面去,那自然他们就靠后了,懂吧?所以说这种啊,所以我们就通过这种方式呢,来把我们 c c n e f c h 去把它定义成为 一个病啊,我们就不需要在它上面再去加这种 confirm 的构解了,那么我们就在这个位置去把它定义成为的病啊,让它放到这个绿色的最前面去就可以了,所以,呃,这种机制它其实就能够保保证我刚刚所说的, 好吧,大家具体他怎么工作的,我可能这个短视频没办法很深入的给他去讲啊,咱我们先试一下吧,反正两步啊,自定义这两个东西,然后呢?在 spring 点 fact 是文件里面去配置一下就可以了。好吧,我们来试一下, 看能不能解决我们的问题啊?这样子的话,你的类到底怎么写的,你顺序到底怎样子的都无所谓,因为我通过这种方式,我直接就把 system service, 呃英否 service 这个病放到了最前面,我们就通过这这两个东西把它放到了最前面,那么自然就能够解决我们的问题。 所以说是呃这种解决方案啊,所以大家如果说对刚刚说的一些接口啊,对这个接口啊,包括像我刚刚说的兵 factory post pro 十三座椅接口,感兴趣的话,呃,这位老师,我这边是有一些呃课程的啊,有一些直播课啊,都是免费的直播课,所以大家如果说感兴趣,你可以呃在评论区留言,到时候我可以把 我这边因为我每天晚上八点都会给大家进行直播课的技术的分享,所以大家感兴趣的话可以在评论区留言,或者说想要这些代码的也可以在评论区留言。好吧,那今天就讲到这里。

病的实力化和病的初始化有什么区别?注意这两个概念,实力化和初始化这个不是指的我们 j v m 那个层面的概念 啊,比如说,呃,我们结尾 m 的实力化,大家应该都知道,就是创建出来一个对象,对不对?那么还包括结尾 m 里面有一个概念叫做初始化,这是类加载的过程,中间他会有三个步骤, 呃,有一个步骤呢,就是我们讲的初始化,该教程所涉及到的资料原码笔记,大家可以联系 up 主或在评论区领取。而这个初始化他,呃,比如说会执行你一个类里面的进他快里面的代码, 就是我们借给 m 乘级,呃,那个那个级别的这两个概念,我们现在讨论的是 supreme 这个级别的啊,就是病的实力化和病的初始化之间的区别是什么?而不要把跟他借给 m 的这个要要区分开来。好,那么我们来看啊,其实,呃,关于这两个概念,他其实跟病的 生命周期是有关系的啊,就是我们在用 spring 的时候,比如说像我们拿上面的代码来举例子吧,比如说我们 use service, use service, 它其实就是一个病,对啊,那么我们从容器里面可以把这个病对象拿出来,那么我拿出来的这个病对象,它到底是怎么创建出来的呢? 哎,这是我们在在在我们刚才讲的病的生命周期,那么我,呃,病的生命周期我这里不去非常就就就系统的给大家去讲一个面试题嘛,所以我就大概讲一句啊,就是首先 spring 肯定这个对象,他是 spring 去帮我们创建的。对,那么 spring, 比如说他怎么去创建出来这么一个 u 的设备时的对象呢?我们把它用作并对象,但他怎么穿越出来的呢?其实很明显他是不是得用你这个类里面的购车方法,比如说那个无偿的购车方法去得到一个对象,具体的在原码里面我也可以可以给他去找到,比如说在 supreme 的整个原码工程里面,他 会有一个非常核心的方法叫做度 creat 病,呃,很明显就是创建一个病对象,看到没有返回,只返回这个对象。创建一个病对象的核心的方法就在这里,包括这里面闯进来的就是你的 order service 啊, user service 它相关的信息,而 这个方法相当于一开始的时候他就会有呃这么一个动作,在这里创建病的实力,所以你就是其实就可以把这个方法理解为我们刚刚讲的病的实力化,病的实力化,懂吗?所以啊,不妨我们在这里去打个断点,大家来看一下,我现在执行我们的 test 剪刀剪它,然后就会照这边来嘛,所以我们往下面去走,当然了,呃,因为很多病它其实是在我施病容器启动的时候就会去创建,包括我现在讲的 youtube service, 它是非卵加载的单离病,所以它其它的创建的过程其实也是施病容器启动的过程啊,所以我们之前这样子,为了 呃大家看的更加容易看懂一点,我这里直接加一个条件,乱点啊,我们不关心其他病,我们只关心 youtube service 这个病他是是不是有没有进来啊?进来了看到没有 youtube service 好,我们具体的这个方法的细节我们大家看一眼吧,比如说这里会拿到类,拿到哪个类呢? youtube service, 找到这个类之后,他下面还有很多的代码。但是呢,呃,比如说我们看这个吧,他其实就最终会利用啊一些实力化,其实这里面我们直接点进去,然后点进去,你看他再往下面去走来,点进去啊,比如说就在上面,在这里点进去,他就会利用各种方法,通过反射的方式 来我们这里看,利用过程法反射去,就就就也不算反射,反正就是利用过程方法去得到了一个实力对象,对不对?所以说,呃,刚刚讲的这种刚刚讲的实力化,包括我们现在 dbog, 你可以回头来我们把这个方法执行完啊,你可以看一下最终的结果,他 里面解读柜啊,解下来这是一个 rap, 觉得拿到这个 rap 对象之后,他会把它包装的包裹的那个具体的实力,就是具体的实力对象把它拿出来,就这个病。那么这个病是谁呢?他是我们的 user, 意思看到没?所以我们讲的病的实力化其实很好理解, 就是 spring, 他在创建一个对象的时候,他根据你这个类的购置方法去得到得出来的一个对象,这就是病的实力化。通过购置方法得出来的一个对象,而得出来一个对象,这个过程就叫做病的实力化。那么到底什么是病的 初始化呢?啊?我们不妨直接来接这个元宝看,因为这是先进行的实力化。对,那么紧接着那个往下面走,往下面走,其实这个地方就是进行引来注入,然后再往下面走,这就有初始化。所以什么是病的初始化呢?其实就这个步骤好,那么这个方法里面他是干嘛的呢?他就执行 over 方法执行,呃, 包括初始化前的方法,这里还有一个初始化,所以我们通常讲的初始化,其实这里懂吗?初始化前,呃,有初始化后,那我们通常讲的初始化呢?我们应该理解为这个地方,那么这个方法里面他到底要在干嘛呢?其实你看你前面不是得到了一个对象吗? 对于这个对象,对于 supreme 来说,他不管你的类型是什么的,你是 order service 也好,你是余额 service 也好,反正我就把你穿进出来,然后穿进来,穿进来之后他会干嘛?他会去判断你这个对象有没有实现,这是个借口。 indish 来自并, 这是个接口,注意他判断出来了。如果说你这个对线你实现了这个接口,那么这是 two, 如果是 two 他就会进来,进来他会判断你有没有开启安全管理器,如果默认是没有开的,没有开,他会进到下面来。 其实这个代码什么意思?你如果传进来的时候, order service 或者 u service, 它强制转换成为这个接口类型,因为你不是实现的这个接口吗?对不对啊?所以说我就直接强制转换啊,因为这个 接口是 supreme 提供的。好吧,所以我就代码完全可以这么写,然后再来调用这个方法实现这个接口里面的方法。所以如果说你遇到这个意思,你现在实现呢?我们 indiso 来自并的这个接口,那么啊,你肯定就去实现这个接口里面的方法,那么这个方法什么时候执行呢?哎,就是我们刚刚看的代码,就是在相当于,就是在我们 创建并的过程中间,他先进行的实力化,然后后续就会进行并的初始化,而并的初始化他其实就是去执行你前面实力化出来的这个对象里面你实现的这个接口的这个方法,这就是我们讲的初始化。说的再简单一点,并的初始化其实就是执行这个方法, 就只是你当前这个对象里面的这个方法。当然了你一定要讲的话,其实还有啊,你再往下面看,比如说,呃,这是我们刚刚看的,这,这是前面这一段,对,我们再点进去啊 来,这是前面这一段代码,那么他执行完这段代码之后,他后面还有他相当于后面,因为我们如果说用呃,那种 x 秒的方式的话,我们知道我们是不是可以用艾特病的标签,呃去定义病也可以,对,那么我们在这个标签里面可以干嘛?你可以去指定一个方法, 指定你当前这个类里面的某个方法,而这就是指定的初始化的方法。那么你指定的这个方法他会在哪里去调呢?就是在我们一样的,就是在刚刚这个过程里面,因为他后面的他会去判断说你有没有指定 initio, 呃, init mass 的,如果说你指定了,那么他就会执行你指定的那个方法, 懂吗?其实归根到底就是执行方法,要么是执行这个方法 off the properties set, 要么是执行你指定的方法,而不管怎么样他执行的都是你当前某个病里面的方法,要么是这个方法,要么是你指定的一个方法懂不懂? 所以说说实话其实就是执行我单间并对向里面的对应的那个方法,呃,所以说就是这个过程啊,所以,呃不妨我们也可以来试一下,比如说我现在这个方法在这里,但是我并没有手动的去执行什么 up propts 赛的这个方法,包括我这地方我我刚说了我都不用去执行,你看我都不去拿这个预热设备时,因为我前面说了 youtube service 它现在是单立并是 fin 两家载的单立并。所以说它在什么时候创建呢?它会在我私奔容器启动的时候创建, 而是不是容器启动他去创建娱乐设备时的病。而在创建娱乐设备这个病的过程中间他会先进行实体化,进行实体化他会进行初始化,他从而就会来进行这个方法, 所以我只要运行这个泰式的,我家什么都不用动,哎。我们刚刚那个 after properties 晒的方法他就会被执行,你看这里擦擦擦就出来了,看到没?所以,呃整个过程其实就是这样子的,就这个料,但这个方法 你具体该怎么去实现你自己任意的去实现都可以,比如说你甚至去抛异常都没有关系啊,反正你如果抛异常的话他也会把这个异常把它给抛出来啊。只不过我们通常呢会在这个方法里面可能会去做一些 验证性的动作啊,比如说去验证我当前这个对象里面的是某个属性呢?是不等于空啊?对,你可以这么写吗?啊?比如说某个属性啊,是不是等于空啊?如果等于空,哎,我就抛一茬呀,这样就我们可以去做一些验证性的动作, 懂不懂啊?所以说反正你在这行里面你想做什么都可以啊,没有任何限制,想做什么都可以,所以,呃,这是我们刚刚讲的这两个概念啊,希望。呃,不知道大家有没有问题。

今天我要给大家说说 spring 中的兵是现成安全的吗?首先声明一点, spring 中的兵对象是否现成安全与 spring 容器本身无关, spring 只是帮我们创建和管理兵而已, 但是 spring 中的兵对象是否现场安全,我们可以通过兵的作用欲来分析。 spring 中的兵的对象有多种作用欲,其中我们最常用的作用欲有两种, singleton 和 prototype 及单例病和圆形病。可能很多小伙伴潜意识里老是会觉得单例病就是县城安全的,而圆形病就是县城不安全的,其实这是完全不对的。首先让我们看一下圆形病使用了该作用于的病对象并不会被 spring 所管理, 并且每次从使命容器中获取兵对象时都会创建一个新的对象实力,由此可见,圆形兵的对象实力并不会被多个县城所 梦想,所以圆形病是现成安全的。接着让我们重点看一下单立病,单立病一般分为两种,非揽加载的单立病和使用了雷贼朱姐声明了的揽加载的单立病。其中非揽加载的单立病在 spring 容器启动时就会被创建, 而懒加载的单立并只有在使用的时候才会被创建单立并创建完成之后会被放入到单立池中进行存储,用于保证在 spring 容器中只会存在一个对象实力。 既然单立病在使命容器中只会存在一个对象实力,那么他就会被多个县城所共享。一个对象实力被多个县城所共享,就会存在县城安全的隐患,这主要取决于该单力病是有状态的单力病 还是无状态的单例病。所谓无状态的单例病就是没有成员变量或者仅存在只读的成员变量,反之就是有状态的单例病。无状态的 单立病是县城安全的,而有状态的单立病则是县城不安全的。接下来让我们做一下总结。 spring 中只有有状态的单立病才存在县城安全的问题。此时面试官可能还会追问,怎么保证这种有状态的单立病的县城安全呢? 一般有如下几种方案,一、使用县城安全的工具类,比如原子类、县城安全的容器类, spreadlocal 等。二、尽可能的避免在单立并中使用共享的成员面量。三、将单立并改为圆形,并小伙伴们关注威哥,更多精品内容持续与你分享!

spring 构建 bin 的 方式有哪些?最传统的方式就是使用叉 mail 配置文件,通过叉 mail 配置文件中定义 bin 的 配置信息, spring 容器会根据配置文件中的信息来创建和管理 bin, 其次就是使用注解, 我们通常在类上使用注解,比如说 at component 注解, at controller 注解, at service 注解,那 spring 容器会自动扫描并创建相应的币。另外呢,就是使用 java 配置类,使用 configuration 注解来标记我们这个配置类, 在方法上使用艾特 bin 注解,然后我们定义这个 bin 的 创建方式, spring 会根据配置类中的信息创建和管理 bin, 这些是最常用的。另外就是一些用的不多的场景了,比如说你通过实现 factory bin 接口来创建 bin, 这种更适合。呃构建复杂的对象还有花火,我们可以通过实现某一个复杂的接口来动态的注册并然后这个接口允许在我们这个 spring 容器里面去动态的添加修改或者删除并的定义。

面试官问,单立病和单立模式有什么区别?那他们都是为了保证同一个对象只实力化一次而生的,那单立病呢?他运用到了单立设计模式,病他默认是单立的,他只会实力化一次,下次或许如果存在呢,就直接返回, 不会再重复的创建了。那么单立模式也是一样的,只会创建一次,下次获取,如果存在呢,直接返回。但是它们单立的维度是不一样的,单立模式它是根据类来决定是否存在,就是保证在 g m 当中, 同一个类只能有一个直立对象才是单立。而单立病的维度它是以病的名字来决定的,如果是不同的病 name, 就 会创建 多个单立病对象,所以单立病保证的是同一个病 name 创建一个对象。所以最后记住,虽然单立病它运用了单立设计模式,但是它们的维度不一样,单立设计模式以类为主界,而单立病它是以病 name 为主界。单立设计模式它保证的是在 gvm 当中,同一个类 只会实力化一次,无论你调用多少次,返回的都是内存当中的同一个应用地址。而单立病呢,哪怕是你同一个类,只要是病的名字不一样,就会实力化多个对象,希望大家能够记住。 那如果最近你需要去面试,我这里准备了一份一百万字的高平面视资料,里面包含了 java 所有主流技术站的高平面视题,开放性的设计题,项目场景题,还有各个工作年限的简历模板,以及我最新整理的 ai 相关的面试题,拿到能帮你节约很多的时间。那我就给大家分享到这里,我们下期见。

spring 构建 bin 的 方式有哪些?最传统的方式就是使用叉 mail 配置文件,通过叉 mail 配置文件中定义 bin 的 配置信息, spring 容器会根据配置文件中的信息来创建和管理 bin, 其次就是使用注解, 我们通常在类上使用注解,比如说 at component 注解, at controller 注解, at service 注解,那 spring 容器会自动扫描并创建相应的 bin。 另外呢,就是使用 java 配置类,使用 configuration 注解来标记我们这个配置类, 在方法上使用 at bin 注解,然后我们定义这个 bin 的 创建方式, spring 会根据配置类中的信息创建和管理 bin, 这些是最常用的。另外就是一些用的不多的场景了,比如说你通过实现 factory bin 接口来创建 bin, 这种更适合。呃,构建复杂的对象 还有花火,我们可以通过实现某一个复杂的接口来动态的注册并,然后这个接口允许在我们这个 spring 容器里面去动态的添加,修改或者删除并的定义。下面 呢,我来给大家介绍一下马氏教育 m c a 高级架构师精选面试题库这套包含两百多万字的八股面试宝典啊,那么经过很长一段时间的系统整理呢,我们终于形成了今天大家看到的这套百万字级别的八股面试宝典。 目前这套八谷面试宝典它包含一千六百多个文档,两百二十多万字。后续呢,我们还会持续不断的向这套八谷面试宝典里面增加题目,相信未来他的文档个数还有字数呢,还会持续不断的增加。 那么下面我来给大家介绍一下这套面试宝典中包含的内容啊?那它包含大病发的呃,面试内容,还有大数据的面试内容,还有大模型相关的一些面试内容。 那么当然不仅仅拘泥于此,还包含一些啊,包平的大厂的核心面试题型,还有一些架构体系、技术站核心知识点的一些内容讲解,我这里都已经给大家系统的整理到了这一套百万字级别的面试宝典中,所以有需要的同学抓紧去联系班主任或者是找你的咨询小姐姐去领取。免费领取啊!

如果把 spring 容器比作一个大型工厂,那么病是产品,而病的芬尼省就是产品的一个设计图纸。很多同学只知道病,却忽略了病的芬尼省,这其实是漏掉了 spring 最核心的一个原数据管理机制。今天我们就来拆解这张图纸里面到底画了什么。 如果你还在盲目刷题,不知道面试到底考什么,我已经把简历优化模板,把古文高频题库面试全流程硬的策略途径、学习路线图全都打包整理好了,覆盖从头递到谈心的每个环节,需要的评论区扣六六六直接领走。 原来说病得芬尼省是 spring 中定义病的一个顶层接口,它抽现了我们对病的所有的描述。无论你是用叉 ml 配置的一个病,还是用注解写的 at component, 甚至是 java config 里面的一个 at 病,在 spring 哪个内部,它们最终都会被解析红 已封装成一个个病在分离省的对象。这张图纸里面具体记录了哪些信息呢?主要包括五大类,第一,病哪个类信息全限定类名,告诉公产要造哪个类的一个对象。第二,作用域是当利还是多利?第三,生命周期的毁掉,处事化方法和销毁方法。四、依赖关系,这个病依赖了哪些其他的病已 属性值?第五,行为配置是否是懒,加载是否是主要的一个候选者等等。理解了定义,我们再看它在 spring 启动流程中的位置。 spring 容器启动时,第一步并不是创建并,而是加载 bin 编辑省。第一,扫描,通过 bin 编辑省 read 读去叉 ml 或扫描注解, 这儿注册,将解析出的一个 bin 编辑省注册到 bin 编辑省引用之中。第三,实力化容器根据这些 bin 编辑省的图纸 仿设创建出真正的一个病的一个实力。正是因为有了这一层的抽象, spring 才能支持多种多样的一个配置方式,而底层逻辑却不需要去改变。在实战中了解病待分离省有什么作用呢?它的最大价值在于动态注册病, 比如在一些复杂的中间建开发中,我们可能无法预知用户会创建哪些。 seris 就是 我们可以实现 ingrid 的 病待分离省接口在运行时动态构建病待 needless 并注册到容器中。像 mybites 的 myeper scan 就是 利用这个机制扫描接口定动态生成病的一个定义的,这就是从写死代码到动态生成的一个之变。

spring 中声明类为病的几种组件 add control 了一般用在控制层, add service 一般用在业务层 add a responsory 一般用在持久层。 add a component 一般用在公共组件上。 其中设为是 ctrl 和 repostery 都是继承于 compone 的组建。我们也可以是代码中定义自己的组建,通过继承 compone 的组建能够实现与设为是相同的能力。每日一问,以上形式生成的病是现在安全的吗?

spring 的配置呢,咱们已经告一段落了,那接下来我们就要来发挥 spring 它的强项了,简化开发, 那么如何做呢?在第一节的时候给大家说过,他提供了一系列的注解,使用注解就可以加快他的开发速度,那从这节开始,咱们讲解 spring 的注解开发。在注解开发这一节中,我们将讲两个东西, 从 spa 二点零开始, spa 逐步提供了各种各样的注解,那么到了二点五的时候,注解就比较完善了,所以我们先学习如何使用 spa 二点五所提供的这一系列注解来简化我们的开发。到了 spa 三点零的时候,推 推出了纯注解开发,咱们的第二个内容就围绕着纯注解开发来进行讲解,那接下来呢,咱们就进入到我们的哎第二中来讲解这块内容,现在大家看到的这个模块呢,和我们前面做的入门案例是一样的, dao so is 注入 dl 配置文件中仅配置了一个 dl, 然后程序呢,我们获取到 dl 的病以后呢,打印他来,我们先运行看一下效果, 运行完毕以后呢,咱们看一下,只要对象出来就行了。好,那接下来呢,咱们就来看一看如何使用注解的形式来开发此部用程序。 在配置中呢,现在仅仅配了一个 do 的病,那我们就先做第一件事,把它改造成注解开发的 分析。这一行里边有三个信息,第一,配置一个并,二配置的并设定他的类型。三,给他起个名称。那如果把这一行删掉以后, 我们想这三个信息也都要存在,那这些信息写在什么地方呢?不写到配置文件中,我们就要把它写到类里边,由于是对这个类配置成并,所以说第一要想到的就是在这个类里边写。 怎么写呢?在它上面加一个注解, at component c o m p o n e n t component 什么意思呢?叫做组建,把它写上以后就代表了哪一句话呢?就是这句话就有了。现在我们就 配置了一个并,但是并没有给他起名称,如果想起名称怎么做?在他后面加括号,写上他的名称就可以了。比如说不可 dao, 我们可以点开 combanonte 的圆码去,在这里边看到他提供了一个歪六属性,由于歪六属性默认可以不写,所以说我们在这里边直接使用这个格式就 ok 了。好,把这儿写好以后, 新的问题出来了,按照这种形式,这个币你已经配完了,那这句话就可以删除了。但是 spa 的配置文件怎么知道他这写了个这东西呢? 换句话说,你随便找个类写个这东西就行吗?看来我们得让 spa 用容器感知到你这写了这么个东西, 怎么办呢?我们就要去搜索他,找他。因此在 spa 用的配置文件中提供了一个标签,注意这个标签是属于 ctrl text 命名空间的。怎么写? ctrl text 的冒号 去找我们的组件叫做 component c o m p o n e n t。 杠死看,什么意思?扫描,哎,也就是说我们去扫描组件,你这边不是配组件了吗?我这边来扫描他,那扫的时候扫哪呢? 要让你指定一些信息在这里边。第一项 base package 就是让你指定他对应的位置,那么在这呢,我们可以这样写, come 点 it 黑马,点 d, 收点音炮,这样就指定到了这个类所在的位置,就可以扫到这句话了。来,我们先来运行这个程序,注意观察,现在我这里边已经没有定义并了,在这运行看看效果。运行 运行完毕以后呢,我们就看这个对象拿到没拿到,是不是已经拿到了,到这里呢,我们就已经完成了使用注解配置,并好在这回来说这么一件事啊,这一句话,指定的包已经到了这一集了,如果你想简单一点 这样写,他就会扫描 com 掉 it 黑马包下面的所有的类,以及他的子包中的类,也就是说他下面所有东西,他都会挨个的去扫一遍,地规的去查找一遍。所以说一般我们写成这样的格式 就行了。有人说我写 come 行不行,没有问题,但是一般没这么写的啊,就基本上就是写你的组织名称,然后从这几开始扫,再来运行一下,看看有没有问题, 来看一下是不是也没有问题啊。那按照这种形式,你是否能够把 c 位死的也进行配置呢?来,咱们试一下,打开 s o s, 在这里边我们写上一个 at component, 那么这一次我在写他的时候啊,我不加这个括号,不指定名称,能不能加载上呢?他也是可以的,那在我们这边写的话,就要变一下格式了,来, 不可收回事,不可收回事等于 cts 点 get 病,注意你用名称访问不行了,你这个时候用什么访问?类型前面学过吧, 不可收回,死点儿 class。 哎,我在这里边按类型来找你,接下来我们打印他,看一下有没有就行了啊,来运行一下, 运行完毕以后呢,应该打印输出两行才对,我们把这句话给他注掉,再来运行,这一次他还能找到吗? 他就找不到了啊,我们来看一下爆出没有这样的一个并定一,然后后面说了哪一个,他说类型是这么样的一个并。好了。到这里呢,咱们就已经完成了并的定义。回到资料上, 对于我们配置病来说两步,第一,在你要配置的病上面写艾特 comber 呢,可以给他指定名称,这个名称你可以把它理解为 id, 然后在核心配置文件中加上 一个 comenent 的斯,看看清楚啊,这两个东西是对应的,这边叫 comenand, 这边叫 comenandceco。 你写的时候呢,就是 at c 就能找到他了啊。好,到这里呢,咱们这个病的定义就已经说完了,那么在这说这么一件事啊, spring 呢,给我们提供了艾特 combine 的注解的三个衍生注解,啥意思呢?就是他说呀,你都写艾特 combine 呢,你可能分的不是太清楚,这样我给你三个衍生注解,你能分的更清晰。来说一下, 他建议你啊,对于业务层的病定义的时候不要用 at common 的,用 at service 什么作用呢?和使用 atcom 的完全一样,只不过 通过这个名你就知道了啊,这是个业务层的病,那对于数据层怎么写呢?哎,在这写这么一个东西,叫做 at repository r e p o s i t o r y。 什么意思?仓库的意思, 那这里边解释为数据仓库,所以说这是数据层的,那表现层我没有写怎么写?艾特 ctrl 了控制器 t r o l l o k 吧。注意啊,这三个注解啊,其实都和艾特康博的功能一样,只是方便我们理解的啊。来把它去掉了,然后上面这行我注掉,现在来看一下, 这个已经注掉了,这个也注掉了,那么把这个名称呢?也给他,不然我的程序没法运行啊。来,我们再来运行一下,看看这次是否能够正常的访问啊,没有问题吧, 这边一个是按照名称访问,一个是按照类型访问。好了,到这里呢,我们就完成了第一件事,就是使用注解的形式来定一并。

粉丝投稿, spring 中闭印的创建顺序该如何有效控制?很多人踩坑是因为误以为闭印创建全靠 spring 随机调度,其实不是的,下面我们一起来看看能直接落地的回答。在 spring 框架里面,我们要去自己控制闭印的创建顺序是一个比较常见的需求。为了帮大家更系统性的准备面试, 我整理了包括各阶段的面试题,加完面试图及学习路线,以及精选的简历模板,需要的是粉幺二三双手奉上。举个例子,现在我有两个对象,第一个呢是 service a, 第二个呢是 service b, 并且我都会给到我们的 iuc 容器去管理,我都加了 come point。 好, 在 a 这个对象的时候,我们需要去拿到 service b 的 一个 name, 就是 一个名字,但这个名字是在 service b 创建完了,说实话以后才会赋值灰灰的好,本来我要在 a 里面,我要拿到这个灰灰的值,并且我要打印出来,但是因为我 service a 可能在 service b 之前去创建, 那么创建的时候 service b 因为还没有创建,所以它不会去调用到这个复制的过程,我们启动一下,你会发现我是拿不到这个灰灰的,你看我打印出来的是呢,这种问题我怎么解决这种问题?我希望我的 service a 要在 service b 之后才去创建,因为我 service a 它去依赖于 service b 里面的内容,有两种方式, 第一种就比较简单,我可以在对象 a 里面去加,我依赖于哪一个对象好,有一个例子啊,例子啊,就是我去告诉我们的 i o c 容器,我这个 service a 去创建的时候,我要依赖于某一个对象,那么假如说我依赖于 b 这个对象,我们可以去传一个 value, 那 么这个 value 就是 我对象的 key。 好, 假如说叫 service b, 因为在我们的 i o c 容器里面,我们的 key 都是我们的类的名字的一个图分好, 这个时候我们再去启动,那么就能够去拿到我的灰灰了,因为我能确保 service a 在 创建的时候, service b 一定是创建完成的。好,你看就拿到了灰灰。第二种方式就稍微复杂一点,需要我们对 spring 的 底层有一定的了解。 在 spring 里面,我们的对象的创建都是基于 beinflation map 里面去拿的, beinflation map 里面它的一个集合顺序是怎么样子的?那么我们对象创建的时候,它的顺序也就是怎么样子的?那 我是不是可以去控制 bing deflash 里面的一个顺序?那么假如说我 surface a 跟 surface b 这两个对象,我希望它有一定的顺序,那我是不是可以去放的时候也按照顺序去放到我们的 bing deflash 里面?而 spring 它提供了这样子的一个接口 叫 bing deflash register post process 接口有一个方法,这个勾子方法,那么能够去指定我的对象往 bing deflash 里面去加。好,我们来演示一下, 那么这个时候我就不需要通过注解的方式去把它放到 i c 文件了,因为我们会手动地给到 bin deflash 这样子的一个集合。有一个钩子方法来,我们去实现我们的一个 bin deflation register post process 的 一个接口,它里面有个方法来,就这个方法 post process bin deflation register, 我 们可以去把我们的 surface a 跟 surface b 按照我们想要的顺序注册到我们的一个 map 里面去,你看就很简单,我去创建的时候,先去拿到 b, 再拿到 a。 同样的,我们是可以怎么样把灰灰打印出来的?你看也打印出来了。那为什么我需要第二种?很简单,因为第一种一辈子二的方式,那么他只适合一对一,我依赖于某一个对不对?好,但是我用第二种方式,那么他更加的灵活,他能够去指定多个对象的一个顺序。