Spring,Spring Ioc,Bean详解

news/2025/1/19 15:25:31/文章来源:https://www.cnblogs.com/ihave2carryon/p/18679601

Spring框架

Spring框架是Java应用最广的框架,其的成功来自于理念,并非是技术,其中几个理念非常重要,例如IoC(控制反转),AOP(面向切面编程)

Spring的优势

  • 低耦合/低侵入(解耦)

    • Spring通过IoC(控制反转)和DI(依赖注入)来实现低耦合高内聚
  • 声明式事务管理

    • Spring基于AOP的方式,使其能够在方法执行前后字段处理事务的开启,提交和回滚

    优势:

    • 使得开发者只需要关注业务逻辑,事务的工作提交给Spring自动处理
    • 减少代码冗余
  • 方便集成其他框架

    • Spring的核心优点是其极强的集成能力,通过SpringORM可以轻易的集成MyBatis等框架
  • 降低 Java 开发难度

    • Spring 提供了自动配置功能,尤其是 Spring Boot.开发者无需关注繁琐的配置,Spring 会根据项目的依赖自动完成配置
  • Spring 框架中包括了 J2EE 三层的每一层的解决方案(一站式)

    • Spring 提供了企业级应用开发的完整解决方案,包括 表示层(Web 层)、业务层(Service 层)和 数据层(DAO 层)的支持。
    • 表示层(Web 层):Spring MVC 提供了强大的 Web 功能,支持传统的 Web 应用和 RESTful API。
    • 业务层(Service 层):Spring 的核心就是提供面向业务逻辑的功能,包括事务管理、AOP、数据访问等。
    • 数据层(DAO 层):Spring 提供了对数据库的支持,简化了 JDBC 操作,并且通过 ORM 提供了对 Hibernate、JPA 等框架的集成。

Sprinp主要框架结构

  • Spring重要框架结构由核心容器(Core Container).数据访问/集成(Data Access/Integration),Web,面向切面编程(AOP和Aspects),设备(Instrumentation),消息(Messaging)和测试(Test)组成,其结构图如下:

## **Core Container 核心容器**> Core Container又是由,Spring Core,Spring Beans, Spring Context,SpEL,组成
> 
- Spring Core- Spring Core是IoC和DI基本实现- 核心功能包括`BeanFactory,ApplicationContext`,提供Spring IoC对容器的访问
- Spring Beans- 负责管理对象(Bean)的生命周期,配置和依赖注入.是IoC的容器的基础,可使用XML或注解方式定义Bean
- Spring Context- 基于ApplicationContext接口,Spring容器的高级抽象## Data Access/Intergration 数据访问于集成模块- Spring JDBC- 简化了传统的JDBC操作,提供`JDBCTemplate`类来处理数据库连接,SQL执行和结果集处理,减少冗余
- Spring ORM- 集成了ORM(对象关系映射,为对象和数据库之间提供映射支持,简化数据访问层的开发
- Spring Data Access- 提供对数据库访问的简化支持,包括Mybatis,Hibernate的持久化框架## Web- Spring Web MVC- 基于MVC设计模式的Web框架,是Spring架构中最常用的模块之一
- Spring Web- 为Web应用提供基本的支持,提供Servlet API和文件上传等功能

Maven中配置Spring

  • 在pom.xml文件中添加两个依赖即可,注意Spring版本
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.14</version></dependency><!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>

Spring IoC理念

Spring IoC,反转控制,更好的理解是,IoC不是说明技术而是一种设计理念,把原本程序手动创建对象的控制权,交给Spring框架来管理

IoC的形象理解

IoC虽然是一个抽象的概念,我们可以举个例子更好的理解

以购物的视角解析IoC

假设你想买个橙汁喝,有两种方法可以实现

  • 主动创建(没有IoC)
    • 想喝一杯新鲜的橙汁,按住传统的方法,需要去买果汁机,橙子,榨汁,加水,才能喝到
    • 主动创建:这些行为都是,我主动发起的,自己去的所有的步骤,我直接掌管所有的步骤和资源.
  • 饮品店方式(IoC)
    • 但还有一种方式是,点外卖或去饮品店购买.
    • 控制反转:在这种情况下,并不用去采购果汁机,橙汁等等.饮品店负责完成所有的工作,而我只是负责提出需求等待结果即可

这可以见的,在Spring框架中,IoC的核心思想就是:我不在主动执行任务和管理资源,而是提交给第三方,让它们处理我提出的需求,这就是IoC.我不再控制对象的创建和管理,而是由外部容器来管理和提供我所需要的”服务”

类比到SpringIoC

  • 在刚刚的例子中,我们可以类比到Spring框架中,具体来说:
    • 我(客户端):负责提出需求,比如需要一个橙汁
    • 饮品店(Spring 容器):接收需求,并负责制作并交付结果,即进行Bean的创建和注入
    • 结果:我只需接收并使用”橙汁”(bean),不需要知道如何制作它(创建和管理)

IDEA如何使用IoC的

通过Spring Config xml文件(能看懂就行)

  • 在resource文件下建立Spring Config文件名为spring.xml

  • 使用bean标签来配置Spring IoC中的对象,其基本语法如下

  • id:为指定该Bean的名称.这个名称没有在Spring容器中引用这个Bean
  • class:指定该Bean的单位完整路径
  • 通过注释配置的方法会在<常用的注释>展开讲解

Bean

Bean代表了Spring IoC容器管理的对象,Spring容器负责创建,配置和管理这些Bean

什么是Bean

  • Bean是Spring IoC容器管理的一个对象,简单来说任何一个由Spring创建并由容器管理的Java对象,都是一个Bean
  • 对于Spring 容器来说,其主要负责:
    • 创建Bean实例
    • 配置Bean属性
    • 管理Bean生命周期
    • 处理Bean的依赖注入

Bean的配置

在Spring中,一共有一下几个方式来配置Bean:

  • XML文件配置(较为传统,能看懂就行)
  • 注解配置(Java现代方式)
  • Java配置类(Spring 通过@Configuration注解配置)

XML配置方式

  • 在Spring的XML配置文件中,使用标签配置bean,上面已经演示过
  • 通过注释配置的方法会在<常用的注释>展开讲解

依赖注入(DI)

DI(Dependency Injection)是Spring IoC容器的核心功能之一,通过DI,spring实现了控制反转IoC,依赖注入有两种常用方法:构造函数注入和Setter方法注入

构造函数注入

构造函数注入是通过类的构造方法将依赖传递给Bean

配置方法

在Spring配置文件中,通过constructor-arg标签来指定构造函数参数

  • 标签属性

    • name:指定构造函数的名称,用于匹配构造函数参数
    • value:为参数提供值
    • ref:指定引用类型的Bean(其他Bean),用于注入对象
    • type:指定参数的类型(通常不使用,spring会自动推断)
    • index:指定参数在构造函数中的索引位置
  • e.g1注入基本数据类型

    <bean id="student" class="com.mashang.entity.Student"><!--构造函数参数注入--><constructor-arg name="name" value="张三"></constructor-arg><constructor-arg name="age" value="20"></constructor-arg></bean>
    

    该配置,Spring会将”张三”18 作为参数传递给Student类的构造函数.其会调用带有name和age的构造函数

       public Student(String name, Integer age) {this.name = name;this.age = age;}
    

    返回的toString()如下:

  • e.g2注入引用类型

     <bean id="classInfo" class="com.mashang.entity.ClassInfo"><constructor-arg name="name" value="班级1"></constructor-arg><constructor-arg name="classId" value="001"></constructor-arg></bean><bean id="student" class="com.mashang.entity.Student"><!--构造函数参数注入--><constructor-arg name="name" value="张三"></constructor-arg><constructor-arg name="age" value="20"></constructor-arg><!--注入引用类型--><constructor-arg name="classInfo" ref="classInfo"></constructor-arg>
    

    该配置是在Student类中有一个ClassInfo类,提供constructor-arg标签,Spring会将ClassInfo类的Bean注入到Student类的构造函数中

        private ClassInfo classInfo;public Student(String name, Integer age, ClassInfo classInfo) {this.name = name;this.age = age;this.classInfo = classInfo;}

    返回的toString()如下:

Setter注入是提供对象的set方法将依赖传递给Bean.容器实例化后,会通过反射的机制调用Bean的set方法来注入依赖想

配置方法

在Spring配置文件中,通过property标签来为Bean的属性设置值.属性的名称对于Java类中的set方法

  • 标签属性
    • name:要注入的属性名
    • value:为基本数据类型和String类型的属性赋值
    • ref:为引用类型的属性赋值,指定其他Bean
      • e.g1注入基本数据类型

            <bean id="student" class="com.mashang.entity.Student"><property name="name" value="张三"></property><property name="age" value="20"></property></bean>
        

        上述配置中,student必须带有setNamesetAge的方法来接收传入的值

      • e.g2传入引用类型

            <bean id="classInfo" class="com.mashang.entity.ClassInfo"><property name="name" value="班级1"></property><property name="classId" value="001"></property></bean><bean id="student" class="com.mashang.entity.Student"><property name="name" value="张三"></property><property name="age" value="20"></property><property name="classInfo" ref="classInfo"></property></bean>
        

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程桌面键盘记录器

针对远程桌面协议 (RDP) 相关进程的击键记录器,它利用键盘输入挂钩,允许其记录某些上下文中的击键(例如在 mstsc.exe 和 CredentialUIBroker.exe 中) 使用vs直接编译就可以了运行TakeMyRDP.exe打开mstsc,输入ip地址,输入账号密码密码直接显示出来,这个exe不需要高权限运行…

【nginx】Nginx重定向方法

Nginx重定向配置是一个功能强大且灵活的工具,可以根据具体需求实现各种重定向规则。 以下是对Nginx请求重定向配置方法的详细解析:1、基本概念 请求重定向是指当客户端向服务器发送一个请求时,服务器根据一定的规则将客户端的请求引导到另外一个URL的过程。在Nginx中,通过r…

利用mybatis拦截器记录sql,辅助我们建立索引(二)

背景 上一篇中讲述了mybatis的mapper初始化过程和执行过程,这篇再讲讲具体的拦截器的使用,以实现记录sql到持久化存储,通过分析这些sql,我们就能更方便地建立索引。 利用mybatis拦截器记录sql,辅助我们建立索引(一) 我本地项目的大概版本: spring boot版本2.7,mybatis版…

JMeter通过JSON提取器获取任意一行数据中的多个字段

存在如下响应信息: { "result": { "data": [ { "字段1": "DK-01", "字段2": null, "字段3": "210(3mm/40kg)",}, {&q…

Windows7 64位系统ODBC数据源配置方法

Windows7 64位系统ODBC数据源配置方法 注意以下所说的步骤是在安装好SQL2000或者端内有绿色SQL的情况下,已经在查询分析器内一键建立并还原好数据库之后才进行的,请不要跳步骤进行,否则会出错。一键端可直接操作。(win7系统架设传奇3前请将UAC账户权限调至最低) Windows7…

【clang-format】Windows11下代码格式化工具clang-format.exe下载

官方项目地址:https://github.com/llvm/llvm-project/releases下滑找到win64.exe下载慢的可以去这个github代下网站:https://d.serctl.com/下载好后不用安装,直接解压这个exe文件 把目录bin里面的clang-format.exe文件复制出来,放到一个新文件夹里,比如我放到了D盘根目录下…

聊一聊 操作系统蓝屏 c0000102 的故障分析

一:背景 1. 讲故事 今年以来不知道为啥总有些朋友加我微信,让我帮忙分析下操作系统蓝屏问题,我也觉得挺好奇的,就问了其中一位朋友,说是B站来的,我就在拼命回忆,为啥会找我分析蓝屏?突然想到了去年好像录了一集关于 CrowdStrike 的热点事件。。。我本来是做.NET程序的故…

4-01-(C++类 this指针)

结构体传参,传递的是副本 结构体里面写函数,结构体的大小不变 函数的地址不在结构体里面。 类里面的函数都要传一个this指针,即 lea ecx,[s] 普通的函数结构体传参 this指针的特点 1、你用或者不用,它就在那里 2、参数个数确定的时候,用ecx来传递 3、参数个数不确…

协议通道版iMessage蓝号检测,iMessages数据筛选,无痕检测是否开启iMessage服务

一、实现iMessage数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2…

【开源】一款功能全面的商用级溯源防伪系统,适用于各种溯源场景

项目介绍 HiPi是一款开源、功能全面的商用级溯源防伪系统,一物一码系统,适用于各种溯源场景的大、中、小、微规模企业。系统能够追踪记录产品的生命周期各个环节,并将产品信息保存在系统中,实现品牌保护、产品营销、防止假冒伪劣产品、防窜货、产品追踪溯源等功能。 应用场…

行为分析智能监测摄像机

行为分析智能监测摄像机具有高效的行为识别和分类能力。通过摄像头捕捉到目标区域内的行为活动,并通过预先训练好的机器学习算法进行识别和分类,可以准确地分析出不同的行为特征,例如跌倒、打架等,并及时发出警报或提醒相关管理人员。这种高效的行为识别能力可以帮助监控中…