网站首页 > 博客文章 正文
一、IOC 和 DI 的概念
1、IOC
IOC(Inversion of control )即“控制反转”,它是一种设计思想而非一个技术实现。描述了Java 开发领域对象的创建以及管理的问题。通过Spring来管理对象的创建、配置和生命周期,这样相当于把控制权交给了Spring,不需要人工来管理对象之间复杂的依赖关系,这样做的好处就是解耦。
Spring 实现 IOC 的重要手段是依赖注入 DI 对象间的依赖的控制权从开发人员手中转移到了容器中,降低了开发成本.
在 Spring 里面,主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器,通过他们来实现对 Bean 的管理。
2、DI
IoC 最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)。
依赖注入(DI,Dependency Injection)是 Spring 实现 IOC 的重要手段,依赖注入将对象间的依赖的控制权从开发人员手中转移到了容器中,降低了开发成本。
3、IOC 容器
在Spring里面,主要提供了 BeanFactory 和 ApplicationContext 两种 IOC 容器,通过他们来实现对 Bean 的管理。
BeanFactory 粗暴简单,可以理解为就是个 HashMap,Key 是 BeanName,Value 是 Bean 实例。通常只提供注册(put),获取(get)这两个功能。我们可以称之为 “低级容器”。
ApplicationContext 可以称之为 “高级容器”。因为他比 BeanFactory 多了更多的功能。他继承了多个接口。因此具备了更多的功能。
二、Spring 容器设计
1、BenaFactory
BeanFactory可以说是 IOC 最顶层的接口,其定义了一个 IOC 容器的基本规范,可以说 BeanFactory 就是一个低配版的 IOC 容器,其定义了 IOC 容器最基本的功能
BeanFactory 使用控制反转对应用程序的配置和依赖性规范与实际的应用代码进行分离,BeanFactory 实例化后并不会自动实例化 Bean,只有当 Bean 被使用时才会对其进行实例化与依赖关系的装配。
public interface BeanFactory {
//对 FactoryBean 的转义定义,因为如果使用 bean 的名字检索 FactoryBean 得到的对象是工厂生成的对象,如果需要得到工厂本身,需要转义。
String FACTORY_BEAN_PREFIX = "&";
//根据 bean 的名字,获取在 IOC 容器中得到 bean 实例。
Object getBean(String name) throws BeansException;
//根据 bean 的名字和 Class 类型来得到 bean 实例,增加了类型安全验证机制。
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
//提供对 bean 的检索,看看是否在 IOC 容器有这个名字的 bean。
boolean containsBean(String name);
//根据 bean 名字得到 bean 实例,并同时判断这个 bean 是不是单例。
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//根据 bean 名字得到 bean 实例,并同时判断这个 bean 是不是原型。
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
//判断 bean 名字和 Type 判断 JavaBean 是否匹配指定的类型
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//得到 bean 实例的 Class 类型
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
//得到 bean 的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
可以看到,在 BeanFactory 里只对 IOC 容器的基本行为作了定义,根本不关心你的 Bean 是如何定义怎样加载的。而要知道 Bean 是如何定义怎样加载的,我们需要看具体的 IOC 容器实现,Spring 提供了许多 IOC 容器的 实现 。比如 GenericApplicationContext 与
ClasspathXmlApplicationContext 。
2、AplicationConext
ApplicationContext 是 Spring 中的核心接口和容器,允许容器通过应用程序上下文环境创建、获取、管理 bean。在构建容器的时候,创建对象采用的策略是立即加载的方式,即只要一读取完配置文件就立即创建配置文件中配置的对象(BeanFactory采用的是延迟加载的方式,什么时候根据 id 获取对象了,什么时候才真正地创建对象)。
从以上类图我们可以看出 ApplicationContext 继承了 6 个接口,除了继承自 BeanFactory 的 HierarchicalBeanFactory 和 ListableBeanFactory 以外,还包括了:EnvironmentCapable、ApplicationEventPublisher、ResourcePatternResolver 和 MessageSource。
- EnvironmentCapable:简单地说就是获取环境变量,定义了 ApplicationContext 启动时的环境,为应用程序环境的两个关键方面建模:配置文件和属性;
- ApplicationEventPublisher:主要是做事件(ApplicationEvent)传播、事件发布的功能;
- ResourcePatternResolver:主要是做资源(Resource)加载,支持多种类型加载;
- MessageSource:国际化,国际化简而言之就是说国际通用的意思,那就是需要不同的语言进行翻译,这个是可以自定义的,在资源文件夹下创建。
### Spring 的三个主要实现类
- ClassPathXmlApplicationContext:可以加载类路径下的配置文件,要求配置文件必须在类路径之下;
- FileSystemXmlApplicationContext:可以加载磁盘中任意路径下的配置文件,要求具有访问权限;
- AnnotationConfigApplicationContext:用于读取注解创建容器。
猜你喜欢
- 2025-07-23 Spring IoC Container 原理解析(spring中ioc的作用与原理)
- 2025-07-23 Spring之底层架构核心概念解析(spring底层设计模式)
- 2025-07-23 深入理解 JSR 303:数据校验在 Spring Boot 中的应用
- 2025-07-23 Springboot集成Kafka原理(kafka结合springboot)
- 2025-07-23 Spring如何加载「IOC容器」以及「装载Bean」源码解读
- 2025-07-23 Spring Security 自动踢掉前一个登录用户,一个配置搞定
- 2025-07-23 Spring Boot 控制反转(IoC)全面解析:从基础到高级实践
- 2025-07-23 spring cloud Alibaba参考的中文文档
- 2025-07-23 Spring Boot执行过程(执行springboot的jar)
- 2025-07-23 SpringBoot中6种拦截器使用场景(springboot拦截器放行)
你 发表评论:
欢迎- 最近发表
-
- 谷歌云推出印度尼西亚“BerdAIa for Security”网络安全计划
- 谷歌:已解决全球服务中断问题,受影响平台涉及Spotify、Discord等
- 不再单一依赖英伟达,OpenAI被曝开始租用谷歌AI芯片训练ChatGPT
- 谷歌云代理商:怎样通过谷歌云服务器搭建社交平台?
- 谷歌云服务遭遇全球性宕机,影响多家互联网巨头
- OpenAI正式将谷歌云纳入供应商名单
- 谷歌给Agent造了个“微信”,和MCP功能互补,多智能体协作更顺畅了
- OpenAI“去微软化”加速:最新引入谷歌(GOOGL.US)构建混合云生态
- 谷歌给Agent造了个“微信”,和MCP功能互补,多智能体协作更顺畅
- 谷歌与OpenAI携手:云合作背后的机遇与隐忧
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- flutterrun (59)
- 系统设计图 (58)
- powershellfor (73)
- messagesource (71)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- qcombobox样式表 (68)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)