Spring 学习笔记:Ioc 基本配置

1、 IOC 基础

Ioc(Inversion of  control),即控制反转,它不是一种技术,而是一种编程思想:将对象的控制权交由容器控制,也就是所谓的“反转”,而不是传统的在对象里面通过new创建进而来控制依赖对象,能指导我们设计出松耦合,更高质量的程序。

Ioc容器:具有依赖注入的功能的容器,Ioc容器负责实例化、定位、配置应用程序中的对象及建立这些对象之间的依赖。应用程序无需直接在代码中new对象,全部由Ioc容器进行组装。在SpringBeanFactoryIoc容器的管理者。

2、 Bean的配置:

<?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:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd

"

>

<bean id="hello" class="Test201309.HelloWorldImpl">

</bean>

</beans>

 a<bean>标签主要用来进行bean定义;

 balias用于定义bean的别名;

 cimport用于导入其他的配置文件中的bean,这是为了加载多个配置文件。

 d、每个bean可以有一个或者多个id,我们把第一个id成为“标示符”,其余id

叫做“别名”;这些idIoc容器中必须唯一。

3、 实例化Bean

传统应用程序可以通过new和反射方式进行实例化bean,而spring Ioc容器则需要根据

Bean定义里的配置元素使用反射机制来创建Bean。在spring Ioc容器创建bean有一下几种方式:

①、 使用构造器实例化bean

<bean id="hello" class="Test201309.HelloWorldImpl">

<constructor-arg index="0" value="Hello Spring!">

</constructor-arg>

</bean>

②、 使用静态工厂方式实例化bean,使用这种方式除了制定必须的class属性,还要指定factory-method属性来指定实例化bean方法,而且使用静态工厂方法允许指定方法参数,spring Ioc将调用指定的方法实例化bean

<!-- 使用静态工厂方法实例化bean -->

<bean id="MyStaticFactory" class="Test201309.MyStaticBeanFactory" factory-method="create">

<constructor-arg index="0" value="hello Spring--2!"/>

</bean>

③、 使用实例工厂实例化bean,这种方式不能指定class属性,需要指定factory-bean属性,和factory-method属性,分别用于指明工厂bean和实例化bean的方法:

<!-- 工厂类 -->
<bean id="MyBeanFactory" class="Test201309.MyBeanFactory"></bean>
<!-- 使用实例化工厂来创建bean -->
<bean id="MyBeanFactoryInstance" factory-bean="MyBeanFactory" factory-method="create">
	<constructor-arg index="0" value="hello Spring--3!"/>
</bean>

4、 类与类之间的关系:

传统应用程序所说的依赖即为类与类之间的关系:

泛化:表示类与类之间、接口与接口的继承关系;

实现:表示类对接口的实现;

依赖:当类与类之间有使用关系时,就属于依赖关系;依赖不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在一个特定的地方(比如方法内部)才有关系;

关联:表示为类与类、类与接口之间的依赖关系,表现为拥有关系;具体到可以实例化变量来表示;

聚合:属于关联关系的特殊情况,体现部分和整体的关系,是一种弱拥有的关系,整体和部分可以有不同的生命周期;是一种弱关联;

组合:属于关联关系的特殊情况,体现部分和整体的关系,是一种强拥有的关系,整体和部分有相同的生命周期;是一种强关联;

5、 构造器的注入

①、 根据参数索引注入:index表示索引,从0开始,value表示值

<constructor-arg index="0" value="hello Spring--2!"/>

②、 根据参数类型注入:除基本数据类型外,需用全路径名:如java.lang.String

<constructor-art type="java.lang.String" value="hello Spring--String"/>

③、根据参数名注入:

<constructor-arg name="message" value="hello Spring--String"/>

6、 setter注入:是指通过构造器、静态工厂或者实力工厂实例好bean后,调用Bean类的setter方法进行注入;

   

<bean id="person" class="Test201309.Person">
	<property name="name" value="aobo"/>
	<property name="age" value="18"/>
	<property name="rmb"><value>so</value></property>
</bean>

Setter方法要遵循”javaBean getter/setter 方法命名约定”。

JavaBean:本质就是一个POJO类,该类必须要有公共的无参构造器;属性为private访问级别,不建议public;属性必要时通过一组setter(设置)和getter(取值)方法来访问。

7、 注入bean id

用于注入BeanIDID是一个常量而不是引用,类似于注入常量,但提供错误验证的功能,及验证该bean是否存在。

<bean id="StringBean1" class="java.lang.String">
	<constructor-arg index="0" value="test 1"/>
</bean>
<bean id="StringBean2" class="java.lang.String">
	<constructor-arg index="0" value="test 2"/>
</bean>
<bean id="refIdBean1" class="Test201309.RefIdBeanTest">
	<property name="id"><idref bean="StringBean1"></idref></property>
</bean>
<bean id="refIdBean2" class="Test201309.RefIdBeanTest">
	<property name="id"><idref local="StringBean2"></idref></property>
</bean>

8、 注入集合类型:包括Collection类型、Set类型、List类型

