请查看上篇:控制反转及容器
Spring的依赖注入
1. Sring的bean配置文件声明bean
<beanid="pingJiaDao"class="com.koubei.springdiwithbeans.PingJiaDaoImplForSpring">
<!-- 第一种配置方式-->
<propertyname="username">
<value>liuzhan</value>
</property>
<!-- 第二种配置方式-->
<!-- <property name="username" value="liuzhan"></property> -->
<!-- 第三种配置方式-->
<!-- p:username="liuzhan" -->
</bean>
2. 实例化ioc容器及bean
publicstaticvoidmain(String args[]) {
ApplicationContext context =newClassPathXmlApplicationContext(
"spring.xml");
IStoreServiceForSpring storeService = (IStoreServiceForSpring) context
.getBean("storeService");
PingJia pingJia =newPingJia();
pingJia.setPingJiaId("123456");
storeService.addPingJia(pingJia);
}
3. Bean引用
<beanid="storeService"class="com.koubei.springdiwithbeans.StoreServiceForSpring"
autowire="byName">
<!—ref local:如果使用了local,验证拥有该id的bean是否在同一个xml配置文件里-->
<propertyname="pingJiaDao">
<reflocal="pingJiaDao"/>
</property>
<!—ref:bean名称可以引用ioc容器里任意的bean,即使不在同一个xml配置文件里-->
<!-- <property name="pingJiaDao"ref="pingJiaDao"></property> -->
<!—声明内部bean -->
<!-- <property name="pingJiaDao">
<bean class="com.koubei.springdiwithbeans.PingJiaDaoImplForSpring">
<property name="username" value="liuzhan" />
</bean>
</property> -->
</bean>
4. 检查属性:
问题:通过setter注入的方式,不能保证所有的属性一定会被注入
解决:spring的依赖检查特性可以检查bean上某些类型的所有属性是否都被设置
方法1:通过dependency-check指定依赖检查模式(缺点:只检查某些类型的所有属性,不能检查特定属性)
<!--业务Bean定义-->
<beanid="pingJiaDao1"class="com.koubei.springdiwithbeans.PingJiaDaoImplForSpring"
dependency-check="simple">
<!-- none:所有属性都可以不设置
simple简单类型检查
objects对象类型检查
all 任意对象类型检查-->
<propertyname="username"value="liuzhan"></property>
</bean>
方法2:通过Required注解检查特定属性(需要设置<context:annotation-config/>)
@Required//自动检查username属性
publicvoidsetUsername(String username) {
this.username= username;
}
5. Bean的自动装配
问题:bean访问其他bean是需要显式的指定引用
解决:能够自动装配避免显式的指定
方法1:在xml使用autowire自动装配(缺点:如果使用几种方式都无法满足,autowire属性会自动装配bean的所有属性)
<beanid="storeService"class="com.koubei.springdiwithbeans.StoreServiceForSpring"
autowire="byName">
<!-- no*:不执行自动装配,需要显式装配依赖
byName为bean属性装配与属性同名的bean,但是有时候并不一定属性名和bean名称一致
byType为bean属性装配同类型的bean,如果存在多个类型一致的bean,则会失败
constructor每个构造器参数,先找出类型与构造器参数一致的bean,然后再找出具有最
匹配参数的构造器
autodetect如果能够找到默认没有参数的构造器,则依赖byType模式自动装配,否则
采用constructor模式-->
</bean>
方法2:使用@Atuowired和@Resource自动装配bean(可以配置个别属性,需要注册<context:annotation-config/>)
@Autowired(required =false)//自动匹配类型兼容的bean,默认情况下,应用了@Autowired的属性都需要设置,使用required=false,则属性并不一定要设置
@Qualifier("pingJiaDao")//自动匹配类型兼容的bean,并且名称是pingJiaDao
@Resource(name ="pingJiaDao")//根据名称装配
privateIPingJiaDaoForSpringpingJiaDao;
6. Bean属性集合
Map集合
<beanid="columnNames"class="java.util.HashMap">
<constructor-arg>
<map>
<entrykey="flag"value="1"/>
<entrykey="caseID"value="2"/>
<entrykey="caseName"value="3"/>
<entrykey="caseDes"value="4"/>
<entrykey="mothed"value="5"/>
<entrykey="param"value="6"/>
<entrykey="status"value="7"/>
<entrykey="resultDes"value="8"/>
</map>
</constructor-arg>
</bean>
List
<beanid="idList"class="java.util.List">
<constructor-arg>
<list>
<value="1"/>
<value="2"/>
<value="3"/>
<value="4"/>
<value="5"/>
<value="6"/>
<value