一、什么是IOC
IOC呢是spring的一种思想,他的英文名全称Inversion of Control,中文译为“控制反转”或“依赖注入”,是面向对象编程中的一种设计原则。这个思想的意义是什么呢?这种设计思想的核心是将原本由代码直接操控的对象的调用权交给第三方(如一个容器)来控制。大白话就是解耦代码,降低代码间的耦合度。
🌰例子
下面可以通过一个例子来理解ioc这个思想
①传统思想
假设你正在准备一顿晚餐,需要用到一些食材和烹饪工具。在传统的方式下,你可能会亲自去超市购买食材,回到家后自己切菜、炒菜,并使用锅碗瓢盆等烹饪工具。在这个过程中,你负责了对象的创建(购买食材和烹饪工具)和使用(切菜、炒菜)。
②IOC思想
然而,如果我们采用IOC思想,这个过程就会有所不同。你可以想象有一个“晚餐准备助手”的容器,这个容器负责为你提供所需的食材和烹饪工具,而你只需专注于如何使用这些资源来制作晚餐。具体来说,你只需要告诉“晚餐准备助手”你需要哪些食材和工具,然后它就会为你准备好一切。其实说呢IOC与接口有些相似,你放在一个容器里,拿的时候拿出来(这也叫做DI注入),放的时候直接放在容器里。你不再需要关心食材是从哪里买的,工具是如何得到的,只需关注如何使用它们来完成晚餐的制作直接使用就好了。
在这个例子中,“晚餐准备助手”就相当于IOC容器,它负责对象的创建和管理,而你作为开发者,只需关注对象的使用。这就是IOC思想的核心:将对象的创建和管理权交给容器(这也叫做控制反转了,由本人控制对象的权利交给了容器),你只需要关系如何使用这些对象。
①传统造汽车
下面我们再结合一个代码案例来模拟一个制造汽车的过程:
public class Main {
public static void main(String[] args) {
Car car = new Car(21);
car.run();
}
}
public class Car {
private Framework framework;
public Car(int size) {
framework = new Framework(size);
System.out.println("car init... ");
}
public void run() {
System.out.println("car run....");
}
}
public class Framework {
private Bottom bottom;
public Framework(int size) {
bottom = new Bottom(size);
System.out.println("framework init...");
}
}
public class Bottom {
private Tire tire;
public Bottom(int size) {
tire = new Tire(size);
System.out.println("bottom init...");
}
}
public class Tire {
private int size;
public Tire(int size) {
System.out.println("tire size:"+size);
}
}
这是一种很传统的造车方式自给自足,这种方式发现如果要修改添加一个参数就很麻烦需要更改多个地方(这就是高耦合性),我们的代码当然是要耦合度越低,才以便于后期更好维护啊。所以便有了IOC思想
②IOC造车
public class Car {
private Framework framework;
public Car(Framework framework) {
this.framework = framework;
System.out.println("car init...");
}
public void run() {
System.out.println("car run...");
}
}
public class Framework {
private Bottom bottom;
public Framework(Bottom bottom) {
this.bottom = bottom;
System.out.println("framework init...");
}
}
public class Bottom {
private Tire tire;
public Bottom(Tire tire) {
this.tire = tire;
System.out.println("bottom init...");
}
}
public class Tire {
private int size;
private String color;
public Tire(int size,String color) {
System.out.println("tire size:"+size+",color:"+color);
}
}
public class Main {
public static void main(String[] args) {
Tire tire = new Tire(19,"red");
Bottom bottom = new Bottom(tire);
Framework framework = new Framework(bottom);
Car car = new Car(framework);
car.run();
}
}
在这里你可以发现用IOC思想就可以极大程度的降低了耦合程度,造什么就用this给你什么不需要自己去new,而是交给了另一个容器去创建。
二、对象的存放
了解了IOC容器之后我们再来了解一下IOC是如何存取对象的吧
这就不得不提到五大注解:@Controller@Service@Repository@Component@Configuration只要被这五个注解标识的类就被放到ioc容器中了哦。
@Controller
通常用于标记Spring MVC中的控制器类,负责处理HTTP请求和返回响应
@Controller
public class MyController {
// ...
}
@Service
用于标记业务逻辑层的组件。
@Service
public class MyService {
// ...
}
@Repository
通常用于标记数据访问层。如DAO类。Spring会为这些类创建代理,用于异常处理。
@Repository
public class MyRepository {
// ...
}
@Component
用于标记Spring管理的组件。任何被@Component注解的类都将被Spring容器管理,成为一个Spring Bean
@Component
public class MyComponent {
// ...
}
@Cofiguration
用于标记配置层的注解。
@Configuration
public class MyConfiguration{
//...
}
关于IOC的注解就先分享到这里哦,DI(依赖注入)有更复杂的细节需要更详细的篇章讲解哦。