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 方法命名约定”。