Spring学习(三)—— IoC控制反转

78 篇文章 0 订阅
9 篇文章 0 订阅
本文详细介绍了Spring框架中的控制反转IoC和依赖注入DI概念,指出它们如何改变对象创建和依赖关系的管理。通过XML配置和注解的方式展示了Spring如何实现IoC,强调了Bean的定义信息与实现的分离以及零配置的可能性。文中还通过实例演示了如何使用XML配置和注解进行对象创建和属性注入,并列举了不同类型的构造方法注入方式。
摘要由CSDN通过智能技术生成

IoC本质

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。

IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。

在之前的博客中就写过,

Hello hello = new Hello();
hello.setName("Spring");

这两句话由beans.xml来实现,个人理解这就是控制反转,也就是说控制对象的创建的程序被反转了,

程序不用来创建对象,只用来接收对象,对象现在是由Spring创建的。

依赖注入 : 利用set方法来进行注入。

通过无参构造方法来创建对象时,先创建对象,然后通过set方法注入属性

<bean id="user" class="com.chen.pojo.User">       
       <property name="name" value="chen"/>   
</bean>

通过无参构造方法来创建对象有三种方法:

java实体类如下

package com.zhang.bean;

/**
 * @title: Hello
 * @Author 张宜强
 * @Date: 2021/7/20 9:53
 * @Effect:
 */
public class Hello {
    private String name1;
    private String name2;
    private int name3;

    public Hello(String name1, String name2, int name3) {
        this.name1 = name1;
        this.name2 = name2;
        this.name3 = name3;
    }

    @Override
    public String toString() {
        return "Hello{" +
                "name1='" + name1 + '\'' +
                ", name2='" + name2 + '\'' +
                ", name3=" + name3 +
                '}';
    }
    public void show(){
        System.out.println(this.toString());
    }
}

配置如下

<!-- 第一种根据index参数下标设置 -->
<bean id="hello1" class="com.zhang.bean.Hello">
    <!-- index指构造方法 , 下标从0开始 -->
    <constructor-arg index="0" value="Spring1"/>
    <constructor-arg index="1" value="Spring1"/>
    <constructor-arg index="2" value="1"/>

</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="hello2" class="com.zhang.bean.Hello">
    <!-- name指参数名 -->
    <constructor-arg name="name1" value="Spring2"/>
    <constructor-arg name="name2" value="Spring2"/>
    <constructor-arg name="name3" value="2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="hello3" class="com.zhang.bean.Hello">
    <constructor-arg type="java.lang.String" value="Spring3"/>
    <constructor-arg type="java.lang.String" value="Spring3"/>
    <constructor-arg type="int" value="3"/>
</bean>

输出结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张宜强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值