Spring中IOC框架结构是什么?都包含那些模块,各个模块具体是什么样的

news2024/9/23 7:29:52

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用!

7.自定义Spring框架

7.1 Spring框架使用回顾

7.1.1 数据访问层

定义UserDaoMapper接口及实现类

public interface UserMapper {  
    public void add();  
}
public class UserMapperImpl implements UserMapper {  
    public void add(){  
        System.out.println("userMapperImpl....");  
    }  
}

7.1.2 业务逻辑层

定义UserService接口及实现类

public interface UserService {  
    public void add();  
}
public class UserServiceImpl implements UserService {  
    //声明userMapper对象  
    private UserMapper userMapper;  
  
    public void setUserMapper(UserMapper userMapper) {  
        this.userMapper = userMapper;  
    }  
    @Override  
    public void add() {  
        System.out.println("UserService.............................");  
        userMapper.add();  
    }  
}

7.1.3 控制层

定义Controller类简单实现

	public static void main(String[] args) {  
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");  
    UserService userService = applicationContext.getBean("userService", UserService.class);  
    userService.add();  
}

7.1.4 applicationContext.xml文件

<?xml version="1.0" encoding="UTF-8" ?>  
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns="http://www.springframework.org/schema/beans"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
                           https://www.springframework.org/schema/beans/spring-beans.xsd">  
    <bean id="userMapper" class="org.example.mapper.impl.UserMapperImpl"></bean>  
    <bean id="userService" class="org.example.service.impl.UserServiceImpl">  
        <property name="userMapper" ref="userMapper"></property>  
    </bean></beans>

7.1.5 运行

结果如图
![[Pasted image 20230208172301.png]]

7.2 Spring核心功能结构

Spring约有20个模块,由1300多不同文件构成,主要分为:核心容器、AOP和设备支持、数据访问与集成、Web组件、通信报文和集成测试,结构图如下:
![[Pasted image 20230208191009.png]]

7.2.1 核心容器

核心容器由beans、core、context和expression(Spring Expression Language,SPEL)组成。

7.2.1.1 核心模块

spring-beans和spring-core模块。
包含:

  • 控制反转(Inversion of Control),实际应用程序代码进行分离
  • 依赖注入(Dependency Injection)
    BeanFactory使用控制反转对应用程序的配置和依赖性规范Bean,只有当Bean被使用时,BeanFactory才会对该Bean进行实例化与依赖关系装配

7.2.1.2 spring-context模块

  • 架构于核心模块纸上,扩展了BeanFactory,添加了Bean生命周期控制、框架事件体系及资源加载透明化等功能,还提供了企业级支持,如邮件访问,远程访问及任务调度等。核心接口为ApplicationContext,超类是BeanFactory。
  • spring-context-support模块是对spring IOC容器及IOC子容器的扩展支持
  • spring-context-index模块是Spring的类管理组件和Classpath扫描组件

7.2.1.3 spring-expression模块

  • 统一表达式语言(EL )的扩展模块,可以查询、管理运行中的对象,也可以方便调用对象方法,操作数组、集合等。
  • 语法类似于传统EL,但提供了额外的功能,如函数调用和简单字符串模板函数
  • 特性是基于Spring产品的需求设计,可方便与Spring IOC进行交互。

7.2.2 bean描述

  • Spring面向bean编程(BOP,Bean Oriented Programming),Bean在Spring中处于核心地位。
  • Spring IOC容器通过配置文件或者注解的方法来管理bean对象之间的依赖关系
  • bean用于对类进行封装,如:
<bean id = "userService"  class = "com.demo.service.impl.userServiceImpl">
<property name = "useMapper" ref = "userMapper"/>
</bean>
<bean id = "userMapper" class = "com.demo.mapper.impl.userMapperImpl"/>
  • Bean 重要性:
    • spring将bean对象交由一个IOC容器管理
    • bean对象之间依赖关系在配置文件中体现,由spring完成

7.3 Spring IOC接口分析

7.3.1 BeanFactory解析

