【Spring】一文带你搞懂Spring IOC容器

news2024/12/23 10:56:27

前言

在这里插入图片描述

本文为 【Spring】Spring IOC容器 相关知识,首先为大家介绍Spring IOC相关的名词概念,对Spring IOC进行概述,然后具体为大家介绍配置元数据容器实例化与使用等Spring IOC相关详尽内容~

📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)


目录

【Spring】Spring IOC容器

  • 前言
  • 目录
  • 1️⃣IOC概述
  • 2️⃣配置元数据
  • 3️⃣容器实例化与使用
  • 后记

在这里插入图片描述
在学习IOC 容器之前首先需要了解一些常见的名词:

  • 容器: 可以管理对象的生命周期、对象与对象之间的依赖关系。
  • POJO: ​ POJO(Plain Old Java Object)这种叫法是Martin Fowler、Rebecca Parsons和Josh MacKenzie在2000年的一次演讲的时候提出来的。按照Martin Fowler的解释是“Plain
    Old Java
    Object”,从字面上翻译为“纯洁老式的Java对象”,但大家都使用“简单java对象”来称呼它。POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。不允许有业务方法,也不能携带connection之类的方法,实际就是普通JavaBeans。
    JavaBean: ​ JavaBean是一种JAVA语言写成的可重用组件。JavaBean符合一定规范编写的Java类,不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用。它的方法命名,构造及行为必须符合特定的约定:(1)所有属性为private;(2)这个类必须有一个公共的缺省构造函数。即是提供无参数的构造器;(3)这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范;(4)这个类应是可序列化的。实现serializable接口;(5)因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。
  • POJO与Java Bean的区别:
POJOJAVABean
除了Java语言强加的限制外,它没有其他特殊限制。这是一个特殊的POJO,它有一些限制。
它没有对成员提供太多控制。它提供对成员的完全控制。
它可以实现Serializable接口。它应该实现可序列化的接口。
可以通过字段名称访问字段。字段只能由getter和setter访问。
字段可以具有任何可见性。字段只有私人可见性。
可能/可能没有no-arg构造函数。它必须具有无参数构造函数。
当您不想限制成员并让用户完全访问您的实体时使用它。当您要向用户提供您的实体,但仅向实体的一部分提供服务时,将使用它。

POJO类和Bean均用于定义Java对象,以提高其可读性和可重用性。POJO没有其他限制,而bean是具有某些限制的特殊POJO。

  • SpringBean: ​ SpringBean是受Spring管理的对象,所有能受Spring容器管理的对象都可以成为SpringBean。Spring中的bean,是通过配置文件、javaconfig等的设置,由Spring自动实例化,用完后自动销毁的对象。
  • SpringBean和JavaBean的区别: (1)用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean;(2)写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法;但spring中的bean只需为接受设值注入的属性提供setter方法;(3)生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期;spring中的bean有spring管理其生命周期行为。
  • Entity Bean: Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity
    Bean对象相当于新建一条记录,删除一个 Entity Bean会同时从数据库中删除对应记录,修改一个Entity
    Bean时,容器会自动将Entity Bean的状态和数据库同步。

1️⃣IOC概述

🍀编写spring代码,我们需要创建一个maven工程,并加入以下依赖:

<!-- Spring的核心组件 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.18.RELEASE</version>
</dependency>
<!-- SpringIoC(依赖注入)的基础实现 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.2.18.RELEASE</version>
</dependency>
<!--Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.18.RELEASE</version>
</dependency>

🍀本章将介绍Spring框架实现控制反转(IoC)的原理, IoC也称为依赖注入(DI)

org.springframework.beansorg.springframework.context包是Spring框架的IoC容器的基础。
BeanFactory接口提供了一种高级的配置机制,能够管理任何类型的对象。
ApplicationContext是BeanFactory的子接口。 它对BeanFactory进行了补充:

  • (1)更容易与Spring的AOP特性集成 。
  • (2)消息资源处理(用于国际化) ,解析消息的能力,支持国际化。继承自MessageSource接口。
  • (3)事件发布,向注册侦听器发布事件的能力。继承自ApplicationEventPublisher接口。
  • (4)应用程序层特定的上下文,如WebApplicationContext用于web应用程序。
  • (5)以通用方式加载文件资源的能力,继承自org.springframe .core.io.ResourceLoader接口。

🍀beanFactory和ApplicationContext接口展示如下:

public interface BeanFactory {}
public interface ApplicationContext 
extends EnvironmentCapableListableBeanFactoryHierarchicalBeanFactoryMessageSourceApplicationEventPublisherResourcePatternResolver {}

​简而言之,BeanFactory提供了容器的基本功能,而ApplicationContext添加了更多特定于企业的功能。 ApplicationContext是BeanFactory的一个完整超集,仅在本章描述Spring的IoC容器时使用。

