文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

深入浅出讲解Spring框架中依赖注入与控制反转及应用

2024-04-02 19:55

关注

概念:

     依赖注入(Dependency Injection,DI)与控制反转(IoC)的含义相同,只不过是从两个角度描述的同一个概念。对于一个Spring初学者来说,这两种称呼都很难理解,我们通过简单的语言来描述这两个概念。

使用对比

1. 使用前:

      当某个Java对象(调用者)需要调用另一个Java对象(被调用者,就是被依赖对象)时,在传统模式下,调用者通常会采用"new被调用者"的代码方式来创建对象。这种方式会导致调用者与被调用者之间的耦合性增加,不利于后期项目的升级和维护。

2. 使用后:

    在使用Spring框架后,对象的实例不再由调用者来创建,而是由Spring框架的容器来创建,它会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到Spring框架容器,控制权发生了反转,这就是Spring框架的控制反转。

    从Spring框架容器的角度来看,它负责将被依赖对象赋值给调用者的成员变量,相当于调用者注入了其依赖实例,这就是Spring框架的依赖注入。

理解控制反转(Ioc):

     控制反转也称为依赖注入,是面向对象编程中的一种设计理念,用来降低程序代码间的耦合度,在MVC的设计模式中经常使用。首先考虑什么是依赖。依赖在代码中一般指通过局部变量、方法参数、返回值等建立的对于其他对象的调用关系。例如,在A类的方法中,实例化了B类的对象并调用其方法以完成特定的功能,即A类依赖于B类。

     几乎所有应用都由两个或更多的类,通过彼此合作来实现完整功能的。类与类之间的依赖关系增加了程序开发的复杂程度,在开发一个类的时候,还要考虑对正在使用该类的其他类的影响。如常见的业务层调用数据访问层实现持久化操作,解决问题的步骤如下:

(1)获取Spring开发包并为工程添加Spring框架支持

(2)为业务层和数据访问层接口,声明所需要的方法

(3)编写数据访问层接口UserDao的实现类,完成具体的持久化操作

(4)在业务实现类中声明UserDao接口类型的属性,并添加适当的构造方法为属性赋值

(5)在Spring的配置文件中,将DAO对象以构造注入的方式赋值给业务实例的UserDao类型属性

(6)在代码中获取Spring配置文件装配好的业务类对象,实现程序功能

IoC的应用方法 

IoC容器中配置属性的语法

第一种方式:

Book.java

package cn.spring.ioc.demo.exercise;
 
public class Book {
    private Integer id;
    private String bookName;
    private Float price;
 
    public Integer getId() {
        return id;
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public Float getPrice() {
        return price;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    public void setPrice(Float price) {
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", price=" + price +
                '}';
    }
}

容器配置:

    <bean id="book1" class="cn.spring.ioc.demo.exercise.Book">
        <property name="id" value="1001"/>
        <property name="bookName" value="C++基础编程"/>
        <property name="price" value="28.2"/>
    </bean>

第二种方式:

Book_1.java

package cn.spring.ioc.demo.exercise;
 
public class Book_1 {
    private Integer id;
    private String bookName;
    private Float price;
 
    public Book_1(Integer id,String bookName,Float price){
        this.id = id;
        this.bookName = bookName;
        this.price = price;
    }
 
    public Integer getId() {
        return id;
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public Float getPrice() {
        return price;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    public void setPrice(Float price) {
        this.price = price;
    }
 
    @Override
    public String toString() {
        return "Book_1{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", price=" + price +
                '}';
    }
}

容器配置:

    <bean id="book2" class="cn.spring.ioc.demo.exercise.Book_1">
        <constructor-arg index="0" value="1002"/>
        <constructor-arg index="1" value="Java/>
        <constructor-arg index="2" value="33.3"/>
    </bean>

第三种方式:

BookFactory.java

package cn.spring.ioc.demo.exercise;
 
public class BookFactory {
    public Book getBookInstance(Book book){
        return book;
    }
}

容器配置:

    <bean id="book3" class="cn.spring.ioc.demo.exercise.Book">
        <property name="id" value="1004"/>
        <property name="bookName" value="go"/>
        <property name="price" value="88.2"/>
    </bean>
 
    <bean id="factory" class="cn.spring.ioc.demo.exercise.BookFactory" />
    <bean id="finstance" factory-bean="factory" factory-method="getBookInstance">
        <constructor-arg index="0" ref="book3"/>
    </bean>

第四种方式:

Book_1Factory.java

package cn.spring.ioc.demo.exercise;
 
public class Book_1Factory {
    public static Book_1 getBookInstance(Integer id,String bookName,Float price){
        return new Book_1(id, bookName, price);
    }
}

容器配置:

    <bean id="bf" class="cn.spring.ioc.demo.exercise.Book_1Factory" factory-method="getBookInstance">
        <constructor-arg index="0" value="1003"/>
        <constructor-arg index="1" value="python"/>
        <constructor-arg index="2" value="99.9"/>
    </bean>

到此这篇关于深入浅出讲解Spring框架中依赖注入与控制反转及应用的文章就介绍到这了,更多相关Spring框架 依赖注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