蓝色门户网站,自己有网站 做app吗,公司支付网站服务费怎么做分录,信息发布网站设计一聊到java#xff0c;离不开的一个东西就是spring#xff1b;当我想了解什么是spring的时候#xff0c;一查#xff0c;基本上都是围绕着两个词来展开的#xff1a;IoC和AOP。
对于我自己来说#xff0c;AOP我觉得比较好理解#xff0c;因为不管是之前写golang还是pyt…一聊到java离不开的一个东西就是spring当我想了解什么是spring的时候一查基本上都是围绕着两个词来展开的IoC和AOP。
对于我自己来说AOP我觉得比较好理解因为不管是之前写golang还是python都或多或少的接触过。但是IoC就相对要晦涩一点了网上找到的材料又大多只是概念性的照本宣科所以经过一系列的学习后自己也有了一些理解在这里记录一下希望能帮到大家。
什么是IoC
控制反转Inversion of Control是软件工程领域中的一项设计原则它将程序中对象之间的依赖关系的控制权从代码本身转移到外部容器或框架中。这一理念在面向对象编程的实践中尤为常见。
在传统编程模式中对象的创建、配置和管理由开发者在代码中显式完成。开发者需要手动编写代码来创建对象实例并管理它们的生命周期和依赖关系。例如在Java中开发者使用new关键字来创建对象实例并手动设置对象的属性和依赖关系。
但在IOC模式下对象的创建、配置和管理由专门的容器或框架负责。开发者只需定义好对象及其依赖关系容器会自动创建并管理这些对象。例如在Spring框架中开发者通过XML配置文件、Java注解或Java配置类来声明Bean对象Spring容器会根据这些声明来创建Bean实例并管理它们的生命周期和依赖关系。
这种架构带来了诸多优势最明显的我认为就是由于依赖关系由容器管理组件之间的耦合度大大降低。组件只需声明其依赖关系而无需关心依赖对象的创建和管理从而提高了系统的灵活性和可维护性。
实现IoC的机制多种多样如策略设计模式、服务定位器模式、工厂模式以及依赖注入DI等。
所以我们平时听到比较多的DI其实就是IoC的一种实现方式。
接下来我们再了解一下依赖注入这种实现IoC的方法。
什么是依赖注入DI
依赖注入是一种我们可以用来实现控制反转IoC的模式其中被反转的控制是设置对象的依赖关系。
将对象与其他对象连接起来或者将对象“注入”到其他对象中这一操作是由装配器完成的而不是由对象本身完成。
以下是在传统编程中创建对象依赖关系的方式
public class Store {private Item item;public Store() {item new ItemImpl1(); }
}
在上面的示例中我们需要在 Store 类本身中实例化 Item 接口的一个实例。
通过使用依赖注入我们可以重写这个示例而无需指定我们想要的 Item 的实例化过程。
public class Store {private Item item;public Store(Item item) {this.item item;}
}
这样做的一个显著的好处就是我们的Store的业务代码无需关注Item的构造过程以后如果哪天Item的构造的方式变了比如构造函数从2个变成了3个如果是传统的变成模式那么我们就需要修改自己的代码去做适配但是如果是DI的话我们便不需要关心这部分的变化。
什么是IoC Container
核心概念
IOC容器是一种设计模式其核心思想是控制反转Inversion of Control。在传统的应用程序中对象之间的依赖关系通常是硬编码的即一个对象直接创建和使用另一个对象。而IOC容器通过将对象的创建和管理交给容器来反转这种控制从而实现松耦合和更好的可测试性。
实现步骤
容器初始化
在创建和使用IOC容器之前首先需要初始化容器。这通常涉及创建一个容器实例并配置容器的一些基本属性。
对象注册
将需要管理的对象注册到容器中。这通常涉及将对象的名称或标识与对象实例或对象创建工厂进行关联。在Spring框架中可以通过XML配置文件、注解或Java配置类来完成对象的注册。
依赖关系解析
当容器接收到一个对象请求时它需要解析该对象的依赖关系。这通常涉及查找对象所需的依赖项并确保这些依赖项已被注册到容器中。
对象实例化
一旦依赖关系被解析容器就可以创建并返回请求的对象实例。这通常涉及调用对象的构造函数或工厂方法并将解析得到的依赖项注入到对象中。
具体实现方式
基于XML的配置方式
在Spring框架中可以通过XML配置文件来定义Bean即对象和它们的依赖关系。容器在启动时会读取配置文件并解析出Bean的定义和依赖关系。然后当容器接收到一个对象请求时它会根据配置文件中的信息来创建和返回对象实例。
示例
beansbean idserviceA classcom.example.ServiceA/bean idserviceB classcom.example.ServiceBproperty nameserviceA refserviceA//bean
/beans
在上述配置中serviceA和serviceB是两个BeanserviceB依赖于serviceA。容器在创建serviceB实例时会自动将serviceA实例注入到serviceB中。
基于注解的配置方式
除了XML配置文件外Spring框架还支持通过注解来定义Bean和它们的依赖关系。这通常涉及在类上使用特定的注解来标记它们作为Bean并在字段或方法上使用注解来定义依赖关系。
示例
Component
public class ServiceA {// 类定义
}Component
public class ServiceB {Autowiredprivate ServiceA serviceA;// 类定义
}
在上述示例中Component注解用于标记ServiceA和ServiceB作为Bean。Autowired注解用于自动注入ServiceA实例到ServiceB中。
基于Java配置类的配置方式
Spring框架还支持通过Java配置类来定义Bean和它们的依赖关系。这通常涉及创建一个配置类并使用Configuration注解和Bean注解来定义Bean。
示例
Configuration
public class AppConfig {Beanpublic ServiceA serviceA() {return new ServiceA();}Beanpublic ServiceB serviceB() {ServiceB serviceB new ServiceB();serviceB.setServiceA(serviceA());return serviceB;}
}
在上述示例中AppConfig是一个配置类使用Configuration注解进行标记。Bean注解用于定义BeanserviceB依赖于serviceA通过调用serviceA()方法来获取serviceA实例并注入到serviceB中。
容器的高级特性
除了基本的对象注册和依赖注入功能外IOC容器还支持一些高级特性如生命周期管理、AOP面向切面编程支持、事件发布等。这些特性使得IOC容器更加灵活和强大能够满足更复杂的应用程序需求。