Spring3学习 (1) __ 注入

1、注入方式
 bean的构造函数用到下面两个属性 public XXXX(String message, int value) {……}

 #构造器注入
 <bean name="XXX" class="XXXX">
  <!-- 索引方式-->
  <constructor-arg index="0" value="Hello Kris!"/>
  <constructor-arg index="1" value="150"/>
  <!-- 参数类型方式-->
  <constructor-arg type="java.lang.String" value="Hello Kris!"/>
  <constructor-arg type="int" value="150"/>
  <!-- 参数名称方式-->
  <constructor-arg name="message" value="Hello Kris!"/>
  <constructor-arg type="value" value="150"/>
 </bean>
 
 #静态工厂注入
  //静态工厂类
 public class InjectClassByStaticFactory { 
       public static BeanType newInstance(String message, int index) { 
              return new BeanTypeImpl(message, index); 
       } 
 } 
 
 <bean name="beanType" class="InjectClassByStaticFactory" factory-method="newInstance">
  <!-- 构造器-->
  <constructor-arg index="0" value="Hello Kris!"/>
  <constructor-arg index="1" value="150"/>
 </bean>
 
 #实例工厂注入
  //实例工厂类
 public class InjectClassByInstanceFactory { 
       public BeanType newInstance(String message, int index) { 
              return new BeanTypeImpl(message, index); 
       } 
 } 
 <bean name="instanceFactory" class="InjectClassByInstanceFactory"/>
 <bean name="beanType" factory-bean="instanceFactory" factory-method="newInstance">
  <!-- 构造器-->
  <constructor-arg index="0" value="Hello Kris!"/>
  <constructor-arg index="1" value="150"/>
 </bean>
 
 #setter注入   是通过在通过构造器、静态工厂或实例工厂实例好Bean后,通过调用Bean类的setter方法进行注入依赖
 <bean name="XXX" class = "XXXX">
  <property name="YYY" value="YYYY"
 </bean>
 
 
2、Bean的注入


1)常量注入:
<bean id="bean2" class="cn.javass.spring.chapter3.bean.BooleanTestBean"> 
    <property name="success" value="on"/> 
</bean>


2)注入Bean ID,注入Bean的ID,ID是一个常量不是引用,且类似于注入常量,但提供错误验证功能
<bean id="bean1" class="java.lang.String"> 
    <constructor-arg index="0" value="test"/> 
</bean>
<bean id="idrefBean1" class="cn.javass.spring.chapter3.bean.IdRefTestBean"> 
        <property name="id"><idref bean="bean1"/></property> 
</bean>


3)注入集合
  # List类型  使用list标签
  <bean name="XXX"  class=""XXX>
   <property name = "instanceList">
    <list value-type="String" merge="default">
     <value>1</value>
     <value>2</value>
    </list>
   </property>
  </bean>
  注:当使用value-type时,bean类中,要指定变量的泛型。private List<String> instanceList;
   
  #Set类型  使用set标签
  <bean name="XXX"  class=""XXX>
   <property name = "instanceSet">
    <set>
     <value>1</value>
     <value>2</value>
    </set>
   </property>
  </bean>
  #Collection类型  Collection类型是Set和List类型的基类型,使用list和set标签都可以


4)注入数组  array标签
 #一维数组
   <bean name="XXX"  class=""XXX>
   <property name = "oneArray">
    <array value-type="String" merge="default">
     <value>1</value>
     <value>2</value>
    </array>
   </property>
  </bean>
  #二维数组
   <bean name="XXX"  class=""XXX>
   <property name = "twoArray">
    <array>
     <array>
      <value>1</value>
      <value>2</value>
     </array>
     <array>
      <value>3</value>
      <value>4</value>
     </array>
    </array>
   </property>
  </bean>


5)注入字典(Map)   使用<map>标签,<key>子标签来指定键数据,<value>子标签来指定键对应的值数据
 <bean name="XXX"  class= "XXX">
  <property name ="instanceMap" key-type="java.lang.String" value-type="java.lang.String">
   <!-- 第一种方式-->
   <entry>
    <key>
     <value>1</value>
    <key>
    <value>22</value>
   </entry>
    <!-- 第二种方式-->
   <entry key="2" value="33"/>
  </property>
 </bean>


