• Spring的注入方式详解


    Spring的注入方式详解

    Spring有三个注入方式,type1,type2,type3
    type1  接口依赖
    type2  setter/getter
    type3  构造方法
     
    type2,type3较用常用
    首先来看一下type2

     
    type2 setter/getter(引用注入)
    例如,存在一个User类和Home类
     
    user类里一个userName;一个Home对象的属性.
    public class User { 
           private String userName;
        private Home myHome;
           public Home getMyHome() { 
                  return myHome;
           }
           public void setMyHome(Home myHome) { 
                  this.myHome = myHome;
           }
           public String getUserName() { 
                  return userName;
           }
           public void setUserName(String userName) { 
                  this.userName = userName;
           }
    }
    public class Home { 
           private String homeAddr;
           public String getHomeAddr() { 
                  return homeAddr;
           }
           public void setHomeAddr(String homeAddr) { 
                  this.homeAddr = homeAddr;
           }
    }
    public class TestMain { 
        public static void main(String[] args) { 
            ApplicationContext context=new FileSystemXmlApplicationContext("test/lyx/applicationContext.xml");
            User user1=(User)context.getBean("user");
       
            System.out.println(“姓名为: ”+user1.getUserName());
            System.out.println(“家庭住址是: ”+user1.getMyHome().getHomeAddr());
     
        }
     
    }
    将两个bean的注入:(applicationContext.xml配置如下)
           <bean id="home" class="test.lyx.Home" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="homeAddr">
                         <value>大连</value>
                  </property>
           </bean>
     
           <bean id="user" class="test.lyx.User" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="userName">
                         <value>liuyuanxi</value>
                  </property>
                  <property name="myHome">
                  <ref bean="home"/>
                  </property>
           </bean>
    这里的user bean,引用了home bean,
    运行时会打出 
    姓名为:liuyuanxi
    家庭住址是:大连
    这种方式就是setter/getter方式注入,习惯用JavaBean的人应该很容易理解这种方法,也就是能过<property name="userName">来指定属性. <value>liuyuanxi</value>来指定属性所对应的值.多少个属性就有多少个<property>
    这里一个人,和家是两个类,也提到了两个bean之间的引用.也就是user bean给名字赋了值,home bean给地址赋了值.如果在user bean中想引入 home bean中的地址.就用<ref/>不再用<values>
     
     
    type3 构造方法注入
    这里我们在User里加入一个构造器
    public User(Home myHome){ 
    this.myHome=myHome;
    }
    然后 把配置文件改一下:autowire=constructor;
     
           <bean id="home" class="test.lyx.Home" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="homeAddr">
                         <value>大连</value>
                  </property>
           </bean>
     
           <bean id="user" class="test.lyx.User" abstract="false"
                  singleton="true" lazy-init="default" autowire=" constructor "
                  dependency-check="default">
                  <property name="userName">
                         <value>liuyuanxi</value>
                  </property>
                  <property name="myHome">
                  <ref bean="home"/>
                  </property>
           </bean>
    运行时会打出 
    姓名为:liuyuanxi
    家庭住址是:大连
    这种方式就是构造器注入
     
    我们再来看看spring的绑定
    也就是通过bean属性autowire来设置
    1.       通过bean属性autowire="byType"的设置可以使用bean在运行时候根据去寻找同类型的已定义属性,如果找不到则处于未绑定状态.(已定义好指在applicationContext.xml中初始化)这里我们把配置文件的 user bean的autowire改成autowire="byType",注意一定要把User的构造器去掉,要不然先找构造器,会出错.这里的home bean是属于,test.lyx.Home类型的,而user bean里有两个属性一个属性已经初始化,而另一个属性Home,就会自动找到.
    applicationContext.xml配置如下:
           <bean id="home" class="test.lyx.Home" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="homeAddr">
                         <value>大连</value>
                  </property>
           </bean>
     
           <bean id="user" class="test.lyx.User" abstract="false"
                  singleton="true" lazy-init="default" autowire=" byType "
                  dependency-check="default">
                  <property name="userName">
                         <value>liuyuanxi</value>
                  </property>
                  <property name="myHome">
                  <ref bean="home"/>
                  </property>
           </bean>
    运行时会打出 
    姓名为:liuyuanxi
    家庭住址是:大连
    这种方式就是构造器注入
     
    但这样的寻找方式有一个弱点,
    假如再注入一个Home bean,叫home1,运行时就会找到两个bean,出错.
           <bean id="home1" class="test.lyx.Home" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="homeAddr">
                         <value>beijing</value>
                  </property>
           </bean>
    如果我们想解决这种问题也很简单,我们可以把autowire改为,autowire="byName"方式来寻找.
    但是这里一定要注意:Home bean的id名,一定要和属性名字一样.这里应该改成,id="myHome"
           <bean id="home1" class="test.lyx.Home" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="homeAddr">
                         <value>dalian</value>
                  </property>
           </bean>
           <bean id="myHome" class="test.lyx.Home" abstract="false"
                  singleton="true" lazy-init="default" autowire="default"
                  dependency-check="default">
                  <property name="homeAddr">
                         <value>北京</value>
                  </property>
           </bean>
    这样的话
    运行时会打出 
    姓名为:liuyuanxi
    家庭住址是:北京
    而不在是大连了,这种寻找方式就是byName,也就是按属性的名字进行查询.注意:id一定要属性的名字一样.
     
    2.我们来比较一个byname bytype这两种方式.
    byname要比bytype精确些,因为id,是不能重名的.
    而且假如存在一这样一种情况,两个user bean,分别为user1,user2,那么user1,user2都可以,打出北京.重用性很好.
    到这可能有人会想到.user1,和user2调用的是同一个Home吗.你可以把他们的hashcode();打出来,你会发现地址是一样的,也就是说,是同一个bean.这里是因为singleton="true"的原因,如果你把singleton改成了"false"那就不是一个对象了.
    3.如果把autowire=” constructor”也就是构造器注入一定要注意了,他是以byType进行查找,也就是说,Home bean,是不能出现两次,否则就会出错了.
    4.如果autowire设置成为autodetect,他会一直找,直到找到一个合适的为止.constructor,bytype,byname的顺序去找.这种方式是不推荐使用的.因为你很难判断出执行的是那个.
     
  • 相关阅读:
    HDU 1018.Big Number-Stirling(斯特林)公式 取N阶乘近似值
    牛客网 Wannafly挑战赛9 C.列一列-sscanf()函数
    牛客网 Wannafly挑战赛9 A.找一找-数据处理
    Codeforces 919 C. Seat Arrangements
    Codeforces Round #374 (Div. 2) D. Maxim and Array 线段树+贪心
    Codeforces Round #283 (Div. 2) A ,B ,C 暴力,暴力,暴力
    Codeforces Round #283 (Div. 2) E. Distributing Parts 贪心+set二分
    Codeforces Round #280 (Div. 2) E. Vanya and Field 数学
    Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学
    Codeforces Round #280 (Div. 2) A , B , C
  • 原文地址:https://www.cnblogs.com/encounter/p/2189228.html
Copyright © 2020-2023  润新知