Spring学习历程---在IoC中配置bean

37 篇文章 0 订阅
29 篇文章 2 订阅

bean可以这样配置:

1.引用bean

<bean id="car" class="com.Car"></bean>
<bean id="boss" class="com.Boss">
  <property name="car">
    <ref bean="car"></ref>
  </property>
 <property name="phone">
  <value>110</value>
 </property>
</bean>

2.静态工厂方法

	<bean id="People2"    class="com.Factory"   factory-method="create"></bean>


3.非静态工厂方法(在类内部,new一个对象,然后返回出来)

	<bean id="factory"  class="com.Factory"></bean>
	<bean id="People3"  factory-bean="factory"  factory-method="create2"></bean>

4.循环依赖问题

Car的构造函数传入一个Boss实例,Boss的构造函数传入一个Car实例。

这样就不能使用构造函数注入了,而应使用属性注入方式。


5.构造函数传入bean

	<bean id="boss1" class="com.baobaotao.ditype.Boss">
		<constructor-arg>
			<value>John</value>
		</constructor-arg>
		<constructor-arg>
			<ref bean="car" />
		</constructor-arg>
		<constructor-arg>
			<ref bean="office" />
		</constructor-arg>
	</bean>
       <bean id="car" class="com.baobaotao.ditype.Car"
          p:brand="红旗&CA72"
          p:maxSpeed="200"
          p:price="20000.00"/>
	<bean id="office" class="com.baobaotao.ditype.Office" />
//这里p是这样来的 xmlns:p="http://www.springframework.org/schema/p" 

构造函数还可以这样注入:

	<!--构造函数注入:type -->
	<bean id="car1" class="com.baobaotao.ditype.Car">
		<constructor-arg type="java.lang.String">
			<value>红旗CA72</value>
		</constructor-arg>
		<constructor-arg type="double">
			<value>20000</value>
		</constructor-arg>
	</bean>

	<!--
		构造函数注入:index <bean id="car2" class="com.baobaotao.ditype.Car">
		<constructor-arg index="0" value="红旗CA72" /> <constructor-arg
		index="1" value="中国一汽" /> <constructor-arg index="2" value="20000" />
		</bean>
	-->

	<!--构造函数注入:type&index -->
	<bean id="car3" class="com.baobaotao.ditype.Car">
		<constructor-arg index="0" type="java.lang.String">
			<value>红旗CA72</value>
		</constructor-arg>
		<constructor-arg index="1" type="java.lang.String">
			<value>中国一汽</value>
		</constructor-arg>
		<constructor-arg index="2" type="int">
			<value>200</value>
		</constructor-arg>
	</bean>

其中Car的构造函数这样的:

	public Car() {}	
	public Car(String brand, double price) {
		this.brand = brand;
		this.price = price;
	}	

	public Car(String brand, String corp, double price) {
		this.brand = brand;
		this.corp = corp;
		this.price = price;
	}
	public Car(String brand, String corp, int maxSpeed) {
		this.brand = brand;
		this.corp = corp;
		this.maxSpeed = maxSpeed;
	}


----------------------------------------------我就是一条分割线,重点看下面---------------------------------------------

一些细节:

1.属性变量名有一个很容易被忽视的命名规范,前两个字母或者全部大写,或者全部小写。否则会报编译错误。或者说,这个命名,其对应的方法自动生成,不会与配置文件发生冲突。

2.若是要给某个元素配空值,则需借助<null/>标签。

3.级联属性

若是希望初始化Boss,直接给Car属性注入值

	<bean id="boss" class="com.Boss">
		<property name="car.brand"  value="长安"></property>
	</bean>
则应当改造Boss类

public class Boss
{
    private Car car=new Car();
    ......
}
必须提供一个非空的Car实例,若是没有为car属性提供Car对象,Spring设置级联属性便会抛出NullValueInNestedPathException的异常。

4.集合类型属性

比如Boss类里面,含有一个 List 类型的 favorities 属性,则需要这样配。

	<bean id="parentBoss" abstract="true"
		class="com.baobaotao.attr.Boss">
		<property name="favorites">
			<set>
				<value>看报</value>
				<value>赛车</value>
				<value>高尔夫</value>
			</set>
		</property>
	</bean>
	<bean id="childBoss" parent="parentBoss">
		<property name="favorites">
			<set merge="true">
				<value>爬山</value>
				<value>游泳</value>
			</set>
		</property>
	</bean>	

上述代码同时涉及到了集合的合并。

集合合并分三步,1.定义父bean  2.子bean指定父bean  3.和父bean中同名的属性值进行合并。即子集拥有五个元素。

List属性既可以通过<value>注入字符串,也可以通过<ref>注入容器中其他的Bean。

数组类型的属性(如String[ ] , int [ ] 等)也可以采用<list>的方式进行配置。
5.通过 util 命名空间配置集合类型的 bean 

若是希望配置一个集合类型的Bean,而不是一个集合类型的属性,则可以通过 util 命名空间进行配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

<!-- bean definitions here -->

</beans>

之前是这样:

<!-- creates a java.util.List instance with values loaded from the supplied 'sourceList' -->
<bean id="emails" class="org.springframework.beans.factory.config.ListFactoryBean">
    <property name="sourceList">
        <list>
            <value>pechorin@hero.org</value>
            <value>raskolnikov@slums.org</value>
            <value>stavrogin@gov.org</value>
            <value>porfiry@gov.org</value>
        </list>
    </property>
</bean>
现在是这样:

<util:list id="emails">
    <value>pechorin@hero.org</value>
    <value>raskolnikov@slums.org</value>
    <value>stavrogin@gov.org</value>
    <value>porfiry@gov.org</value>
</util:list>
其他的类似,参考官方文档。

6.采用p命名空间后,用 p 配置属性字面值,配置属性引用对象值。简化配置代码。

  <bean id="car" class="com.baobaotao.injectfun.Car"   p:brand="红旗CA72" p:price="2000" scope="prototype"/>
<bean id="boss" class="com.Boss" p:car-ref="car"/>







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值