Bean创建是工厂模式,一系列工厂即IOC容器,Spring中很多IOC容器实现供用户选择,一些接口相互关系如图:
![[Pasted image 20230208195236.png]]

  • 接口阐述:BeanFactory作为最顶层接口,定义了IOC容器的基本功能规范,BeanFactory有三个重要子接口:ListableBeanfactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。但最终默认实现类是DefaultListableBeanFactory,实现了所有接口。
  • 定义多层次接口原因:主要为了区分在Spring内部操作过程中对象传递和转化,对对象数据访问进行限制,例如:
    • ListableBeanFactory接口表示这些Bean可列表化
    • HierarchicalBeanFactory表示这些Bean是有继承关系
    • AutowireCapableBeanFactory接口定义Bean的自动装配规则
      上述三个接口共同定义了Bean集合、Bean 之间关系及Bean行为,最基本IOC容器接口是BeanFactory。
  • BeanFactory里只对IOC容器基本行为进行定义,不关心Bean是如何定义及加载
  • BeanFactory有一重要子接口:ApplicationContext,该接口主要来规范容器中的bean对象是非延迟加载,即在创建容器对象的时候就对象bean进行初始化并存储到一个容器中。
  • 若要知道工厂如何产生对象,则需要看具体的IOC容器实现,如:
    • ClasspathXmlApplicationContext:根据类路径加载xml配置文件,并创建IOC容器对象
    • FileSystemXmlApplicationContext:根据系统路径加载xml配置文件,并创建IOC容器对象
    • AnnotationConfigApplicationContext:加载注解类配置,并创建IOC容器

7.3.2 BeanDefination解析

Spring IOC容器管理定义的各种bean对象及相互关系,而Bean对象在Spring实现是以BeanDefinition来描述,如:

<bean id = "userMapper" class = "com.demo.mapper.impl.userMapperImpl"></bean>
%%bean标签还有很多属性,如scope、init-method、destory-method等%%

继承关系如图
![[Pasted image 20230208204529.png]]

7.3.3 BeanDefinationReader解析

Bean解析主要是对Spring配置文件解析,其过程主要通过BeanDefinitionReader来完成,Spring中BeanDefinitionReader类结构图如下图
![[Pasted image 20230208205453.png]]
BeanDefinintionReader接口源代码如下:

public interface BeanDefinitionReader { 
	//获取BeanDefinitionRegistry注册器对象
    BeanDefinitionRegistry getRegistry();  
  
    @Nullable  
    ResourceLoader getResourceLoader();  
  
    @Nullable  
    ClassLoader getBeanClassLoader();  
  
    BeanNameGenerator getBeanNameGenerator();  
	  //从指定资源里加载bean定义
    int loadBeanDefinitions(Resource var1) throws BeanDefinitionStoreException;  
  
    int loadBeanDefinitions(Resource... var1) throws BeanDefinitionStoreException;  
  
    int loadBeanDefinitions(String var1) throws BeanDefinitionStoreException;  
  
    int loadBeanDefinitions(String... var1) throws BeanDefinitionStoreException;  
}

7.3.4 BeanDefinationRegistry解析

上文解析的bean对象存储到BeanDefinition的注册中心,而该注册中心顶层接口就是BeanDefinitionRegistry,源码如下:

public interface BeanDefinitionRegistry extends AliasRegistry {  
    //往注册表中注册bean
    void registerBeanDefinition(String var1, BeanDefinition var2) throws BeanDefinitionStoreException;  
  //从注册表删掉指定名称bean
    void removeBeanDefinition(String var1) throws NoSuchBeanDefinitionException;  
  //获取指定名称bean
    BeanDefinition getBeanDefinition(String var1) throws NoSuchBeanDefinitionException;  
  //判断是否包含指定名称bean
    boolean containsBeanDefinition(String var1);  
  //获取所有bean
    String[] getBeanDefinitionNames();  
  
    int getBeanDefinitionCount();  
  
    boolean isBeanNameInUse(String var1);  
}

