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 方法中,我们可以将其取出,这将在即将到来的程序中进行描述。
Bean Definition: In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
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