3、Spring IOC&DI使用

基础类型注入

String注入

<property name="str" value="String Type" />

Integer类型

<property name="i" value="15" />

浮点型

<property name="f" value="15.2" />

布尔型

<property name="flag" value="true" />

其他类型注入

List注入

<property name="list">
    <list>
        <value>1value>
        <value>2value>
    list>
property>

Map注入

<property name="map">
    <map>
        <entry key="id" value="123456" />
        <entry key="name" value="codestd" />
    map>
property>

枚举类型注入

枚举类如下

package com.codestd.springstudy.lesson02;

public enum EnumerationType {
    A,B,C
}

第一种:使用FieldRetrievingFactoryBean创建枚举对象。然后注入对象

<bean id="A" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <property name="staticField" value="com.codestd.springstudy.lesson02.EnumerationType.A" />
bean>

...
<property name="enumType" ref="A" />

第二种:直接注入枚举的名称

<property name="enumType" value="A" />

第一种使用的是ref,是将A对象注入到属性中;而第二种使用的是value,注入的是字符串,然后由Spring通过枚举的valueOf(String)方法获取枚举对象。

构造函数注入

JavaBean代码如下

public class SubBean {

    private String construct;

    public SubBean(){}

    public SubBean(String construct){
        this.construct = construct;
    }

    public String toString(){
        return construct;
    }
}

第一种使用参数名称注入

<bean id="subBean" class="com.codestd.springstudy.lesson02.SubBean">
    <constructor-arg  name="construct" value="Construct Args"/>
bean>

第二种使用参数索引注入,即参数在构造函数的所有参数的位置。索引从0开始

<bean id="subBean" class="com.codestd.springstudy.lesson02.SubBean">
    <constructor-arg  index="0" value="Construct Args"/>
bean>

Bean的注入

使用XML配置文件方式

<bean id="subBean" class="com.codestd.springstudy.lesson02.SubBean">
bean>

<property name="subBean" ref="subBean" />

使用@Resource

@Resource
private SubBean subBean;

使用@Autowire

@Autowired
private SubBean subBean;

@Resource和@Autowire的区别

  • @Autowire可以通过required属性指定是否必须注入,如果required=false当Spring无法从容器中找到与之匹配的对象时就不再注入,且不会报错。@Resource没有这样的参数。
  • 当接口只有一个实现类是@Resource和@Autowire一样,切忽略属性名。即属性名不必与Bean的ID一致。
  • 当接口有两个实现类时,@Resource可以通过name=""和属性名注入,而@Autowire只能通过属性名注入。Spring会根据属性名,从Spring容器中查找与之匹配的Bean,然后注入。
package com.codestd.springstudy.lesson02;

public interface AutowiredTest {

}

package com.codestd.springstudy.lesson02;

import org.springframework.stereotype.Component;

@Component
public class AutowiredTestImpl1 implements AutowiredTest{

}

···
@Autowired
private AutowiredTest autowiredTest;
//等同于
@Resource
private AutowiredTest autowiredTest;

如果多了一个实现类,则用上面的注入方法就不行了。

package com.codestd.springstudy.lesson02;

import org.springframework.stereotype.Component;

@Component
public class AutowiredTestImpl2 implements AutowiredTest {

}

//使用
@Resource(name="autowiredTestImpl1")
private AutowiredTest autowiredTest;
//或
@Resource
private AutowiredTest autowiredTestImpl1;
//或
@Autowired
private AutowiredTest autowiredTestImpl1;

你可能感兴趣的:(Spring专题,Spring入门教程)