继承结构如图
![[Pasted image 20230208211345.png]]
类图可看出BeanDefinitionRegistry接口子实现类主要有:

  • DefaultListableBeanFactory,该类定义如下代码来注册bean
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap(256);
  • SimpleBeanDefinitionRegistry,该类定义如下代码来进行注册bean
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap(64);

7.3.5 ClassPathXmlApplicationContext解析

ClassPathXmlApplicationContext对Bean配置资源载入是从refresh()方法开始,此方法是一个模板方法,规定IOC容器的启动流程,有些逻辑要交给其子类实现。对Bean配置资源进行载入。
ClassPathXMLApplicationContext通过调用其父类AbstractApplicationContext的refresh方法启动整个IOC容器对Bean定义的载入过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s默认StorageClass,解决pvc一直处于“Pending”

文章目录报错详情排查思路查看 pvc 详细属性查看 nfs-provisioner pod日志解决方案报错详情 排查思路 查看 pvc 详细属性 [rootk8s-master01 /opt/zadig]# kubectl describe pvc pvc-sc Name: pvc-sc Namespace: default StorageClass: nfs-yinwu Status: …

代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 看完题后的思路 典型分割问题略lue略剪枝条件 sub&#xff1a; 1&#xff09; 不是一位首字母为0 2&#xff09;大于三位 3&#xff09;介于0-255之间 4) 当已分割得到3个时&#xff0c;第四个直接从startIndex到末尾就行 代码 ArrayList<String> slist…

剑指Offer 第28天 复杂链表的赋值

复杂链表的复制_牛客题霸_牛客网 描述 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请对此链表进行深拷贝&#xff0c;并返回拷贝后的头…

(免费分享)基于 SpringBoot 的高校宿舍管理系统带论文

项目描述 系统代码质量高&#xff0c;功能强大&#xff0c;带论文。 系统的功能主要有&#xff1a; &#xff08;1&#xff09;基本信息管理 基本信息分为学生信息和宿舍信息两部分&#xff0c;其功能是负责维护这些信息&#xff0c;对 它们进行增删查改等操作。 &#x…

UART通讯简介

UART全称Universal AsynchronousReceiver/Transmitter&#xff0c;通用异步收发传输器。 一、工作原理 和其它串口一样&#xff0c;数据按照二进制从低位到高位一位一位的传输&#xff0c;能将要传输的数据在串行通信与并行通信之间加以转换&#xff0c;能够灵活地与外部设备进…

网络编程(未完待续)

网络编程 文章目录网络编程前置概念1- 字节序高低地址与高低字节高低地址&#xff1a;高低字节字节序大端小端例子代码判断当前机器是大端还是小端为何要有字节序字节序转换函数需要字节序转换的时机例子一例子二2- IP地址转换函数早期(不用管)举例现在与字节序转换函数相比:**…

Open Street Map—2023年水系数据

之前文章我们给大家分享了从OSM地图下载的道路数据&#xff08;可查看之前推送的文章&#xff09;&#xff0c; 这一篇我们给大家带来的是从OSM地图下载的水系数据&#xff01;我们下载了全国范围&#xff08;包括港澳台&#xff09;的水系数据&#xff0c;下载时间为2023年2月…

硬件篇-配置

写在最前 这已经可以成为垃圾佬配置了。。。 机箱->239元 机箱选用的itx迷你机箱&#xff0c;为了后期nas方便拓展选了4盘位&#xff0c;该机箱还是比较符合我的预期的&#xff0c;颇有种麻雀虽小五脏俱全的感觉&#xff0c;机箱可以安装matx主板和itx主板&#xff0c;还是…

聊聊MySQL中的事务,MVCC

事务我们知道&#xff0c;事务具有四大特性——ACIDA atomicity 指的是原子性C consistency 指的是一致性I isolation 指的是隔离性D durability 指的是持久性四大特性的实现原理原子性原子性在这指的是整个事务操作&#xff0c;要么同时成功要么同时失败。让它变成一个整体。同…

若依管理系统搭建运行环境--基于SpringBootVue前端分离版

