浅谈spring5创建对象3种方式以及依赖注入

Posted amcomputer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈spring5创建对象3种方式以及依赖注入相关的知识,希望对你有一定的参考价值。

一 背景介绍

spring 框架里面包含了很多流行的技术,如IOC,DI,SpringlMVC,官方文档地址(https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core),一开始听这些名词时云里雾里的,什么控制反转,什么依赖注入等等。随着代码的阅读和理解,也逐渐慢慢清晰了起来,扒开了重重迷雾,果然,时间才是最好的礼物。

1.1 IOC 控制反转

     控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
     说人话:IoC就是一种设计思想,以前我们都是通过new关键字来产生对象,现在不用了,通过去IoC容器中(即spring的配置文件,xml格式)去获取对象。以前是程序员自动去获取,现在是去IoC容器里面拿,所以说"控制反转"说的是获取依赖对象的方式变了。
     控制反转实现方法很多,如直接通知代码,DI,依赖查找等也能实现控制反转。DI是实现控制反转最经典也是最常用的方式。总之,IoC的容器负责对象的注入,创建,生命周期的管理。

1.2 DI依赖注入

    DI依赖注入,即实现IoC的一种方式;想理解好依赖注入是什么,需要回答2个问题:
    **1 依赖什么?**
           对象的创建依赖于IoC容器(即spring的xml文件)。即创建对象的依赖关系
    **2 注入了什么?**
          所创建的对象的属性的初始化通过IoC来注入。即对象里面属性或者字段的初始化

二 IoC创建对象3种方式

IoC创建对象3种方式,也叫IoC创建Bean的3种方式。
下面是一个普通的User类,有一个自己默认无参构造:

package com.yang.pojo;

public class User {
    int age;
    String name;
    public void setAge() {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
}


需要对应属性有set方法才行。
我注释掉age的set方法:

spring的配置文件报错。

2.1无参构造

    <bean id="user" class="com.yang.pojo">
        <!-- collaborators and configuration for this bean go here -->
        <property name="age" value="4"> </property>
    </bean>

获取到user对象后,age会被自动初始化。

2.2有参构造

增加一个有参构造

package com.yang.pojo;

public class User {
    int age;
    String name;

    public User(int age) {
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

此时获取到user对象后,age不会被自动初始化,程序报错,找不到

解决方法:
构造器参数实现:

有三种方式来实现,具体如下:

<!--第一种,参数位置-->
    <bean id="user" class="com.yang.pojo.User">
        <constructor-arg index="0" value="5"/>
    </bean>

    <!--第2种,参数类型-->
    <bean id="user" class="com.yang.pojo.User">
        <constructor-arg type="java.lang.Integer" value="5"/>
    </bean>

    <!--第3种,引用类型-ref-->
    <bean id="user" class="com.yang.pojo.User">
        <constructor-arg  ref="xxxx"/>
    </bean>

2. 3 参数名

    <!--第3种,直接参数名或者引用类型-ref-->
    <bean id="user" class="com.yang.pojo.User">
        <constructor-arg  name="age" value="4"/>
    </bean>

三 依赖注入3种实现

3.1 构造器注入

 在创建对象时后,传入属性值。 即 IoC创建对象3种方式都可以实现。

3.2 set注入 !!!

类中的属性必须要有set方法才能使用set注入
可以注入的类型很多,如map,set,String等等,需要记忆。
package com.yang.pojo;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class Student {
    public String address;
    public  String[] books;
    public int age;
    private List<String> hobbys;
    private Map<String,String> card;
    private Set<String> games;
    private Properties pro;

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String[] getBooks() {
        return books;
    }

    public void setBooks(String[] books) {
        this.books = books;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getHobbys() {
        return hobbys;
    }

    public void setHobbys(List<String> hobbys) {
        this.hobbys = hobbys;
    }

    public Map<String, String> getCard() {
        return card;
    }

    public void setCard(Map<String, String> card) {
        this.card = card;
    }

    public Set<String> getGames() {
        return games;
    }

    public void setGames(Set<String> games) {
        this.games = games;
    }

    public Properties getPro() {
        return pro;
    }

    public void setPro(Properties pro) {
        this.pro = pro;
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="hello" class="com.yang.Hello">
        <!-- collaborators and configuration for this bean go here -->
        <property name="age" value="4"> </property>
    </bean>
    <bean id="student" class="com.yang.pojo.Student" scope="prototype">
        <!-- collaborators and configuration for this bean go here -->
        <property name="age" value="4"> </property>
        <property name="address" value="重庆"> </property>
<!--       数组-->
        <property name="books">
            <array>
                <value>红楼</value>
                <value>三国</value>
                <value>西游</value>
            </array>
        </property>

<!--        map-->
        <property name="card">
            <map>
                <entry key="2" value="y1"></entry>
                <entry key="4" value="sdf"></entry>
            </map>
        </property>

<!--Set类型-->
<!--        -->
        <property name="games">
            <set>
                <value>1</value>
                <value>e</value>
                <value>3</value>
            </set>
        </property>
        <!--property-->
        <property name="pro">
            <props >
                 <prop key="name"> yang  </prop>
                <prop key="age"> 56  </prop>
            </props>
        </property>
    </bean>
</beans>

3.3 其他方式注入

如p,c空间。

以上是关于浅谈spring5创建对象3种方式以及依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

spring5

浅谈spring框架的控制反转和依赖注入

依赖注入之针对不同类型变量的几种注入方式

Spring5依赖注入常用的三种方法:构造注入Setter注入自动装配

spring笔记--依赖注入之针对不同类型变量的几种注入方式

[Spring5]IOC容器_Bean管理XML方式_创建对象_set注入属性and有参构造注入属性