当前位置: 首页 > article >正文

spring Ioc 容器的简介和Bean之间的关系

IOC容器的基本介绍

springIOC是spring的核心

从上面的图可以看到,如果我们自己去管理对象之间的关系的话是非常麻烦的,而且还很容易出现问题,由此IOC容器出现了,它就是让代码去管理关系 

IOC 将对象的创建依赖关系的管理生命周期的控制从应用程序代码中解耦出来

依赖注入:

它的话是在程序的运行过程中动态的去注入某个对象

IOc容器的思考和应用

IOC容器使用的存储数据类型

IOC容器的数据存储结构使用的是Bean(Object),所使用的类型是HashMap。

在你的开发工具里面创建一个Maven项目,在里面找到管理bean的类BeanDefinitionRegistry,可以使用双击shift键打开搜索进行查询。

这个类里面有一个方法:getBeanDefinitiontount(),从字面意思可以看出是我们定义bean的数量,打开它的实现类DefaultListableBeanFactory或者SimpleBeanDefinitionRegistry。

这里调用的是map的size方法可以点击进去查看类型

获取Spring容器

在你的项目中创建一个service包来存储接口方法的,在service里面创建一个impl包来存放实现类的。

在service包里面创建一个接口,并定义一个存储接口方法

在创建一个接口,定义一个账户存储服务方法

字后定义其实现类在impl包下

@RequiredArgsConstructor这个注解是帮助我们注入使用的就是取代了@Autowired注解。

创建一个context包用来获取Spring容器在里面创建一个方法

ApplicationContextAware接口能够轻松感知并在Spring中获取应用上下文,进而访问容器中的其他Bean和资源,这增强了组件间的解耦,了代码的灵活性和可扩展性,是Spring框架中实现高级功能的关键接口之一。

在里面定义Spring容器ApplicationContext也就是Spring容器的上下文

之后可以我们的Spring容器

第二种方法是使用ApplicationListener监听器

之后也可以将这个Spring容器返回出去,也就是上面的getContext方法

可以从IOC容器中获取的启发

需要选择合适的数据结构而且高效进行使用,而且需要使用到封装可以将方法封装到一个java类中等启发。

IOC容器和Bean之间的关系

读取Bean的配置信息

Bean的生命周期

创建一个Bean包在里面创建一个类并在里面定义一个解读Bean生命周期的方法。

InitializingBean初始化,BeanPostProcessor的后置处理器。

将定义的方法全部实现

创建一个方法,依赖注入完毕后会执行

可以对postProcessBeforelnitialization进行修改,也就是Bean初始化的前置方法,在这里面告诉我们已经

后置方法也可以这样进行操作

销毁方法,需要使用@PreDestroy

Bean的初始化

创建一个类,并在里面添加三个属性和一个方法

在定义一个start方法进行初始化和close方法

定义一个配置类来进行使用使用,这个配置类需要实现一个接口BeanDefinitionRegistryPostProcessor,它会实现一个注入器方法

在上面定义属性

创建一个生成新Bean元数定义的方法

最后返回这个definition

definition.setScope(GenericBeanDefinition.SCOPE_SINGLETON);指定Bean的作用域

definition.setAbstract(false)是否抽象

definition.setLazyInit(false)是否延迟

definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_NO);设置自动装备的模式,这里是自己完成装备

lefinition.setDependencyCheck(GenericBeanDefinitiOn.DEPENDENCY_CHECK_NONE)设置依赖检查这里是不做检查因为自己完成装配

definition.setDependsOn()依赖Bean的名称

definition.setAutowireCandidate(false)是否连接到其他Bean

definition.setPrimary(false)是否是主要的候选Bean

definition.setNonPublicAccessAllowed(true)是否允许访问非公共方法和构造方法

definition.setLenientConstructorResolution(false)是否在宽松模式下去解析构造方法

definition.setInitMethodName()启动实例化

definition.setDestroyMethodName()Bean的销毁方法

definition.setSynthetic(true)这个Bean是否是合成的

definition.setRole()设置角色

定义一些额外的方法方便后面的使用

创建一个可以注册到IOC中的Bean方法

之后对postProcessBeanDefinitionRegistry方法进行修改


http://www.kler.cn/a/512747.html

相关文章:

  • 数据结构之堆排序
  • 线程池 | java中的多线程
  • vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权
  • Node.js的解释
  • 【计算机视觉】人脸识别
  • 广播网络实验
  • 一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用
  • AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发
  • Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
  • xiaozhi-esp32 - 基于 ESP32 的 AI 聊天机器人
  • 2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望
  • 深入探索 Vue.js 的局部状态管理技术:基于 Pinia 的组合式 API 实现
  • Java程序运行剖析(JVM+JDK+JRE)(总结+超详解)
  • Python中字符串的基本操作
  • C#/.NET/.NET Core技术前沿周刊 | 第 22 期(2025年1.13-1.19)
  • Spring Boot拦截器:掌握Web请求的“守门员”
  • C++: Dtrees:load(constg String filepath, const String nodeName)中nodeName参数含义
  • “深入浅出”系列之C++:(15)simple_enum库
  • apache-zeppelin 命令执行 (CNVD-2019-33156)
  • Spring的循环依赖
  • ERROR:This version of pnpm requires at least Node.js vXXX 的解决方案
  • QT:子控件VLC播放视频时,父控件无法截取鼠标事件
  • 2025.1.16——五、LoveSQL1 sqlmap文件类|万能密码
  • Text2Sql:开启自然语言与数据库交互新时代(30/30)
  • Docker私有仓库管理工具Registry
  • 基于PHP的校园兼职系统的设计与开发