首页 > 代码库 > 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"/>