Spring-bean基础配置

本文深入解析Spring IoC容器的基本实现、依赖注入的方式,包括属性注入、构造器注入,以及如何配置bean、引用其它Bean、内部Bean等关键概念。同时,展示如何使用集合属性和p命名空间简化配置,通过实例代码演示各项配置。
首先介绍一个名词:
IOC(Inversion of Control):其思想是反转资源获取的方向. 传统的资源查找方式要求组件向容器发起请求查找资源. 作为回应, 容器适时的返回资源. 而应用了 IOC 之后, 则是容器主动地将资源推送给它所管理的组件, 组件所要做的仅是选择一种合适的方式来接受资源. 这种行为也被称为查找的被动形式
1:在 Spring 的 IOC 容器
    Spring 提供了两种类型的IOC容器实现. 无论使用何种方式,配置文件时相同的.
1>BeanFactory:IOC 容器的基本实现.BeanFactory 是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用 ApplicationContext而非底层的BeanFactory.
2>ApplicationContext:提供了更多的高级特性.是BeanFactory的子接口.  ApplicationContext的主要实现类:ApplicationContext在初始化上下文时就实例化所有单例的Bean。
–ClassPathXmlApplicationContext:从类路径下加载配置文件
–FileSystemXmlApplicationContext:从文件系统中加载配置文件

ConfigurableApplicationContext扩展于ApplicationContext,新增加两个主要方法:refresh()和close(),让 ApplicationContext具有启动、刷新和关闭上下文的能力

BeanFactory:IOC 容器的基本实现.BeanFactory 是Spring框架的基础设施,面向Spring本身;ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都直接使用 Appli

WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作
2:依赖注入的方式:
Spring 支持 3 种依赖注入的方式 :属性注入,构造器注入,工厂方法注入(很少使用,不推荐)
属性注入:属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象
属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性或 <value> 子节点指定属性值 
属性注入是实际应用中最常用的注入方式:例如:
构造方法注入:通过构造方法注入Bean 的属性值或依赖的对象,它保证了 Bean 实例在实例化后就可以使用。构造器注入在 <constructor-arg> 元素里声明属性;

3:bean配置文件

在 xml 文件中通过 bean 节点来配置 bean,id:Bean 的名称。在 IOC 容器中必须是唯一的,若 id 没有指定,Spring 自动将权限定性类名作为 Bean 的名字,id 可以指定多个名字,名字之间可用逗号、分号、或空格分隔,在 SpringIOC 容器读取 Bean配置创建Bean实例之前,必须对它进行实例化.只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用.

