了解Spring中bean对象的属性注入细节

字面值注入

value 属性或者value标签可以设置为字面值,字面值可以是字符串或者基本数据类型,其他类型不能使用字面值

	<bean id="car3" class="com.wanee.di.Car">
		<property name="color">
			<value>black</value>
		</property>
		<property name="price" value="400000"></property>
	</bean>
	
		<!-- 
			- 注意点:如果车的品牌<Benz>,虽然是字符串,但是<>是xml中的特殊字符,表示标签的开始和结束
					这个时候我们可以使用CDATA标签将特殊字符包裹起来,如<![CDATA[<Benz>]]> 实际的值就是 <Benz>
					以后凡是在xml文件,需要用到特殊字符,都可以使用CDATA标签进行包裹
		 -->
	<bean id="car3" class="com.wanee.di.Car">
		<property name="barnd">
			<value><![CDATA[<Benz>]]></value>
		</property>
	</bean>
	

引入其他的bean

ref 或者ref标签: 表示引用其他的bean

	<bean id="person" class="com.wanee.di.Person">
		<!-- 
			使用property标签完成属性注入
				name : javaBean风格的属性名,就是setter方法对应的属性名
				value 或者value标签: 给属性设置的字面值[String,基本数据类型]
				ref 或者ref标签: 表示引用其他的bean
		 -->
		<property name="age">
			<value>19</value>
		</property>
		<property name="name">
			<value>白骨精</value>
		</property>
		<property name="car">
			<ref bean="car3"/>
		</property>
		
		<property name="car" ref="car3"></property>
	</bean>


	<bean id="car3" class="com.wanee.di.Car">
		<property name="color">
			<value>black</value>
		</property>
		<property name="price" value="400000"></property>
	</bean>

需要注意:我们现在不管使用ref属性还是ref标签去引用其他的bean,这个其他的bean是外部的bean,而且这个外部的bean也可以被其他的bean进行引用。在实际开发中,可能存在一种情况,一个对象引用的bean,不希望被其他对象引用,这个时候可以使用内部bean。

内部bean

<bean id="person" class="com.wanee.di.Person">
		<property name="age">
			<value>19</value>
		</property>
		<property name="name">
			<value>白骨精</value>
		</property>
		<property name="car">
			<!-- 定义内部bean:一个bean被定义在另外一个bean的内部,而且这个内部bean不能够被其他的外部bean引用 
							既然不能够被外部bean引用,那么这个内部bean的id属性就没有意义,可以省略
			-->
			<bean class="com.wanee.di.Car">
				<property name="barnd">
					<value><![CDATA[<Benz>]]></value>
				</property>
				<property name="color" value="black"></property>
				<property name="price" value="400000"></property>
			</bean>
		</property>
	</bean>

构造注入中使用内部bean

