首页 > 代码库 > spring IOC控制反转 DI注入
spring IOC控制反转 DI注入
<!-- 初始化 init-method="init" 销毁destroy-method="destory" --> <!--懒加载 lazy-init="true" --> <bean id="IUDao" class="dao.IUDao" scope="singleton" init-method="init" destroy-method="destory" lazy-init="true"></bean>
bean的scope属性
1:singleton(默认单例)—每次从spring container 中返回一个单例对象,不进行新对象的创建;
2:prototype—每次从spring container中返回不同的对象,每次进行新对象的创建
3:request—返回一个single bean 对象 每次 HTTP request
4:session—返回一个single bean 对象 每次 HTTP session
bean的id和name的不同
id用来标识bean,是唯一的,且只有一个;name定义的是bean的alias,可以有多个,用逗号隔开,并可能与其他的bean重名,getBean()返回实例时,后面一个Bean被返回
通过id和name都可以取出该Bean
set注入
java private IUDao iuDao; public void setIuDao(IUDao iuDao) { this.iuDao = iuDao; }
<bean id="userService" class="service.UserService" > <!-- name为set的方法名,ref为bean的id或name名 --> <property name="iuDao" ref="IUDao"></property> </bean>
或者
<bean id="userService" class="service.UserService" > <property name="iuDao"> <ref bean="IUDao"/> </property> </bean>
ref属性:
bean——去所有配置文件里面去找bean
local——在当前配置文件找bean
parent——去父类配置文件找
构造方法注入
private UserDao userDao; public UserSerivce(UserDao userDao) { this.userDao = userDao; }
<bean id="userService" class="com.kaishengit.service.UserSerivce"> <constructor-arg name="userDao" ref="userDao"/>
</bean>
其他注入
<bean id="user" class="com.kaishengit.entity.User "> <property name="age" value="23"/> <property name="name" value="tom"/> <property name="addresses"> <list> <value>China</value> <value>US</value> </list> </property> <property name="map"> <map> <entry key="a1" value="v1"></entry> <entry key="a2" value="v2"></entry> </map> </property> <property name="pops"> <props> <prop key="p1">v1</prop> <prop key="p2">v2</prop> </props> </property> </bean>
使用构造方法注入的理由:
•? 构造方法注入使用强依赖规定,如果不给足够的参数,对象则无法创建。
•? 由于Bean 的依赖都通过构造方法设置了,那么就不用写更多的 set 方法,有助于减少代码量。
使用 set 注入的理由:
•? 如果Bean有很多的依赖,那么构造方法的参数列表会变的很长。
•? 如果一个对象有多种构造方法,构造方法会造成代码量增加。
•? 如果构造方法中有两个以上的参数类型相同,那么将很难确定参数的用途。
自动注入
autowire的值 :
•? no 默认值 ,不进行自动注入
•? byName 根据需要注入的属性名在容器内寻找名称相同的Bean ,如果找到就注入 ,找不到就不注入
•? byType 根据需要注入的属性类型在容器找类型相同的Bean ,如果找到就注入 ,找不到就不注入 ,如果找到多个
类型相同的Bean ,则抛出异常
•? constructor 类似byType注入 ,但是使用在构造方法之上
<bean id="userService" class="com.kaishengit.service.UserSerivce" autowire="byType"/>