1List 类型:需要使用<list>标签来配置注入

可选属性:value-type:表示数据的类型

<!-- list 类型注入 -->
<bean id="listTest" class="Test201309.ListTest">
	<property name="list">
	<list value-type="java.lang.String">
		<value>This</value>
		<value>is</value>
		<value>comment</value>
	</list>
	</property>
</bean>

2Set类型:需要使用<set>标签来配置注入,配置参数同List类型。

<!-- Set 类型注入 -->
<bean id="setTest" class="Test201309.SetTest">
	<property name="values">
	<set>
		<value>A</value>
		<value>B</value>
		<value>C</value>
	</set>
	</property>
</bean>

   (3Collection类型是SetList的父类,可以使用<set><list>来注入。


9、数组类型注入:

需要使用<array>标签类配置注入,其中属性:“value-type”和<list>标签含义一样,

 也可以用<list>标签配置注入;如果是多维数组,则嵌套即可。

<!-- Array 类型注入 -->
<bean id="arrayTest1" class="Test201309.ArrayTest">
	<property name="array">
		<array value-type="int">
			<value>1</value>
			<value>2</value>
			<value>3</value>
		</array>
	</property>
</bean>

<!-- Array 类型注入 -->
<bean id="arrayTest2" class="Test201309.ArrayTest">
	<property name="array">
		<list>
			<value>4</value>
			<value>5</value>
			<value>6</value>
		</list>
	</property>
</bean>

9、 注入Map类型:使用<map>来配置注入,其属性“key-type”和“value-type”分别制定“键”和“值”的类型;

<!-- Map 类型注入 -->
<bean id="mapTest" class="Test201309.MapTest">
	<property name="map">
		<map key-type="java.lang.String" value-type="java.lang.String">
			<entry>
				<key><value>1</value></key>
				<value>1</value>
			</entry>
			...
			<entry key="3" value="3"/>
		</map>
	</property>
</bean>

10、 Properties注入:注入java.util.Properties类型数据,需要使用<props>标签配置注入,键和值必须是String类型,子标签通过<prop key=”键”></prop>来指定;可以直接用<value>以键值对的形式:键 值 来指定;

<!-- properties类型注入 -->
<bean id="propTest" class="Test201309.PropTest">
	<property name="prop">
		<props>
			<prop key="1">1</prop>
			<prop key="2">2</prop>
			<prop key="3">3</prop>
		</props>
	</property>
</bean>

<!-- properties类型注入 -->
<bean id="propTest2" class="Test201309.PropTest">
	<property name="prop">
		<value>
			zh_n = china
			en = english
			us = america
		</value>
	</property>
</bean>

11、 注入bean

<bean id="person" class="Test201309.Person">
	<property name="name" value="aobo"/>
	<property name="age" value="18"/>
	<property name="rmb"><value>so</value></property>
</bean>

<!-- 注入bean id -->
<bean id="StringBean1" class="java.lang.String">
	<constructor-arg index="0" value="test 1"/>
</bean>
<!-- 注入bean -->
<bean id="whitePerson" class="Test201309.WhitePerson">
	<property name="person" ref="person"></property>
	<property name="message"><ref bean="StringBean1"/></property>
</bean>

<ref local=””/> <ref bean=””/><ref parent=””/>的区别:

  ①、<ref local=””/>:用于引用通过<bean id=””>方式中通过id属性指定的Bean,它能利用xml解析器的验证功能在读取同一个配置文件时来验证引用的Bean是否存在。所以如果引用的bean在同一个xml配置文件中,那么用local是最好的选择。

  ②、<ref bean>:是寻找所有xml配置文件中,当前的BeanFactoryApplicationContext中的beanbean属性的值可以和依赖的的Beanid属性相同,也可以和name属性相同。

  ③、<ref parent>:允许引用当前BeanFactoryApplicationContext的父BeanFactoryApplicationContext中的Bean,同时bean属性的值可以和依赖的Beanid属性相同,也可以和name属性相同。简单的说,就是,引用父容器的Bean,不会引用当前容器中的Bean,当然父容器的Bean和当前的Bean是可以重名的,获取顺序是直接到父容器栈。

内部bean的注入:内部Bean就是在<property><constructor-arg>内通过<bean>标签定义的Bean,该Bean不管是否指定idname,该bean都会有唯一的匿名标示符,而且不能指定别名,该内部bean对其他外部bean是不可见的。

<!-- 注入内部bean -->
<bean id="whitePerson2" class="Test201309.WhitePerson">
	<property name="person" >
		<bean id="person1" class="Test201309.Person">
			<property name="name" value="aobo"/>
			<property name="age" value="19"/>
			<property name="rmb"><value>so</value></property>
		</bean>
	</property>
	<property name="message"><ref bean="StringBean1"/></property>
</bean>


12、注入null

Spring中通过<null/>标签注入null值。

<!-- null 注入 -->
<bean id="person2" class="Test201309.Person">
			<property name="name" value="aobo"/>
			<property name="age" value="19"/>
			<property name="rmb"><null/></property>
</bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值