若依框架搭建运行环境-如何下载一、技术支持&#xff1a;二、Redis安装及运行三 目录结构四、导入数据库五 修改配置文件1.application-druid.yml文件 &#xff08;路径&#xff1b;RuoYi-Vue-master\ruoyi-admin\src\main\resources\application-druid.yml&#xff09;2.appli…

越界访问数组

越界访问是指访问&#xff08;操作修改&#xff09;了不属于自己的空间 我们以如下代码为例&#xff1a;此代码在vs中进行 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello\n");}r…

阿里云平台与MQTTX软件通信

阿里云平台与MQTTX软件通信 上一篇文章介绍了如何创建阿里云物联网平台以及MQTT.fx软件通信配置&#xff1a;https://blog.csdn.net/weixin_46251230/article/details/128993864 但MQTT.fx软件需要许可证才能使用&#xff0c;所以使用另一款软件MQTTX来代替 MQTTX软件下载 官…

【C++】类与对象(二)

前言 在前一章时我们已经介绍了类与对象的基本知识&#xff0c;包括类的概念与定义&#xff0c;以及类的访问限定符&#xff0c;类的实例化&#xff0c;类的大小的计算&#xff0c;以及C语言必须传递的this指针&#xff08;C中不需要我们传递&#xff0c;编译器自动帮我们实现&…

CSP-《I‘m stuck!》-感悟

题目 做题过程 注&#xff1a;黄色高亮表示需要注意的地方&#xff0c;蓝色粗体表示代码思路 好久没有写过代码了&#xff0c;今天做这道编程题&#xff0c;简直是灾难现场。 上午编程完后发现样例没有通过&#xff0c;检查发现算法思路出现了问题&#xff1a;我计数了S不能到…

【每日一题Day116】LC1138字母板上的路径 | 模拟

字母板上的路径【LC1138】 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]&…

BFS的使用(acwing提高课之搜索)

bfsBFS1. 多源bfs2.最小步数模型1.魔板2.八数码问题3.双端队列广搜4.双向广搜5.A*算法BFS bfs是搜索算法里面最基础的算法&#xff0c;对于队首的点&#xff0c;每次搜索其周围所有的点&#xff0c;然后将其入队。队列里面的点具有两个特性&#xff1a; &#xff08;1&#xf…

OpenWrt路由器设置IPv6域名动态解析,同时实现IPv4设备访问IPv6节点

文章目录0、前言1、准备工作2、详细步骤2.1、OpenWrt路由器软件包安装2.2、防火墙放行入站数据&#xff08;修改为“接受”并保存应用&#xff09;2.3、路由器做好ipv6设置&#xff08;略&#xff09;2.4、域名解析服务商对域名的解析设置2.5、路由器中动态域名插件的设置3、关…

23.2.12 LC每日一题 —— 极尽地高效利用题目中所提供的有效信息

文章目录23.2.12 LC每日一题 —— 极尽地高效利用题目中所提供的有效信息题目链接&#xff1a;题目大意&#xff1a;注意&#xff1a;示例&#xff1a;参考代码&#xff08;py3&#xff09;&#xff1a;总结23.2.12 LC每日一题 —— 极尽地高效利用题目中所提供的有效信息 题目…

Redis内存存储效率问题

目录 内存碎片是如何形成的&#xff1f; 如何判断是否有内存碎片&#xff1f; 如何清理内存碎片&#xff1f; INFO命令 实习期间&#xff0c;了解到&#xff0c;企业级开发中多个项目使用Redis&#xff0c;运行Redis实例的有可能是同一台物理机器&#xff0c;那么&#xff…

【水文模型】评价指标

水文模型模拟效果评价指标1 皮尔逊相关系数&#xff08;Pearson’s correlation coefficient, PCC&#xff09;2 百分比偏差&#xff08;Percent bias, Pbias&#xff09;3 纳什效率系数&#xff08;the Nash-Sutcliffe efficiency coefficient, NSE&#xff09;4 克林-古普塔效…