与卿画眉共浮生 2012-04-16
这一部分,主要介绍springIOC,即spring容器
[][]
第一节.whatisSpringIOC?
1.InversionofControl(IOC)
2.AlsocallsDependencyInjection(DI)
3.Objectartgiventheirdependenciesatcreationtimebysomeexternalentitythatcoordinateseachobjectinthesystem
4.ThekeybenefitofDIisloosecoupling
IOC是整个spring框架的核心,即控制反转,也叫做依赖注入。指的是对象之间的依赖关系,由spring容器在运行时候依据spring的配置文件动态建立。
HowtouseSpringIOC?
public class Logic{
Dao dao;//dependency
public Logic(){
dao = DaoFactory.getDao();
}
}传统上,如果一个类中调用了DaoImpl的方法,需要在这个类中直接创建DaoImpl的对象,或者编写工厂类,有工厂类创建对象。这样的方式都是在编译时就确定了类和DaoImpl的关系,增加了代码的耦合度。
在spring中,我们将对象的创建等相关工作交给spring容器来实现。像webcontainer管理servlet一样,spring容器负责管理JavaBean的生命周期。
IOC的方式
注入依赖(DI)主要有三种注入方式,即构造器注入、Setter注入和使用注解方式。由于大量的构造器参数可能使程序变得笨拙,特别是党某些属性是可选的时候,因此通常情况下,spring开发团队提倡使用setter注入方式。
我在下面分别介绍这三种方式
1.构造器注入方式
先看一个java类
public class StudentService implements IStudentService {
private IStudentDao studentDao;
private String id;
public StudentService(IStudentDao studentDao,String id){
this.studentDao = studentDao;
this.id = id;
}
public void saveStudent() {
studentDao.saveStudent();
System.out.print(",ID为:"+id);
}
}在来看一下spring的配置文件
<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService" class="com.wch.service.impl.StudentService">
<constructor-arg index="0" type="com.wch.dao.IStudentDao" ref="studentDao" />
<constructor-arg index="1" value="123456" type="java.lang.String"></constructor-arg>
</bean>基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个依赖。在类StudentService中,有俩个参数,一个是studentDao,一个是id(string类型)用'type'属性来显式指定那些构造参数的类型
index属性来显式指定构造参数的索引,从0开始
setter注入
Spring注入依赖的Setter的方式注入依赖是经常使用的到得一种方法,也非常的简单,只需给每个需要注入的属性设置Setter方法
构造器注入与Setter注入的比较
由于大量的构造器参数可能使程序变得笨拙,特别是当某些属性是可选的时候。因此通常情况下,Spring开发团队提倡使用setter注入。而且setterDI在以后的某个时候还可将实例重新配置(或重新注入)
尽管如此,构造器注入还是得到很多纯化论者(也有很好的理由)的青睐。一次性将所有依赖注入的做法意味着,在未完全初始化的状态下,此对象不会返回给客户代码(或被调用),此外对象也不需要再次被重新配置(或重新注入)。
对于注入类型的选择并没硬性的规定。只要能适合你的应用,无论使用何种类型的DI都可以。对于那些没有源代码的第三方类,或者没有提供setter方法的遗留代码,我们则别无选择--构造器注入将是你唯一的选择
同样是上面的提到的StudentService类,我们来看看setter方式的spring配置文件书写方式
<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService2" class="com.wch.service.impl.StudentService2">
<!--
指定需要注入bean
-->
<property name="studentDao" ref="studentDao"></property>
<!--
直接变量(基本类型、Strings类型等。),可以通过value属性经行赋值
-->
<property name="id" value="123456789"></property>
</bean>感谢nellybabyhttp://huangliangbao.iteye.com/的blog,省去了我很多的时间。再此歇息
第二节基本装配
通过依赖注入注入的信息一般分为3钟情况:
1.简单值,例如int、spring等
2.其他bean类型的对象
3.集合类型
下面来看一个spring的配置文件
<!-- ref方式注入属性 --> <bean id="personDao" class="com.persia.PersonDaoBean"></bean> <bean id="personService4" class="com.persia.PersonServiceBean"> <property name="personDao" ref="personDao"></property> <property name="name" value="persia"></property> <property name="age" value="21"></property> </bean>
对于简单的值,在<property>标记中使用value即可;如果注入的是其他的bean,需要在property中使用ref
下面来看一个集合类型的spring配置文件
<property name="sets">
<!-- 集合的注入 -->
<set>
<value>第一个</value>
<value>第二个</value>
<value>第三个</value>
</set>
</property>
<property name="lists">
<!-- 集合的注入 -->
<list>
<value>第一个l</value>
<value>第一个l</value>
<value>第三个l</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value-1"></entry>
<entry key="key2" value="value-2"></entry>
<entry key="key3" value="value-3"></entry>
</map>
</property>如果需要注入的属性类型为list,需要使用<list>标记,允许有重复的元素,而属性类型为set时候,需要使用标记<set>。map类型需要使用标记<map>,它为键值对应
再来看一个
<property name="properties">
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
<prop key="key3">value3</prop>
</props>
</property>
<property name="properties">
<props>
<value>
key1=value1
key2=value2
key3=value3
</value>
</props>
</property>Properities类型的配置有以上俩种方式