你再不知道就晚了!SpringBean的property属性值使用ref与value的区别
Posted 四原色
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你再不知道就晚了!SpringBean的property属性值使用ref与value的区别相关的知识,希望对你有一定的参考价值。
你再不知道就晚了!SpringBean的property属性值使用ref与value的区别
一般赋值或者加载配置文件的的时候使用value,引用或者注入的时候使用ref(下面都是骚话!别看)
目录
你再不知道就晚了!SpringBean的property属性值使用ref与value的区别
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时进行验证,这样是错误的,为什么呢?
- 了解了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的区别的主要内容,如果未能解决你的问题,请参考以下文章