<!-- 
		在构造注入中使用内部bean
		public Person(String name, Integer age, Car car) {
	 -->
	<bean id="person1" class="com.wanee.di.Person">
		<constructor-arg value="jjm"></constructor-arg>
		<constructor-arg value="30"></constructor-arg>
		<constructor-arg>
			<bean class="com.wanee.di.Car">
				<property name="barnd">
					<value>Chery</value>
				</property>
				<property name="color" value="gold"></property>
				<property name="price" value="50000"></property>
			</bean>
		</constructor-arg>
	</bean>

集合属性的装配

Spring配置文件中,可以使用一组内置的xml标签来配置集合属性

  • array标签:可以装配array,list和set属性

  • list标签: 可以装配list,set和array属性

  • set标签:可以装配set,list和array属性
    实际开发中,还存在一种情况:array,list或者set如果装配了外部的其他bean,但是除了外部的bean之外, array,list或者set还需要装配其他的bean,而且其他bean可以不被外部访问到,那么意味着可以装配内部bean

  • map 标签:装配map属性

private String name;
private Integer age;
private Car[] carArray;
private List<Car> carList;
private Set<Car> carSet;
private Map<String,Car> carMap;
private Properties myProps;
	<bean id="car1" class="com.wanee.list.Car">
		<property name="barnd" value="Benz"></property>
		<property name="color" value="gold"></property>
	</bean>
	
	<bean id="car2" class="com.wanee.list.Car">
		<property name="barnd" value="BMW"></property>
		<property name="color" value="white"></property>
	</bean>
	
	<bean id="car3" class="com.wanee.list.Car">
		<property name="barnd" value="Audi"></property>
		<property name="color" value="black"></property>
	</bean>


	<bean id="person" class="com.wanee.list.Person">
		<property name="name" value="lzd"></property>
		<property name="age" value="18"></property>
		<!-- 装配数组 -->
		<property name="carArray">
			<array>
				<ref bean="car1"/>
				<ref bean="car2"/>
				<ref bean="car3"/>
				<!-- 内部bean -->
				<bean class="com.wanee.list.Car">
					<property name="barnd" value="Chery"></property>
					<property name="color" value="gold"></property>
				</bean>	
			</array>
		</property>
		!-- 装配list -->
		<property name="carList">
			<list>
				<ref bean="car1"/>
				<ref bean="car2"/>
				<ref bean="car3"/>
				<!-- 内部bean -->
				<bean class="com.wanee.list.Car">
					<property name="barnd" value="Chery"></property>
					<property name="color" value="gold"></property>
				</bean>	
			</list>
		</property>
		<!-- 装配set -->
		<property name="carSet">
			<set>
				<ref bean="car1"/>
				<ref bean="car2"/>
				<ref bean="car3"/>
				<!-- 内部bean -->
				<bean class="com.wanee.list.Car">
					<property name="barnd" value="Chery"></property>
					<property name="color" value="gold"></property>
				</bean>	
			</set>
		</property>
		<!-- 
			装配map 使用map标签
				entry 标签:装配一个键值对
					- key : 键
					- key-ref : 键引用的bean
					- value:- value-ref:值引用的bean
			
		-->
		<property name="carMap">
			<map>
				<entry key="小1" value-ref="car1"></entry>
				<entry key="小2" value-ref="car2"></entry>
				<entry key="小3" value-ref="car3"></entry>
				<entry key="小4">
					<!-- 内部bean -->
					<bean class="com.wanee.list.Car">
						<property name="barnd" value="Chery"></property>
						<property name="color" value="gold"></property>
					</bean>	
				</entry>
			</map>
		</property>	
		<!-- 配置properties -->
		<property name="myProps">
			<map>
				<entry key="testA" value="aaa"></entry> 
				<entry key="testB"> 
					<value>bbb</value>
				</entry>
			</map>
		</property>
	</bean>
	

使用p命名空间

P命名空间是为了简化xml的配置,从spring2.5版本之后引入了一个新的p命名空间,可以通过bean原生的属性方式,来装配bean的属性,使用了p命名空间之后,基于xml的配置bean的方式将进一步简化。

  • 加入p命名空间
    在这里插入图片描述
  • 在Spring的配置文件中使用p命名空间
<!-- 使用p命名空间完成属性注入 -->
	<bean id="person3" class="com.wanee.list.Person" p:name="qxxz" p:age="19" p:car="car3">
	</bean>
	
	<bean id="car3" class="com.wanee.di.Car">
		<property name="barnd">
			<value><![CDATA[<Benz>]]></value>
		</property>
		<property name="color" value="black"></property>
		<property name="price" value="400000"></property>
	</bean>

< null/>标签的使用

<!-- 
		需求: 不想给name属性设置值
			- 不给name属性设置property标签
			- 使用 <null/>标签完成
		实际上<null/>和不配置属性效果一致,所以我们开发如果有这样的需求,不配置就可以了。
	 -->
	<bean id="person4" class="com.wanbangee.list.Person">
		<property name="name">
			<null/>
		</property>
		<property name="age" value="20"></property>
	</bean>

级联属性

	<!-- 
		需求:人有一辆车
			- 可以使用引用外部bean或者装配内部bean的形式完成
			- 这个人的车在引用的外部bean或者内部bean的基础上进行了改装
				- 品牌:BenzX
				- 颜色:Red
			- 我们可以直接修改外部bean或者内部bean,但是这些bean可能被其他bean引用了,所以不能在原始bean的基础上修改
				这个时候我们就可以使用spring配置中支持的级联属性进行重新配置级联属性的值
	 -->
	<bean id="person5" class="com.wanbangee.list.Person">
		<property name="name" value="jjm"></property>
		<property name="age" value="32"></property>
		<property name="car" ref="car1"></property>
		<property name="car.barnd" value="BenzX"></property>
		<property name="car.color" value="Red"></property>
	</bean>
	
	<bean id="car1" class="com.wanee.di.Car">
		<property name="barnd">
			<value><![CDATA[<Benz>]]></value>
		</property>
		<property name="color" value="black"></property>
		<property name="price" value="400000"></property>
	</bean>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值