​在Spring中,由Spring IoC容器【管理】的构成【应用程序主干的对象】称为【bean】。 bean是由Spring IoC容器实例化、组装和管理的对象。 否则,bean只是应用程序中的众多对象之一。 bean及其之间的依赖关系反映在容器使用的【配置元数据】中。

​【applicationcontext】接口表示Spring IoC容器,并负责实例化、配置和组装bean。 容器通过读取配置元数据获得关于要实例化、配置和组装哪些对象的指令。 配置元数据以XML、Java注解或Java代码表示。 它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。

​ Spring提供了ApplicationContext接口的几个实现。

​在独立应用程序中,创建ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例是很常见的。 虽然XML一直是定义配置元数据的传统格式,但您可以通过提供少量的XML配置以声明方式支持这些额外的元数据格式,指示容器使用Java注解或代码作为元数据格式。

2️⃣配置元数据

构建【Spring IoC容器】可以通过构建配置元数据的方式。 这个【配置元数据】说的是:作为应用程序开发人员,您要告诉Spring容器如何去【实例化、配置和组装】应用程序中的对象。 【元数据】传统上以简单而直观的XML格式提供,本章的大部分内容都使用这种格式来传达Spring IoC容器的关键概念和特性。

下面的示例展示了基于xml的配置元数据的基本结构:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>
  • ’ id ’ 属性是标识单个beanDifination的字符串。
  • ’ class ’ 属性定义bean的类型,并使用完全限定的类名。

3️⃣容器实例化与使用

🍀实例化一个容器

