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

网友投稿 454 2022-08-16


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

目录概念:使用对比1. 使用前:2. 使用后:理解控制反转(Ioc):IoC的应用方法

概念:

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

使用对比

1. 使用前:

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

2. 使用后:

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

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

理解控制反转(Ioc):

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

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

(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 +

'}';

}

}

容器配置:

第二种方式:

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 +

'}';

}

}

容器配置:

第三种方式:

BookFactory.java

package cn.spring.ioc.demo.exercise;

public class BookFactory {

public Book getBookInstance(Book book){

return book;

}

}

容器配置:

第四种方式:

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);

}

}

容器配置:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于spring boot使用 jdbc+mysql 连接的问题
下一篇:JavaWeb简单文件上传流程的实战记录
相关文章

 发表评论

暂时没有评论,来抢沙发吧~