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

25 篇文章 1 订阅
4 篇文章 1 订阅

你再不知道就晚了!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 写一段告白,述几句骚话@

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

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

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

 

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Spring 中,bean 子标签中的 property 标签用于设置一个 bean 的属性property 标签中的属性包括: 1. name:属性名,用于指定要设置的 bean 的属性名。 2. value属性,用于指定要设置的 bean 的属性。 3. ref:引用,用于指定要设置的 bean 的属性是另一个 bean 的引用。 4. index:索引,用于指定要设置的 bean 的属性是一个数组或 List 的元素,需要指定元素的索引。 5. key:键,用于指定要设置的 bean 的属性是一个 Map 的元素,需要指定元素的键。 例如,下面是一个使用 property 标签设置 bean 属性的示例: ``` <bean id="person" class="com.example.Person"> <property name="name" value="John"/> <property name="age" value="30"/> <property name="address" ref="address"/> <property name="hobbies"> <list> <value>Reading</value> <value>Traveling</value> <value>Photography</value> </list> </property> <property name="skills"> <map> <entry key="Java" value="Expert"/> <entry key="Python" value="Intermediate"/> <entry key="SQL" value="Beginner"/> </map> </property> </bean> <bean id="address" class="com.example.Address"> <property name="street" value="123 Main St"/> <property name="city" value="New York"/> <property name="state" value="NY"/> <property name="zip" value="10001"/> </bean> ``` 在上面的示例中,我们创建了一个名为 person 的 bean,并设置了它的五个属性:name,age,address,hobbies 和 skills。其中,address 是一个引用类型的属性,指向另一个名为 address 的 bean;hobbies 是一个 List 类型的属性,包含三个元素;skills 是一个 Map 类型的属性,包含三个键对。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值