2. Spring IOC 与容器的概念

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Spring 框架的功能被有组织的分散到约 20 个模块中。这些模块分布在核心容器,数据访问/集成,Web,AOP(面向切面的编程),植入(Instrumentation),消息传输和测试,如下面的图所示。

Spring 框架的功能被有组织的分散到约 20 个模块中。这些模块分布在核心容器,数据访问/集成,Web,AOP(面向切面的编程),植入(Instrumentation),消息传输和测试,如下面的图所示。


image.pngimage.pngimage.png

image.png


核心容器模块



核心容器 由以下模块组成,spring-core, spring-beans,spring-context,spring-context-support,和spring-expression (Spring表达式语言)。


spring-core和spring-beans模块提供了框架的基础功能,包括IOC和依赖注入功能。


BeanFactory 是一个成熟的工厂模式的实现。你不再需要编程去实现单例模式,允许你把依赖关系的配置和描述从程序逻辑中解耦。


上下文(spring-context)模块建立在由Core和Beans模块提供的坚实的基础上:它提供一个框架式的对象访问方式,类似于一个 JNDI 注册表。上下文模块从 Beans 模块继承其功能,并添加支持国际化(使用,例如,资源集合),事件传播,资源负载,并且透明创建上下文,例如,Servlet容器。Context 模块还支持 Java EE 的功能,如 EJB,JMX 和基本的远程处理。 ApplicationContext 接口是 Context 模块的焦点。 spring-context-support 支持整合普通第三方库到Spring应用程序上下文,特别是用于高速缓存(ehcache,JCache)和调度(CommonJ,Quartz)的支持。


spring-expression模块提供了强大的表达式语言去支持查询和操作运行时对象图。这是对 JSP 2.1 规范中规定的统一表达式语言(unified EL)的扩展。该语言支持设置和获取属性值,属性分配,方法调用,访问数组,集合和索引器的内容,逻辑和算术运算,变量命名以及从Spring的IoC容器中以名称检索对象。 它还支持列表投影和选择以及常见的列表聚合。


AOP 和 Instrumentation 模块



spring-aop 模块提供了一个符合AOP联盟(要求)的面向方面的编程实现,例如,允许您定义方法拦截器和切入点(pointcuts),以便干净地解耦应该被分离的功能实现。 使用源级元数据(source-level metadata)功能,您还可以以类似于.NET属性的方式将行为信息合并到代码中。


单独的 spring-aspects 模块,提供了与 AspectJ 的集成。


spring-instrument 模块提供了类植入(instrumentation)支持和类加载器的实现,可以应用在特定的应用服务器中。该 spring-instrument-tomcat 模块包含了支持 Tomcat 的植入代理。


BeanFactory 接口 和 ApplicationContext 接口



在基于 Spring 的应用中,你的应用对象生存于 Spring 容器(container)中。Spring 容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡。


容器是 Spring 框架的核心。Spring 容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更易于理解,更易于重用并且更易于进行单元测试。


Spring 容器并不是只有一个。Spring 自带了多个容器实现,可以归为两种不同的类型。在 Spring Ioc 容器的代表就是 org.springframework.beans 包中的 BeanFactory 接口,BeanFactory 接口提供了 IoC 容器最基本功能;而 org.springframework.context 包下的 ApplicationContext 接口扩展了 BeanFactory,还提供了与 Spring AOP 集成、国际化处理、事件传播及提供不同层次的 context 实现,如针对 Web 应用的 WebApplicationContext。


简单说,BeanFactory 提供了 IoC 容器最基本功能,而 ApplicationContext 则增加了更多支持企业级功能支持。ApplicationContext 完全继承 BeanFactory,因而 BeanFactory 所具有的语义也适用于 ApplicationContext。


  • XmlBeanFactory:BeanFactory 实现,提供基本的 IoC 容器功能,可以从 classpath 或文件系统等获取资源。


Resource resource = new FileSystemResource(file); 
BeanFactory beanFactory = new XmlBeanFactory(resource);


使用应用上下文


Spring自带了多种类型的应用上下文。下面罗列的几个是你最有可能遇到的。

以下都是 ApplicationContext 的实现:


  • AnnotationConfigApplicationcontext: 从一个或多个基于 Java 的配置类中加载 Spring 应用上下文,


  • AnnotationConfiglebApplicationcontext: 从一个或多个基于 Java 的配置类中加载 SpringWeb 应用上下文。


  • ClassPathxmApplicationcontext: 从类路径下的一个或多个 XML 配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。


  • FilesystemxmApplicationContext: 从文件系统下的一个或多个 XML 配置文件中加载上下文定义


  • XmlWebApplicationcontext: 从Web应用下的一个或多个 XML 配置文件中加载上下文定义.


bean的生命周期



在传统的Java应用中, bean的生命周期很简单。使用Java关键字new进行bean实例化,然后该bean就可以使用了。一旦该bean不再被使用,则由Java自动进行垃圾回收。


相比之下, Spring容器中的 bean的生命周期就显得相对复杂多了。正确理解Springbean的生命周期非常重要,因为你或许要利用Spring提供的扩展点来自定义bean的创建过程。


参考


Spring实战(第4版)-异步社区





目录
相关文章
|
1月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
27天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
33 0
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
137 9
|
2月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
34 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
76 0
|
2月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
50 0
|
22天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
70 2
|
12天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
43 5
|
16天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。