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 根据需要set注入的属性名在容器内寻找id名称相同的Bean ,如果找到就注入 ,找不到就不注入

•  byType 根据需要注入的属性类型在容器找类型相同的Bean ,如果找到就注入 ,找不到就不注入 ,如果找到多个
类型相同的Bean ,则抛出异常

•  constructor 类似byType注入 ,但是使用在构造方法之上

<bean id="userService" class="com.kaishengit.service.UserSerivce" autowire="byType"/> 

posted on 2014-07-23 16:32  jiandan123  阅读(148)  评论(0编辑  收藏  举报

导航