ApplicationContext 的构造函数可以是【xml文件的位置路径】的字符串,他允许容器从各种外部资源(如本地文件系统、Java的 'CLASSPATH ’ 等)加载配置元数据。

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml""daos.xml");

下面的示例显示了服务层对象(services.xml)的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</beans>

下面的例子展示了数据访问对象(dao.xml )配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

🍀容器的使用

​ 【ApplicationContext】是一个高级工厂的接口,它维护了一个bean的注册列表,保存了容器产生的所有bean对象。 通过使用方法T getBean(String name, Class<T> requiredType) ,您可以检索bean的实例。

​ 【ApplicationContext】允许你读取和访问bean,如下面的示例所示:

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml""daos.xml");

// retrieve configured instance,这里使用bean的标识符活class对象检索bean的事例。
PetStoreService service = context.getBean("petStore"PetStoreService.class);

// use configured instance
List<String> userList = service.getUsernameList();

后记

在这里插入图片描述
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~

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

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

相关文章

【Python毕业设计】Python基于面向对象+tkinter打造学生信息管理系统 | 附源码

前言 halo&#xff0c;包子们上午好 很多学计算机的小伙伴应该都知道&#xff0c;毕业设计是一个头疼的东西 今天的话小编这边给大家准备好了一个Python基于面向对象tkinter打造学生信息管理系统 这不是毕业设计必备项目 说实话操作起来还是有那么一点点的难度的&#xff0c;但…

2023年天津医科大学临床医学院专升本专业课考试报名缴费考试安排

天津医科大学临床医学院2023年高职升本科专业课考试报考须知 一、报名条件&#xff1a; 报考2023年天津医科大学临床医学院高职升本科专业课考试的考生应符合以下条件&#xff1a; 1、符合《2023年天津市高职升本科招生工作规定》中规定的报考资格。 2、我院高职升本科专业课考…

scViewerX ActiveX 多功能文件查看器控件

scViewerX ActiveX 控件 scViewerX是一个功能强大的 ActiveX 控件&#xff0c;允许您查看、打印和转换 PLT、Adobe PDF、Autodesk DWF、CGM、Calcomp、HPGL/2、Gerber、TIF、CALS 和其他几种格式。 ScViewerX 可以将您的文件转换为多种不同的输出文件格式&#xff0c;包括 PDF、…

软件测试题库怎么样 这个刷题小程序很适合临时抱佛脚

考试刷题&#xff0c;面试找工作也要刷题&#xff1f;说到这&#xff0c;可能很多都觉得不可思议&#xff0c;这找工作&#xff0c;还得提前刷题做准备&#xff1f;其实这个现象一个都有的&#xff0c;尤其是对于技术岗来说&#xff0c;由于面试官会着重询问技术相关问题&#…

结合邻域连接法的蚁群优化(NACO)求解TSP问题附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

(附源码)node.js学生钟点工管理系统 毕业设计 290011

学生钟点工管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;学生钟点工管理系统当然也不能排除在外。学生钟点工管理系统是以实际运用为开发背景&#xff0c;运用…

docker(2):docker常用命令

目录帮助命令镜像命令docker imagesdocker searchdocker pulldocker rmi容器命令docker rundocker psdocker rm启动/停止/退出其他常用命令后台启动docker logsdocker topdocker inspectdocker execDocker attachdocker cp命令大全总结所有命令请查看帮助文档&#xff1a;https…

[附源码]Python计算机毕业设计SSM基于售楼系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Span 抽取和元学习能碰撞出怎样的新火花,小样本实体识别来告诉你!

作者&#xff1a;王嘉宁、汪诚愚、谭传奇、邱明辉、黄松芳、黄俊、高明 近日&#xff0c;阿里云机器学习平台PAI与华东师范大学高明教授团队、达摩院机器智能技术NLP团队合作在自然语言处理顶级会议EMNLP2022上发表基于Span和元学习的小样本实体识别算法SpanProto。这是一种面…

界面控件DevExtreme DataGrid——一个多用途的UI组件

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享...

全文链接&#xff1a;http://tecdat.cn/?p9706在这文中&#xff0c;我将介绍非线性回归的基础知识。非线性回归是一种对因变量和一组自变量之间的非线性关系进行建模的方法。最后我们用R语言非线性模型预测个人工资数据&#xff08;查看文末了解数据获取方式&#xff09;是否每…

《人月神话》(The Mythical Man-Month)看清问题的本质:如果我们想解决问题,就必须试图先去理解它...

第一章 焦油坑&#xff08;The Tar Pit&#xff09;史前史中&#xff0c;没有比巨兽在焦油坑中垂死挣扎的场面更令人震撼的了。上帝见证着恐龙、猛犸象、剑齿虎在焦油中挣扎。它们挣扎得越是猛烈&#xff0c;焦油纠缠得越紧&#xff0c;没有任何猛兽足够强壮或具有足够的技巧&a…

Linux简化版线程池

目录 一&#xff0c;线程池设计 二&#xff0c;线程池应用场景 三&#xff0c;线程池准备 1&#xff0c;包装一个锁 2&#xff0c;一个任务类 三&#xff0c;线程池 1&#xff0c;成员介绍 2&#xff0c;设计单例模式 3&#xff0c;创建线程池 4&#xff0c;线程池执…

【吴恩达机器学习笔记】十六、应用实例:图片文字识别

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

【Linux】Zabbix5.0平台的搭建

文章目录项目背景视频展演一、Linux基础配置1、查看当前系统版本2、修改主机名3、修改 IP 地址4、配置防火墙5、关闭 SELINUX6、修改系统时间及时区7、配置 YUM 库方式 1方式 2二、安装apache1、安装 apache2、启动 apache 服务3、设置 httpd 服务开机启动4、查看服务状态5、防…

深度学习——制作自己的VOC图像分割数据集

1、数据集介绍 COCO数据集有80个类别,VOC数据集有20个类别。当这些数据集类别中没有自己需要的时候,就需要自己动手做自己的数据集了。 我自己在做数据集的时候主要使用到了labelme和labelImg两个工具。labelme主要是制作语义分割数据集(ImageSets,JPEGImages,SegmentationC…

kubernetes 1.18 部署 ingress-nginx

文章目录kubernetes 1.18 部署 ingress-nginx1. 下载 yaml 文件2. 安装 ingress-nginx3. 检查安装情况4. 测试验证4.1 查看ingress规则4.2 访问测试5. 其他内容kubernetes 1.18 部署 ingress-nginx 1. 下载 yaml 文件 在 GitHub 下载完成之后可以直接使用&#xff0c;不需要修…

[基因遗传算法]进阶之三:sko.GA的实践TSP

参考资料:《VRP问题分类》 相关文章: 《[基因遗传算法]原理思想和python代码的结合理解之(一) :单变量》 《[基因遗传算法]进阶之二:最优规划问题–多种编码方式多变量》 文章目录一. GA的用法1.1 help(sko.GA)1.2 目标函数的书写A. 单变量的书写B. 多变量的书写C. 变量的范围…

mysql中的B+树、索引跳跃扫描

普通索引 B树的叶子节点上记录的是聚簇索引&#xff08;主键索引&#xff09;的值。 联合索引 叶子节点中记录的是name&#xff0c;age两个字段以及主键id的值。 MySQL一定是遵循最左前缀匹配的&#xff0c;这句话在mysql8以前是正确的&#xff0c;没有任何毛病。但是在M…

(文章复现)7.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度(MATLAB程序)

联系方式&#xff1a;2645521500 复现文章&#xff1a; 计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度——孙惠娟&#xff08;电网技术—2020&#xff09; 摘要&#xff1a; 为了促进多能源互补及能源低碳化&#xff0c;本文提出了计及电转气协同的含碳捕集与垃圾焚…