3.1引用其它 Bean
组成应用程序的 Bean 经常需要相互协作以完成应用程序的功能. 要使 Bean 能够相互访问, 就必须在 Bean 配置文件中指定对 Bean 的引用在 Bean 的配置文件中, 可以通过 <ref> 元素或 ref  属性为 Bean 的属性或构造器参数指定对 Bean 的引用. 也可以在属性或构造器里包含 Bean 的声明, 这样的 Bean 称为内部 Bean
3.2:内部 Bean:当 Bean 实例仅仅给一个特定的属性使用时, 可以将其声明为内部 Bean. 内部 Bean 声明直接包含在 <property> 或 <constructor-arg> 元素里,不需要设置任何 id 或 name 属性内部 Bean 不能使用在任何其他地方
3.3:注入参数详解:null 值和级联属性可以使用专用的 <null/> 元素标签为 Bean 的字符串或其它对象类型的属性注入 null 值和 Struts、Hiberante 等框架一样,Spring 支持级联属性的配置。
3.4:集合属性:在 Spring中可以通过一组内置的 xml 标签(例如: <list>, <set> 或 <map>) 来配置集合属性.
3.5:使用 utility scheme 定义集合
3.6:使用 p 命名空间:为了简化 XML 文件的配置,越来越多的 XML 文件采用属性而非子元素配置信息。Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性。使用 p 命名空间后,基于 XML 的配置方式将进一步简化
案例:
<?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"
	xmlns:p="http://www.springframework.org/schema/p"
	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-4.0.xsd">
	
	<!-- 配置bean -->
	<bean id="helloSpring" class="com.cgc.spring.beans.HelloSpring">
		<property name="name" value="Spring"></property>
	</bean>
	
	<!-- 通过构造方法配置bean的属性 -->
	<bean id="car" class="com.cgc.spring.beans.Car">
			<!-- 如果字面值包含特殊字符可以使用<![CDATA[]]>包裹起来 -->
			<!-- 属性值也可以直接使用value节点进行配置 -->
			<constructor-arg type="java.lang.String">
				<value><![CDATA[<ShangHai~>]]></value>
			</constructor-arg>
			<constructor-arg value="Shanghai" index="1"></constructor-arg>
			<constructor-arg value="300000" type="double"></constructor-arg>
	</bean>
	
		<!-- 使用构造器注入属性值 可以指定参数的位置和参数的类型,以区分重载	的构造器 -->
	<bean id="car2" class="com.cgc.spring.beans.Car">
			<constructor-arg value="Baoma"></constructor-arg>
			<constructor-arg value="Shanghaia"></constructor-arg>
			<constructor-arg type="int">
				<value>241</value>
			</constructor-arg>
	</bean>
	
	<bean id="person" class="com.cgc.spring.beans.Person">
		<property name="name" value="Tom"></property>
		<property name="age" value="24"></property>
		<!-- 可以使用property 的ref属性建立bean之间的引用关系 
		<property name="car" ref="car2"></property>
		-->
		<!-- 内部bean不能被外部引用,只能在内部引用 -->
		<property name="car">
			<bean class="com.cgc.spring.beans.Car">
				<constructor-arg value="AAAA"></constructor-arg>
				<constructor-arg value="BBB"></constructor-arg>
				<constructor-arg value="12" type="double"></constructor-arg>
			</bean>
		</property>
	</bean>
	
	<bean id="person2" class="com.cgc.spring.beans.Person">
		<constructor-arg value="AAAA"></constructor-arg>
		<constructor-arg value="12"></constructor-arg>
		<!-- 也可以将其值赋值为null -->
		<constructor-arg ref="car"></constructor-arg>
		<!-- 为级联属性赋值 -->
		<property name="car.MaxSpeed" value="230"></property>
	</bean>
	
	<bean id="person3" class="com.cgc.spring.beans.collection.Person">
		<property name="name" value="Mike"></property>
		<property name="age" value="45"></property>
		<property name="cars">
		<!-- 使用list节点为list属性赋值 -->
			<list>
				<ref bean="car"/>
				<ref bean="car2"/>
				<bean class="com.cgc.spring.beans.Car">
				<constructor-arg value="AAAA"></constructor-arg>
				<constructor-arg value="BBB"></constructor-arg>
				<constructor-arg value="12" type="double"></constructor-arg>
				</bean>
			</list>
		</property>
	</bean>
	
	<!-- 使用map节点,及Map的entry子节点配置Map类型的成员变量 -->	
	<bean id="newPerson" class="com.cgc.spring.beans.collection.NewPerson">
		<property name="name" value="Rose"></property>
		<property name="age" value="28"></property>
		<property name="cars">
			<map>
				<entry key="AA" value-ref="car"></entry>
				<entry key="BB" value-ref="car2"></entry>
			</map>
		</property>
	</bean>
	
	<bean id="dataSource" class="com.cgc.spring.beans.collection.DataSource">
		<property name="properties">
		<!-- 使用Props和prop子节点来为Properties属性赋值 -->
			<props>
				<prop key="user">scoot</prop>
				<prop key="password">tiger</prop>
				<prop key="jdbcDriver">jdbc:oracle.jdbc.driver</prop>
				<prop key="driverClass">com.oracle.jdbc.Driver</prop>
			</props>
		</property>
	</bean>
	
	<!-- 配置独立的集合bean,map bean,properties属性集,以供多个bean进行引用,需要导入util命名空间 -->
	<util:list id="cars">
		<ref bean="car"/>
		<ref bean="car2"/>
	</util:list>
	
	<bean id="person4" class="com.cgc.spring.beans.collection.Person">
		<property name="name" value="Cui"></property>
		<property name="age" value="23"></property>
		<property name="cars" ref="cars"></property>
	</bean>
	<!-- 通过p命名空间为bean的属性赋值,需要先导入p命名空间,相对于传统的配置方式更加简洁. -->
	<bean id="person5" class="com.cgc.spring.beans.collection.Person" 
		  p:age="30" p:name="Test" p:cars-ref="cars">
	</bean>
			
</beans>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值