📜  Spring——通过示例了解控制反转

📅  最后修改于: 2022-05-13 01:55:49.175000             🧑  作者: Mango

Spring——通过示例了解控制反转

Spring IoC(控制反转)容器是 Spring Framework 的核心。它创建对象,配置和组装它们的依赖关系,管理它们的整个生命周期。容器使用依赖注入(DI)来管理组成应用程序的组件。它从配置文件 (XML) 或Java代码或Java注释和Java POJO 类中获取有关对象的信息。这些对象称为 Bean。由于Java对象及其生命周期的控制不是由开发人员完成的,因此称为控制反转。
有两种类型的 IoC 容器:

  • 豆厂
  • 应用程序上下文

这意味着如果你想在 spring 中使用 IoC 容器,我们是否需要使用 BeanFactory 或 ApplicationContext。 BeanFactory 是 IoC 容器的最基本版本,ApplicationContext 扩展了 BeanFactory 的特性。以下是 Spring IoC 的一些主要特性,

  • 为我们创建对象,
  • 管理我们的对象,
  • 帮助我们的应用程序可配置,
  • 管理依赖项

实现:那么现在让我们通过一个示例来了解 Spring 中的 IoC 是什么。假设我们有一个名为 Sim 的接口,它有一些抽象方法 call() 和 data()。

Java
// Java Program to Illustrate Sim Interface
public interface Sim
{
    void calling();
    void data();
}


Java
// Java Program to Illustrate Airtel Class
 
// Class
// Implementing Sim interface
public class Airtel implements Sim {
 
    @Override public void calling()
    {
        System.out.println("Airtel Calling");
    }
 
    @Override public void data()
    {
        System.out.println("Airtel Data");
    }
}


Java
// Java Program to Illustrate Jio Class
 
// Class
// Implementing Sim interface
public class Jio implements Sim{
    @Override
    public void calling() {
        System.out.println("Jio Calling");
    }
 
    @Override
    public void data() {
        System.out.println("Jio Data");
    }
}


Java
// Java Program to Illustrate Mobile Class
 
// Class
public class Mobile {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating instance of Sim interface
        // inside main() method
        // with reference to Jio class constructor
        // invocation
        Sim sim = new Jio();
 
        // Sim sim = new Airtel();
 
        sim.calling();
        sim.data();
    }
}


XML


 
  
 


Java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Mobile {
    public static void main(String[] args) {
        // Using ApplicationContext tom implement Spring IoC
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
         
        // Get the bean
        Sim sim = applicationContext.getBean("sim", Sim.class);
         
        // Calling the methods
        sim.calling();
        sim.data();
    }
}


Java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Mobile {
    public static void main(String[] args) {
       
        // Using ApplicationContext tom implement Spring IoC
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
         
        // Get the bean
        Sim sim = applicationContext.getBean("sim", Sim.class);
         
        // Calling the methods
        sim.calling();
        sim.data();
    }
}


现在我们创建了另外两个类 Airtel 和 Jio,它们实现了 Sim 接口并覆盖了接口方法。

Java

// Java Program to Illustrate Airtel Class
 
// Class
// Implementing Sim interface
public class Airtel implements Sim {
 
    @Override public void calling()
    {
        System.out.println("Airtel Calling");
    }
 
    @Override public void data()
    {
        System.out.println("Airtel Data");
    }
}

Java

// Java Program to Illustrate Jio Class
 
// Class
// Implementing Sim interface
public class Jio implements Sim{
    @Override
    public void calling() {
        System.out.println("Jio Calling");
    }
 
    @Override
    public void data() {
        System.out.println("Jio Data");
    }
}


所以现在让我们在 main 方法中调用这些方法。所以通过实现运行时多态性概念我们可以做这样的事情

Java

// Java Program to Illustrate Mobile Class
 
// Class
public class Mobile {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating instance of Sim interface
        // inside main() method
        // with reference to Jio class constructor
        // invocation
        Sim sim = new Jio();
 
        // Sim sim = new Airtel();
 
        sim.calling();
        sim.data();
    }
}


但是如果将来另一个新的 Sim Vodafone 出现了,我们需要再次更改代码中的子类名称,像这样

Sim sim = new Vodafone();

所以我们必须在源代码中进行配置。那么如何使其可配置呢?我们不想触碰它的源代码。源代码应该是不变的。我们怎样才能做到呢?这里 Spring IoC 出现了。所以在这个例子中,我们将使用 ApplicationContext 来实现一个 IoC 容器。首先,我们必须创建一个 XML 文件并将该文件命名为“ beans.xml ”。

示例: beans.xml 文件 

XML



 
  
 


输出说明:在 beans.xml 文件中,我们创建了beans 。所以在 id 内部,我们必须传递唯一的 id,在类内部,我们必须传递要为其创建 bean 的类名称。稍后,在 main 方法中,我们可以将其取出,这将在即将到来的程序中进行描述。

Java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Mobile {
    public static void main(String[] args) {
        // Using ApplicationContext tom implement Spring IoC
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
         
        // Get the bean
        Sim sim = applicationContext.getBean("sim", Sim.class);
         
        // Calling the methods
        sim.calling();
        sim.data();
    }
}

输出:

Jio Calling
Jio Data

现在,如果您想使用 Airtel sim,那么您只需在beans.xml文件中进行更改。主要方法将是相同的。

Java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Mobile {
    public static void main(String[] args) {
       
        // Using ApplicationContext tom implement Spring IoC
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
         
        // Get the bean
        Sim sim = applicationContext.getBean("sim", Sim.class);
         
        // Calling the methods
        sim.calling();
        sim.data();
    }
}

输出:

Airtel Calling
Airtel Data