spring编程----第二部分,Spring IOC
这一部分,主要介绍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类型的配置有以上俩种方式