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

22 篇文章 1 订阅
7 篇文章 0 订阅

一 背景介绍

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空间。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值