6)注入java.util.Properties类型数据,使用<props>标签,键和值类型必须是String,子标签<prop key=”键”>值</prop>来指定键值对
 <bean name="XXX"  class= "XXX">
  <property name ="instanceProps">
   <props value-type="int" merge="default"> <!-- 尽管指定了int类型,但不起作用。仍然是String类型-->
    <prop key="1">test</prop>
    <prop key="2">test2</prop>
   </props>
  </property>
 </bean>


7)注入bean
 #构造器方式
 <bean name="XXX" class="XXXX">
  <!-- 第一种方式  ref属性指定引用其它bean-->
  <constructor-arg index="0" ref="xxxBean"/>
  <!-- 第二种方式  子<ref>标签来引用其它Bean-->
  <constructor-arg index="0">
   <ref bean="xxxBean"/>
  </constructor-arg>
  
  <constructor-arg index="1" value="150"/>
 </bean>
 <bean id="xxxBean" class="XXXBean"/>

 #setter方式
 <bean name="XXX" class="XXXX">
  <!-- 第一种方式  ref属性指定引用其它bean-->
  <property name="XXX" ref="xxxBean"/>
  <!-- 第二种方式  子<ref>标签来引用其它Bean-->
  <property name="XXX">
   <ref bean="xxxBean"/>
  </property>
  
  <property name="tt" value="test"/>
 </bean>
 <bean id="xxxBean" class="XXXBean"/>
 
 #其它方式 
  |*| <ref local=""> 用于在当前配置文件中引用通过<bean id=”beanName”>方式中通过id属性指定的Bean。 必
  须指定id属性,必须在当前配置文件
 
  |*| <ref parent=""/>引用父容器中的Bean,不会引用当前容器中的Bean。父容器中的Bean和当前容器的Bean是可以重名
 
 #内部Bean,指<property>或<constructor-arg>内通过<bean>标签定义的Bean,对其他外部Bean不可见
  <bean name="XXX" class="XXXX">
   <constructor-arg index="0">
    <bean name="innerBean1" class="XXXXXXXX">
   </constructor-arg>
   <property name="prop">
    <bean name="innerBean2" class="XXXXXXXX2">
   </property>
  </bean>


8)注入null值,使用null标签
 <bean name="XXX" class="XXXX">
  <property name="prop"><null/></property>
 <bean>


9)对象图导航注入,指类似a.b.c这种点缀访问形式的访问或修改值。a和b必须为非null值才能注入c
 %%%%%%%通常不使用%%%%%%%
 
 code代码:
 public class C { 
  public void say() { 
   System.out.println("=== c"); 
  }
 }
 public class B { 
  private C c; 
  private List<C> list; 
  private Properties properties; 
  private C[] array = new C[1]; 
  private Map<String, C> map;
  …… //setter/getter方法
 }
 public class A { 
  private B b; 
  public void setB(B b) { 
   this.b = b; 
  }   
 }
 
 配置文件:
 <bean id="c" class="C"/> 
 <bean id="b" class="B"> 
  <property name="list"><list></list></property> 
   <property name="map"><map></map></property> 
   <property name="properties"><props></props></property> 
 </bean>
 <bean id="a" class="A"> 
  <!-- 首先注入B 确保它非空 --> 
  <property name="b" ref="b"/> 
  <!-- 对象图导航注入 --> 
  <property name="b.c" ref="c"/> 
  <!-- 注入列表数据类型数据 --> 
  <property name="b.list[0]" ref="c"/> 
  <!-- 注入map类型数据 --> 
  <property name="b.map[key]" ref="c"/> 
  <!-- 注入properties类型数据 --> 
  <property name="b.properties[0]" ref="c"/> 
  <!-- 注入properties类型数据 --> 
  <property name="b.properties[1]" ref="c"/> 
  <!-- 注入数组类型数据 ,注意不要越界--> 
  <property name="b.array[0]" ref="c"/> 
 </bean>
 
 4、Spring创建Bean的原理
 Spring容器创建"A" Bean,首先去“当前创建Bean池”查找是否当前Bean正在创建,如
 果没发现,则继续准备其需要的构造器参数“B”,并将“A” 标识符放到“当前创建Bean池”;
 当创建完B时,再去创建A

 

转载请注明:http://blog.csdn.net/coolwzjcool/article/details/9789279

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值