Spring的依赖注入

Posted by zjhChester on September 30, 2019

Spring的依赖注入(DI)

依赖注入:Dependency Injection

##

1、Ioc的作用:

降低程序间的耦合(依赖关系)

2、依赖关系管理:

交给spring来维护,在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明;

3、依赖关系的维护:依赖注入

能注入的数据(三类):

1、基本类型和String 2、其他的bean类型(在配置文件中或者注解配置过的bean)

注入的方式(三种):

1、构造函数提供:
优点:

再获取对象的时候,必须注入数据,否则无法创建成功

缺点:

改变了bean对象的实例化方式,使我们在创建对象的时候,即便用不到某些属性,也必须提供

实现:

1、beans.xml

<!--
        依赖注入
        构造函数注入:
    使用的标签:constructor-arg
     属性:
     type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
     index:用于指定要注入的数据,给构造函数中指定索引位置的参数赋值,索引从0开始
     name:用于指定给构造函数中指定名称的参数赋值 =====》常用的
     ==================以上三个用于指定给构造函数中那个参数赋值==================================
     value:用于给基本类型和String类型赋值数据
     ref:通过xml配置文件根据id找bean  引用关联的bean对象

     优点:
        在获取bean对象时,注入数据是必须的操作,否则对象时无法创建成功的
     弊端
        改变了bean对象的实例化方式,使我们再创建对象时,如果用不到这些数据,也必须提供
    -->
    <bean  id="Service" class="com.tfs.service.impl.ServiceImpl">
        <constructor-arg name="dao" ref="Dao">
        </constructor-arg>
    </bean>

2、ServiceImpl.java


 private  Dao dao;
    /**
     * 构造函数注入
     */
    public ServiceImpl(Dao dao) {
        this.dao = dao;
    }
public void say() {
        System.out.println("Service say hello ");
        dao.say();

    }

3、测试类、控制台

 public static void main(String[] args){
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        Service service = applicationContext.getBean("Service", Service.class);
        service.say();
 }

1569739536099

2、使用set方法提供:
优点:

创建对象时,没有明确的限制,可以使用默认构造函数

缺点:

如果有某个成员必须有值,则获取对象时,有可能set方法没有执行

实现:

1、beans.xml

 <!--
     依赖注入
        2、set方法注入:常用
            涉及的标签:property
            标签的属性:
            name:用于指定注入时所调用的,set方法指定的属性    注意,通过set方法必须与属性名称一致,name 就必须是setName,spring通过set方法给对应的参数赋值
            value:用于给基本类型和String类型赋值数据
            ref:通过xml配置文件根据id找bean  引用关联的bean对象

            优势:创建对象时,没有明确的限制,可以使用默认构造函数
            弊端:如果有某个成员必须有值,则获取对象时,有可能set方法没有执行
    -->
    <bean  id="Service" class="com.tfs.service.impl.ServiceImpl">
        <property name="dao" ref="Dao">
        </property>
    </bean>

2、ServiceImpl.java

 private  Dao dao;
    /**
     * set方法注入
     */
    public void setDao(Dao dao) {
        this.dao = dao;
    }
public void say() {
        System.out.println("Service say hello ");
        dao.say();

    }

3、测试类、控制台

 public static void main(String[] args){
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        Service service = applicationContext.getBean("Service", Service.class);
        service.say();
 }

1569740306973

3、使用注解提供

δ、复杂类型的注入/集合类型

1、注意事项( 结构相同,标签可以互换
第一类:用于给list结构集合注入的标签:

​ list array set

第二类:用于map结构的集合注入的标签:

​ map properties

2、实现

beans.xml

 <!--
        复杂类型的注入/集合类型注入
        用于给list结构集合注入的标签:
        list array  set
        用于map结构的集合注入的标签:
        map properties

        结构相同,标签可以互换
    -->
    <bean  id="Service" class="com.tfs.service.impl.ServiceImpl">
        <property name="dao" ref="Dao">
        </property>
        <property name="list">
            <list>
                <value>111</value>
                <value>111</value>
                <value>111</value>
            </list>
        </property>

        <property name="string">
            <array>
                <value>111</value>
                <value>111</value>
                <value>111</value>
            </array>
        </property>

        <property name="map">
            <map>
                <entry key="11" value="12"></entry>
                <entry key="13">
                    <value>14</value>
                </entry>
            </map>
        </property>

        <property name="props">
            <props>
                <prop key="11" >ccc</prop>
                <prop key="11" >dddd</prop>
            </props>
        </property>
    </bean>

ServiceImpl.java

 private String string[];
    private List<String> list;
    private Map<String,String> map;
    private Properties props;

    public void setProps(Properties props) {
        this.props = props;
    }

    public void setString(String[] string) {
        this.string = string;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }