Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)

这篇具有很好参考价值的文章主要介绍了Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、控制反转:缩写IoC

是一种设计原则,降低程序代码之间的耦合度

对象由Ioc容器统一管理,当程序需要使用对象时直接从IoC容器中获取。这样对象的控制权就从应用程序转移到了IoC容器

二、依赖注入:缩写DI

依赖注入是一种消除类之间依赖关系的设计模式。例如,A类要依赖B类,A类不再直接创建B类,而是把这种依赖关系配置在外部xml文件(或java config文件)中,然后由Spring容器根据配置信息创建、管理bean类。可以简单的理解为给对象赋值

两种实现方式:

1、构造方法注入(非主流了解即可)

Spring容器调用构造方法注入被依赖的实例,构造方法可以是有参的或者是无参的。Spring在读取配置信息后,会通过反射方式调用实例的构造方法,如果是有参构造方法,可以在构造方法中传入所需的参数值,最后创建类对象。

步骤:

编写用户类User类,在User类中定义id、name和password三个属性

创建applicationContext-User.xml文件,在该文件中添加User类的配置信息

编写测试类:创建测试类TestUser,用于测试依赖注入的结果

编写用户类User类

public class User {   
private int id;   private String name;   private String password;  
 public User(int id, String name, String password){  
     this.id=id;	this.name=name;       this.password=password; }   
public String toString(){      
 return "id="+id+",name="+name+",password="+password;   }} 

配置信息中使用到<constructor-arg>元素

具体介绍如下:

一个<constructor-arg>元素表示构造方法的一个参数,且定义时不区分顺序,只需要通过<constructor-arg>元素的name属性指定参数即可。<constructor-arg>元素还提供了type属性类指定参数的类型,避免字符串和基本数据类型的混淆。

例如:

<bean id="user" class="com.itheima.User">

        <constructor-arg name="id" value="1">

        </constructor-arg>

        <constructor-arg name="name" value="张三">

        </constructor-arg>

        <constructor-arg name="password" value="123"></constructor-arg>

</bean>

测试类代码

public class TestUser {

    public static void main(String[] args)throws Exception{

        //加载applicationContext.xml配置

        ApplicationContext applicationContext=new

        ClassPathXmlApplicationContext("applicationContext-User.xml");

        //获取配置中的User实例

        User user=( User)applicationContext.getBean("user");

        System.out.println(user);

    }

}

2、属性setter方法注入(主流注入方法)

步骤

编写用户类User类,在User类中定义id、name和password三个属性并且注明setter方法

创建applicationContext-User.xml文件,在该文件中添加User类的配置信息

编写测试类:创建测试类TestUser,用于测试依赖注入的结果

 编写用户类User类

public class User {   
 private int id;  
 private String name;  
 private String password;   
public void setId(Integer id){
	this.id=id;
}   
public void setUsername(String username){
	this.username= username;
}  
 public void setPassword (String password){
	this. password = password;
} 
  public String toString(){       
return "id="+id+",name="+name+",password="+password;   }
}

创建applicationContext-User.xml文件,在该文件中添加User类的配置信息,

在类中注明setter方法,在配置文件中使用property(属性的意思)元素

<bean id="user" class="com.itheima.User">     
 <property name="id" value="2"></property>     
<property name="name" value="李四"></property>     
<property name="password" value="456"></property> 
</bean>

property属性使用

name的属性值准确的讲不是属性名,而是set方法去掉set关键字后的名字

属性名idàsetter方法setIdd();去掉关键字setà即idd(驼峰命名)

测试类:

public class TestUser {

    public static void main(String[] args)throws Exception{

        //加载applicationContext.xml配置

        ApplicationContext applicationContext=new

        ClassPathXmlApplicationContext("applicationContext-User.xml");

        //获取配置中的User实例

        User user=( User)applicationContext.getBean("user");

        System.out.println(user);

    }

}

三、依赖注入和控制反转的比较

依赖注入(DI)和控制反转(IoC)是从不同角度来描述了同一件事情

依赖注入是从应用程序的角度描述,即应用程序依赖IoC容器创建并注入它所需要的外部资源;而控制反转是从IoC容器的角度描述,即IoC容器控制应用程序,由IoC容器反向地向应用程序注入应用程序所需要的外部资源。这里所说的外部资源可以是外部实例对象,也可以是外部文件对象等。

四、对降低程序代码之间的耦合度的解释:

在传统模式中如果使用一个类,自然的做法是创建一个类的实例:

class Player{ 

    Weapon weapon; 

    Player(){ 

        // 与 Sword类紧密耦合

        this.weapon = new Sword(); 

    } 

    public void attack() {

        weapon.attack();
    }

}  

这个方法存在耦合太紧的问题,例如,玩家的武器只能是剑Sword而不能把Sword替换成枪Gun。要把Sword改为Gun,所有涉及到的代码都要修改,当然在代码规模小的时候这根本就不是什么问题,但代码规模很大时,就会费时费力了。

运用依赖注入的方式降低耦合的示例:

class Player{ 
    Weapon weapon; 
    // weapon 被注入进来

    Player(Weapon weapon){ 
        this.weapon = weapon; 
    } 

    public void attack() {

        weapon.attack();

    }
    public void setWeapon(Weapon weapon){ 

        this.weapon = weapon; 
    } 
}  

如上所示,Weapon类的实例并不在代码中创建,而是外部通过构造函数传入,传入类型是父类Weapon,所以传入的对象类型可以是任何Weapon子类。

传入哪个子类,可以在外部xml文件(或者java config文件)中配置,Spring容器根据配置信息创建所需子类实例,并注入Player类中,如下所示:

    <bean id="player" class="com.Springyx.demo.Player">

        <construct-arg ref="weapon"/>

    </bean>

    

    <bean id="weapon" class=" com.Springyx.demo.Gun">

    </bean>

上面代码中<construct-arg ref="weapon"/> ref指向id="weapon"的bean,传入的武器类型是Gun,如果想改为Sword,可以作如下修改:

    <bean id="weapon" class=" com.Springyx.demo.Sword">

    </bean>

只需修改这一处配置就可以。

注意:松耦合,并不是不要耦合。A类依赖B类,A类和B类之间存在紧密耦合,如果把依赖关系变为A类依赖B的父类B0类,在A类与B0类的依赖关系下,A类可使用B0类的任意子类,A类与B0类的子类之间的依赖关系是松耦合的(即创建中间商)文章来源地址https://www.toymoban.com/news/detail-827742.html

到了这里,关于Spring学习笔记(二)Spring的控制反转(设计原则)与依赖注入(设计模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC (控制反转)和 DI (依赖注入)的概念,以及如何在 Spring 框架中实现它们。 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传统编程相比,传统编程中我

    2024年02月04日
    浏览(18)
  • Spring入门&控制反转(或依赖注入)&AOP的关键概念& 多配置文件&与web集成

    目录 1. 什么是spring,它能够做什么? 2. 什么是控制反转(或依赖注入) 3. AOP的关键概念 4. 示例 4.1 创建工程 4.2 pom文件 4.3 spring配置文件 4.4 示例代码 4.4.1 示例1 4.4.2 示例2 (abstract,parent示例) 4.4.3 使用有参数构造方法创建javaBean 4.4.4 init-method:指定bean的初始化方法 4.4.5 复杂属

    2024年02月09日
    浏览(14)
  • 【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

    【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

    我们都知道Spring 框架主要的优势是在 简化开发 和 框架整合 上,至于如何实现就是我们要学习Spring 框架的主要内容,今天我们就来一起学习Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)。 以经典的三层架构MVC作为案例,以前我们都是这么干的,看如下代码: 按照

    2024年02月05日
    浏览(17)
  • Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性

    Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:Java Spring IoCDI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性 🎉欢迎大家点赞👍评论📝收藏⭐文章 我们一下要学习的内容都是为了实现⾼内聚低耦合来进行的 软件设计原则:⾼内聚低耦合. ⾼内聚指

    2024年04月15日
    浏览(14)
  • 从依赖倒置原则到IOC控制反转实现

    从依赖倒置原则(Dependency Inversion Principle, DIP)到控制反转(Inversion of Control, IoC)再到依赖注入(Dependency Injection, DI)的演进过程,我们可以理解为一种逐步抽象和解耦的设计思想。这种思想在C#等面向对象的编程语言中得到了广泛的应用。 首先,让我们回顾一下依赖倒置原

    2024年04月24日
    浏览(13)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(31)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(16)
  • PHP依赖注入 与 控制反转详解

    PHP依赖注入 与 控制反转详解

      依赖注入 是一种设计模式,用于解耦组件之间的依赖关系。 它的主要思想是通过 将依赖的对象传递给调用方 ,而 不是由调用方自己创建或管理依赖的对象 。这种方式使得组件的依赖关系更加灵活,易于维护和测试。 控制反转 是一个更广泛的概念,它与依赖注入紧密相

    2024年02月06日
    浏览(13)
  • 6.3Java EE——控制反转与依赖注入

    一、控制反转的概念 传统面向对象程序设计原则         控制反转(Inversion of Control,缩写为IoC)是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。在传统面向对象编程中,获取对象的方式是用new主动创建一个对象,也就是说应用程序掌握着对

    2024年02月16日
    浏览(11)
  • 深入理解WPF中的依赖注入和控制反转

    深入理解WPF中的依赖注入和控制反转

    在WPF开发中, 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系 。今天就以一个简单的小例子,简述如何在WPF中实现依赖注入和控制反转,仅供学习分享使用,如有不足之处

    2024年02月06日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包