你再不知道就晚了!SpringBean的property属性值使用ref与value的区别

Posted 四原色

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你再不知道就晚了!SpringBean的property属性值使用ref与value的区别相关的知识,希望对你有一定的参考价值。

你再不知道就晚了!SpringBean的property属性值使用ref与value的区别

一般赋值或者加载配置文件的的时候使用value,引用或者注入的时候使用ref(下面都是骚话!别看)


目录

你再不知道就晚了!SpringBean的property属性值使用ref与value的区别

1 我想先说...

2 你知道吗?

3 是时候来聊一聊ref与value了!

4 写一段告白,述几句骚话@


 


1 我想先说...


细心的小猴子总能发现一些非同寻常的小细节

就像心细的你能看到我的作品

家人们或许在Bean对象的时候会考虑很多问题

就像今天中午在食堂打饭不知道在哪个窗口点菜一样

彳(chi)亍(chu),彷徨!

同学会告诉到哪点菜都一样,反正只要点菜

但是小朋友,你是否会有很多问号?

这样点菜真的合适吗?

要是知道哪个窗口具体情况是不是更好呢?


  不要盲目打菜就像不要盲目使用ref和value一样重要!


2 你知道吗?

一般赋值或者加载配置文件的的时候使用value,引用或者注入的时候使用ref


 

value与ref对照表


ref引用已经存在的对象;value创建新的对象;
ref可以引用其他的bean对象 ;value可以赋一些简单类型的值;
使用ref的时候,spring容器会在引用后进行验证,验证当前的xml是否存在引用的bean ;使用value的时候,spring会在容器启动,实例化bean的时候进行验证;

 

 

 

 

 


  • ref:引用的这个对象(可引用其他的bean对象)

例如:

<property name="dataSource" ref="dataSource"/>

<!--ref="dataSource"就是引用dataSource的bean,-->
<!--通过直接引用dataSource的实例化对象的基础上实例化SqlSessionFactoryBean-->

 

  • value:引用这个对象名字的字符串;直接设置一个值(赋一些简单类型的值)

例如:

<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--sqlSessionFactiory的构造过程主要注入了Configuration的实例对象时-->
<!--加载value值指定的配置文件-->

 


 

3 是时候来聊一聊ref与value了!

3.1 你一定会熟悉以下代码吧!

定义数据源->配置sqlSessionFactorybean->扫描mybatis接口进行装配。

3.2 可以模糊的看到:这个数据源的name是datasSource,对于这个bean的属性都是使用value,

我们在这里对这些属性赋予一些简单类型的值,driverClassName赋予一个类名,url赋予一个字符串,其他同理。

如果使用ref的话就有问题了,Driver是已经存在的对象吗?不,不是。他也没有引用到其他bean!

 3.3 配置spring文件的时候,我们为什么需要先配置数据源再配置sqlSessionFactory?

不难?你一定知道查看SqlSessionFactoryBean的源码吧!

参考:源码分析

  • 实例化SqlSessionFactoryBean前必须确保dataSource属性已经得到配置!

3.4 不难得知

使用ref引用dataSource,如上面定义的数据源,这个bean已经在当前xml文件中被定义,此时将这个dataSource的数据源对象注入到sqlSessionFactory中。查看源码后我们可以知道 实例化SqlSessionFactoryBean前,必须确保dataSource属性已经得到配置,通过ref注入这个已经实例化的bean后才能确保实例化SqlSessionFactoryBean,扫描控service包下的注解类,将这些类注册到spring的bean中。

 3.5 不仅如此
 


使用ref的时候,spring容器会在引用后进行验证,验证当前的xml是否存在引用的bean ;

使用value的时候,spring会在容器启动,实例化bean的时候进行验证


参考配置sqlSessionFactory时配置dataSource:


  • 当使用ref时,spring容器会立即进行验证,查找当前xml下是否存在这个bean,

很明显,当然存在了,所以Idea弹出了提示(太强大了,我们江老师直夸idea好用),

  • 但是当我们使用value时它就不会给出这个提示了,

此时会引用这个对象名字的字符串在sping容器启动后实例化bean时进行验证,这样是错误的,为什么呢?


  1. 了解了org.mybatis.spring.SqlSessionFactoryBean的底层源码后我们知道

(1)生产sqlSessionFacoty 使用了建设者模式(Builder)

(2)实例化SqlSessionFactoryBean前必须确保dataSource属性已经得到配置,也就是说, sessionfactory基于dataSource上建立的。datasource是注入给sessionfactory的,然后关联到session中。

(3)在使用value是,实例化SqlSessionFactoryBean后实例化dataSource,此时不符合这个基本的原则,直接导致抛出异常500,因为很简单啊,这个时候sessionfactory并非基于dataSource建立的,dataSource是在sessionfactory实例化之后,这个时候我们队dataSource进行验证的话,我只能说为时晚矣!

 

3.6 你也可以

去思考configLocation的配置过程,这里话不多说,点到为止

sqlSessionFactiory的构造过程主要注入了Configuration的实例对象,加载value值指定的配置文件。

4 写一段告白,述几句骚话@

骚话不多有,代码常更新!

浏览到此处,家人快三连!

点赞收藏加关注,爱你么么哒~~~

 

以上是关于你再不知道就晚了!SpringBean的property属性值使用ref与value的区别的主要内容,如果未能解决你的问题,请参考以下文章

2021年Android进阶者的新篇章,再不刷题就晚了!

再不跳槽,就晚了

3月再不跳槽,就晚了

2月 再不跳槽就晚了

3月 再不跳槽就晚了...

360°深入了解spring,再不刷题就晚了!