Spring IOC 1

1.spring bean的xml配置里name或id均可以指定它们中的一个时都做为“标识符”,那为何还要有id和name同时存在呢?java

    这是由于当使用基于XML的配置元数据时,在XML中id是一个真正的XML id属性,所以当其余的定义来引用这个id时就体现出id的好处了,能够利用XML解析器来验证引用的这个id是否存在,从而更早的发现是否引用了一个不存在的bean,而使用name,则可能要在真正使用bean时才能发现引用一个不存在的bean。spring

2.Spring IoC容器中根据Bean定义建立Bean主要有3种方式:xml

    A.使用构造器实例化Bean;索引

<!-- 使用空构造器进行定义-->资源

<bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/> get

 

<!-- 指定构造器参数 index表示位置,value表示常量值,也能够指定引用,指定引用使用ref来引用另外一个Bean定义--> class

<bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2">   容器

     <constructor-arg index="0" value="Hello Spring!"/>  配置

</bean> 依赖注入

    B.使用静态工厂方式实例化Bean;使用这种方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,并且使用静态工厂方法也容许指定方法参数.

public class HelloApiStaticFactory {                                  //静态工厂类代码

       public static HelloApi newInstance(String message) {  //工厂方法  

           return new HelloImpl2(message);                       //返回须要的Bean实例  

}  }  

<!-- 使用静态工厂方法定义bean -->  

<bean id="bean3" class="cn.javass.spring.chapter2.HelloApiStaticFactory" 

factory-method="newInstance">  

     <constructor-arg index="0" value="Hello Spring!"/>  

</bean>  

 

    C.使用实例工厂方法实例化Bean。使用这种方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,并且使用实例工厂方法容许指定方法参数,方式和使用构造器方式同样。

public class HelloApiInstanceFactory {          //实例工厂类代码

    public HelloApi newInstance(String message) {  

          return new HelloImpl2(message);  

   }  }  

<!—一、定义实例工厂Bean -->  

<bean id="beanInstanceFactory"  class="cn.javass.spring.chapter2.HelloApiInstanceFactory"/>  

<!—二、使用实例工厂Bean建立Bean -->  

<bean id="bean4"  factory-bean="beanInstanceFactory"  factory-method="newInstance">  

     <constructor-arg index="0" value="Hello Spring!"></constructor-arg>  

</bean>  

这三种方式只是配置不同,从获取方式看彻底同样,没有任何不一样。

 

3.Spring IoC容器注入依赖资源主要有如下三种基本实现方式:

    构造器注入:就是容器实例化Bean时注入那些依赖,经过在在Bean定义中指定构造器参数进行注入依赖,包括实例工厂方法参数注入依赖,但静态工厂方法参数不容许注入依赖;

    1、根据参数索引注入,使用标签“<constructor-arg index="1" value="1"/>”来指定注入的依赖,其中“index”表示索引,从0开始,即第一个参数索引为0,“value”来指定注入的常量值

    2、根据参数类型进行注入,使用标签“<constructor-arg type="java.lang.String" value="Hello World!"/>”来指定注入的依赖,其中“type”表示须要匹配的参数类型,能够是基本类型也能够是其余类型,如“int”、“java.lang.String”,“value”来指定注入的常量值

    3、根据参数名进行注入,使用标签“<constructor-arg name="message" value="Hello World!"/>”来指定注入的依赖,其中“name”表示须要匹配的参数名字,“value”来指定注入的常量值

<!-- 经过构造器参数索引方式依赖注入 -->  

<bean id="byIndex" class="cn.javass.spring.chapter3.HelloImpl3">  

<constructor-arg index="0" value="Hello World!"/>  

    <constructor-arg index="1" value="1"/>  

</bean>  

<!-- 经过构造器参数类型方式依赖注入 -->  

<bean id="byType" class="cn.javass.spring.chapter3.HelloImpl3">  

   <constructor-arg type="java.lang.String" value="Hello World!"/>  

   <constructor-arg type="int" value="2"/>  

</bean>  

<!-- 经过构造器参数名称方式依赖注入 -->  

<bean id="byName" class="cn.javass.spring.chapter3.HelloImpl3">  

   <constructor-arg name="message" value="Hello World!"/>  

   <constructor-arg name="index" value="3"/>  

</bean>  

     方法注入:能经过配置方式替换掉Bean方法,也就是经过配置改变Bean方法 功能。

        静态工厂方法注入和实例工厂注入.

     setter注入:经过setter方法进行注入依赖;

        setter注入,是经过在经过构造器、静态工厂或实例工厂实例好Bean后,经过调用Bean类的setter方法进行注入依赖. 在Bean的配置中增长property。

        Spring如何知道setter方法?如何将值注入进去的呢?其实方法名是要遵照约定的,setter注入的方法名要遵循“JavaBean getter/setter 方法命名约定”。

相关文章
相关标签/搜索