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

javaWeb从入门到进阶(SpringBoot原理及bean对象)

配置优先级:

SpringBoot中支持三种格式的配置文件:

application.properties-----application.yml------application.yaml

如果三个都配置同一属性端口了,到底哪个配置文件生效?

经过验证:application.properties>application.yml>application.yaml

注息事项: 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置(yml是主流

SpringBoot除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。

将这五种配置方式比较,优先级最高的是命令行参数,其次是java系统属性,之后依次排列。

命令行参数>java系统属性>application.properties>application.yml>application.yaml

Bean对象:

  • Bean= Spring管理的对象

  • 创建方式@Component,@Service,@Bean

  • 核心特性:依赖注入、生命周期管理

  • 默认作用域:单例(一个容器一个实例)

  • 关键价值:解耦、可测试、可维护

常见问题:

Q:Bean和普通对象有什么区别?
A:普通对象自己new,自己管理;Bean由Spring容器管理,支持依赖注入、AOP、事务等。

Q:@Component和@Bean有什么区别?
A:

  • @Component:用在类上,Spring自动扫描创建

  • @Bean:用在方法上,手动定义创建逻辑,通常用于第三方库的类

Q:Bean默认是单例,线程安全吗?
A:不!如果Bean有状态(成员变量),需要考虑线程安全。无状态Bean是线程安全的。

Q:如何解决Bean的循环依赖?
A:

  1. 使用构造器注入时,Spring无法解决循环依赖

  2. 使用Setter/字段注入可以解决

  3. 最好重新设计,避免循环依赖

简单说:Bean让你从"对象装配工"变成"业务架构师"。

  • 你写的是:业务逻辑(做什么)

  • Spring做的是:对象管理、依赖注入、配置、事务、安全、监控等(怎么做)

就像你开车时:

  • 你只管:要去哪里、走哪条路(业务逻辑)

  • 汽车负责:发动机、变速箱、刹车系统(Bean管理)

这就是IOC(控制反转)的核心思想

  • 传统:你控制对象的创建和依赖

  • Spring:容器控制对象的创建和依赖,你只需要使用

所以虽然业务逻辑是你写的,但所有"基础设施"的工作都交给Spring了,让你能更专注于业务本身

实例理解底层原理:

Bean封装的是特定领域的完整能力——不仅仅是数据,而是数据 + 行为 + 状态 + 配置 + 依赖的完整组合。

就像一辆汽车

  • 数据:油箱里的油(状态)

  • 行为:加速、刹车、转向(方法)

  • 配置:发动机型号、轮胎尺寸(配置)

  • 依赖:需要汽油、电力(依赖)

  • 封装:你只需要踩油门,不用管发动机怎么工作

就像电影制作:

  • 导演(你):设计剧情、指导演员(写业务逻辑)

  • 制片公司(Spring):提供场地、设备、资金、发行(提供运行环境)

  • 观众(调用者):看电影(调用业务方法)

导演设计了剧情(你写了业务方法),但电影的拍摄和放映是由制片公司系统化完成的!

所以,业务逻辑是你写的,但调用这个逻辑的系统是Spring提供的。这就是框架的意义所在!

所以,Bean = 高内聚的功能单元,它把相关的数据和行为打包在一起,对外提供清晰的服务接口,内部隐藏实现细节。这就是面向对象和IoC容器的完美结合!

获取bean


默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
根据name获取bean:Object getBean (String name)
根据类型获取bean:(<T> T getBean (Class<T> requiredType)
根据name获取bean(带类型转换):<T> T getBean (String name, Class<T> requiredType)

注意事项
上述所说的[Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言。

bean作用域


Spring支持五种作用域,后三种在web环境才生效:

第三方bean


@Bean
如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component 及衍生注解声明bean的,就需要用到@Bean注解

这是配置在启动类中的,一般不建议,因为我们要保证启动类的纯粹性,这是我们可以创建一个类加上@Configuration配置类。

注意事项
通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

项目中自定义的,使用@Component及其衍生注解
项目中引入第三方的,使用@Bean注解。

SpringBoot原理

起步依赖原理:maven的依赖传递。

自动配置原理:SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

SpringBoot只能扫描启动类所在包及其子包,当我们引入第三方bean时,并不在启动类所在包或子包。这时,我们

方案一:@ComponentScan组件扫描:需要注意的,添加了这个注解,会覆盖原来的包,我们也需要加上原来的包。

使用繁琐,性能低。

方案二:@lmport导入。使用@lmport导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

导入普通类
导入 配置类
导入ImportSelector接口实现类

@EnableXxxx注解,封装@Import注解

@SpringBootApplication


该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:


@SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类。
@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
@EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。

@Conditional


作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到SpringIOC容器中。
位置:方法、类
@Conditional本身是一个父注解,派生出大量的子注解:
@ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或名称),才注册bean到IOC容器@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

字节码文件:JdbcTemplate.class

先决条件:有JdbcTemplate类,说明项目想用JDBC

Bean对象:dataSource() 和 jdbcTemplate()

关系:字节码文件是创建Bean的前提条件

核心逻辑:

所以字节码文件和要添加的Bean对象有关系,但不一定是1:1的对应关系,而是功能模块的对应关系

  • 有某个字节码文件 → 说明用户想要某个功能

  • Spring Boot → 自动配置这个功能需要的所有Bean

  • 创建的Bean可能包括:字节码文件对应的类 + 相关辅助类

  • 你点"鱼"(字节码文件)

  • 厨师不仅给你鱼,还给配菜、调料、餐具(一系列Bean)

  • 鱼是核心,但配菜也是必要的

http://www.jsqmd.com/news/327238/

相关文章:

  • Flink 弹性伸缩(Elastic Scaling)Adaptive Scheduler、Reactive Mode 与外部资源声明
  • Excel CELL函数深度解析:从基础信息提取到条件格式高阶应用
  • 用 PyTorch 实现 LLM-JEPA:不预测 token,预测嵌入
  • 上海计算机学会2026年1月月赛C++丙组T5 打扫
  • 上海计算机学会2026年1月月赛C++丙组T4 分形十字
  • HarmonyOS 上,App、游戏、PC 能共用架构吗?
  • 没有文档模型,HarmonyOS PC 应用会发生什么?
  • Ai元人文构想:认知共生宣言——迈向人机协作新文明
  • 从注册到跑通项目:体验了飞算JavaAI专业版的“真·无限”开发自由
  • 爬虫-今日头条我的收藏-反爬虫分析(六)
  • 0x3f 第48天 面向实习的八股背诵第五天 + 堆一题 背了JUC的题,java.util.Concurrency
  • 深度学习篇---瓶颈结构残差块
  • 基于微信小程序的医疗器械预定系统_053btbe2
  • Go项目 工具栈选型
  • 基于微信小程序的视频点播系统_7ez85000
  • 基于java的短剧推荐系统设计与实现_c0ql52z2_zl028
  • 5G V2X 仿真利器!SUMO+Python 联合仿真项目,一键搞定车联网场景验证
  • BUU-[CISCN 2019 初赛]Love Math
  • Java性能优化你真的玩明白了吗?
  • 毕设/课设稳过神器!12自由度蜘蛛四足机器人Simscape仿真项目,直接复用拿高分
  • 基于中医与现代医学的 “温度决生死” 深度研究:从气血经络到生命维系的核心逻辑
  • 【游戏推荐】街漓芳传 (YinYang Street Separate Ways)免安装中文版
  • 电商运营数据分析的最佳实践
  • 雷达导引头技术发展深度分析报告
  • 【游戏推荐】龙魂 学院奇闻 (Dragon Spirits)免安装中文版
  • docker run 下载不下来的时候
  • 【游戏推荐】最终兵器鼠鼠 (MOCHI-O)免安装中文版
  • 【Elasticsearch】核心概念,倒排索引,数据操纵 - 指南
  • 教程
  • 不得了!探秘湖北天玑AIGEO优化系统的神奇之处