JavaWeb企业级开发---配置优先级、bean管理、SpringBoot原理
记录在听黑马课的时候的笔记以及课堂上练习的代码文章图源于我在听课的时候所截的屏所以有些不清晰请见谅。下面是课程链接可点击自行跳转。【黑马程序员JavaWeb开发教程实现javaweb企业开发全流程涵盖SpringMyBatisSpringMVCSpringBoot等】https://www.bilibili.com/video/BV1m84y1w7Tb/?share_sourcecopy_webvd_sourced521b664e1113402904fa9336bd1d0ac目录配置优先级bean的管理bean的获取bean的作用域第三方beanSpringBoot原理起步依赖自动配置原理源码跟踪分析条件装配组件Conditional注解案例--自定义starterWeb后端开发总结配置优先级命令行参数优先级大于Java系统属性优先级bean的管理bean的获取获取bean实现package com.jianglin; import com.jianglin.controller.DeptController; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; SpringBootTest public class BeanTest { Autowired private ApplicationContext applicationContext; Test public void testGetBean(){ //根据bean的名称获取 DeptController bean1 (DeptController) applicationContext.getBean(deptController); System.out.println(bean1); //根据bean的类型获取 DeptController bean2 (DeptController) applicationContext.getBean(DeptController.class); System.out.println(bean2); //根据bean的名称及类型获取 DeptController bean3 (DeptController) applicationContext.getBean(deptController,DeptController.class); System.out.println(bean3); } }都是同一个bean对象bean的作用域利用注解配置作用域//DeptController.java package com.jianglin.controller; import com.jianglin.pojo.Dept; import com.jianglin.pojo.Result; import com.jianglin.service.DeptService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Scope; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 增加log日志 * **/ Slf4j RequestMapping(/depts) RestController //Lazy //延迟初始化至第一次创建bean对象 Scope(prototype)//使bean对象不再是单例创建 public class DeptController { Autowired private DeptService deptService; //无参构造方法实现便于观察bean对象的初始化 public DeptController(){ System.out.println(DeptController constructor...); } /** * 查询所有部门信息 * */ GetMapping public Result list(){ log.info(查询全部部门数据); ListDept deptList deptService.list(); return Result.success(deptList); } /** * 根据id进行删除部门信息 * */ DeleteMapping(/{id}) public Result delete(PathVariable Integer id){ log.info(根据{}进行删除部门信息,id); deptService.delete(id); return Result.success(); } /** * 新增部门信息 * */ PostMapping public Result add(RequestBody Dept dept){ log.info(新增部门信息); deptService.add(dept); return Result.success(); } /** * 根据ID查询部门数据 * */ GetMapping(/{id}) public Result getById(PathVariable Integer id){ log.info(根据ID查询部门数据); Dept dept deptService.getById(id); return Result.success(dept); } /** * 修改部门数据 * */ PutMapping public Result update(RequestBody Dept dept){ log.info(修改部门数据); deptService.update(dept); return Result.success(); } } //BeanTest.java package com.jianglin; import com.jianglin.controller.DeptController; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; SpringBootTest public class BeanTest { Autowired private ApplicationContext applicationContext; Test public void testGetBean(){ //根据bean的名称获取 DeptController bean1 (DeptController) applicationContext.getBean(deptController); System.out.println(bean1); //根据bean的类型获取 DeptController bean2 (DeptController) applicationContext.getBean(DeptController.class); System.out.println(bean2); //根据bean的名称及类型获取 DeptController bean3 (DeptController) applicationContext.getBean(deptController,DeptController.class); System.out.println(bean3); } Test public void testBean(){ for (int i 0; i 10; i) { DeptController bean (DeptController) applicationContext.getBean(deptController); System.out.println(bean); } } }每次新建bean对象时都会进行初始化。第三方beanbean对象就是交给ioc容器管理之后每一次使用时都不用再去new一个对象了节约了资源用的时候直接加一个依赖注入就可以了。第三方bean配置//CommonConfig.java package com.jianglin.config; import com.jianglin.service.impl.DeptServiceImpl; import org.dom4j.io.SAXReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class CommonConfig { //声明第三方bean Bean //将当前方法的返回值对象交给IOC容器管理成为IOC容器bean //通过Bean注解的name/value属性指定bean名称如果未指定默认是方法名 //也可以添加依赖注入DeptServiceImpl deptServiceimpl public SAXReader saxReader(DeptServiceImpl deptServiceimpl) { System.out.println(deptServiceimpl); SAXReader saxReader new SAXReader(); return saxReader; } } //pom.xml !--Dom4j-- dependency groupIdorg.dom4j/groupId artifactIddom4j/artifactId version2.1.3/version /dependency //BeanTest.java package com.jianglin; import com.jianglin.controller.DeptController; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; SpringBootTest public class BeanTest { Autowired private ApplicationContext applicationContext; Test public void testGetBean(){ //根据bean的名称获取 DeptController bean1 (DeptController) applicationContext.getBean(deptController); System.out.println(bean1); //根据bean的类型获取 DeptController bean2 (DeptController) applicationContext.getBean(DeptController.class); System.out.println(bean2); //根据bean的名称及类型获取 DeptController bean3 (DeptController) applicationContext.getBean(deptController,DeptController.class); System.out.println(bean3); } Test public void testBean(){ for (int i 0; i 10; i) { DeptController bean (DeptController) applicationContext.getBean(deptController); System.out.println(bean); } } Autowired private SAXReader saxReader; //第三方bean的管理 Test public void testThirdBean() throws Exception { // SAXReader saxReader new SAXReader(); Document document saxReader.read(this.getClass().getClassLoader().getResource(static/1.xml)); Element rootElement document.getRootElement(); String name rootElement.element(name).getText(); String age rootElement.element(age).getText(); System.out.println(name : age); } } //TliasApplication.java package com.jianglin; import org.dom4j.io.SAXReader; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Bean; ServletComponentScan SpringBootApplication public class TliasApplication { public static void main(String[] args) { SpringApplication.run(TliasApplication.class, args); } //不推荐这种方式影响启动类的整洁性 // Bean // public SAXReader saxReader() { // SAXReader saxReader new SAXReader(); // return saxReader; // } }component及衍生注解与bean注解使用场景项目中自定义的使用component及其衍生注解项目中引入第三方的使用bean注解SpringBoot原理起步依赖自动配置原理自动配置实现import com.google.gson.Gson; import com.jianglin.pojo.Result; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; /** * 自动配置原理测试 */ SpringBootTest public class AutoConfigurationTests { Autowired private Gson gson; Test public void testJson(){ String json gson.toJson(Result.success()); System.out.println(json); } }自动配置用Import导入//EnableHeaderConfig.java package com.example; import org.springframework.context.annotation.Import; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) Import(MyImportSelector.class) public interface EnableHeaderConfig { } //SpringbootWebConfig2Application.java import com.example.MyImportSelector; import com.example.TokenParser; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; //ComponentScan({com.example,com.itheima}) //Import({TokenParser.class}) //导入普通类交给IOC容器管理 //Import({HeaderConfig.class}) //导入配置类交给IOC容器管理 // Import({MyImportSelector.class}) //导入ImportSelector接口实现类 EnableHeaderConfig//直接导入整个第三方包com.example SpringBootApplication public class SpringbootWebConfig2Application { public static void main(String[] args) { SpringApplication.run(SpringbootWebConfig2Application.class, args); } /*...*/ } //MyImportSelector.java package com.example; import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelector implements ImportSelector { Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{com.example.HeaderConfig}; } }源码跟踪分析条件装配组件Conditional注解条件装配Conditional注解实现//HeaderConfig.java import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class HeaderConfig { Bean //ConditionalOnClass(name io.jsonwebtoken.Jwts) //环境中存在指定的这个类才会将该bean加入IOC容器中 //ConditionalOnMissingBean //不存在该类型的bean才会将该bean加入IOC容器中 —— 指定类型(value属性) 或 名称(name属性) ConditionalOnProperty(name name, havingValue itheima) //配置文件中存在指定的属性与值才会将该bean加入IOC容器中 public HeaderParser headerParser(){ return new HeaderParser(); } Bean public HeaderGenerator headerGenerator(){ return new HeaderGenerator(); } } //Test.java中的代码 //获取TokenParser Test public void testTokenParser() { System.out.println(applicationContext.getBean(TokenParser.class)); } //获取HeaderParser Test public void testHeaderParser() { System.out.println(applicationContext.getBean(HeaderParser.class)); } //获取HeaderGenerator Test public void testHeaderGenerator() { System.out.println(applicationContext.getBean(HeaderGenerator.class)); } //配置文件信息 spring: #数据库连接信息 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/tlias username: root password: 1234 #Mybatis配置 mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true name: itheima案例--自定义starterWeb后端开发总结这篇文章就先更新到这里接下来的内容可查看我的下一篇博客感谢观看希望对你有帮助。

相关新闻

捷配深圳pcb打样怎么样 现货快速不翻车

捷配深圳pcb打样怎么样 现货快速不翻车

就在上个月的时候,老张于朋友圈之中晒出了一张关于PCB打样的图,所配文字仅仅只有三个字,那便是:又翻车。 都在调侃他“交学费”的评论区的同行,我却私信问了他一句,这句是“这次是哪家?”。 老张…

2026/5/17 9:15:49 阅读更多 →
android ARouter配置降级服务

android ARouter配置降级服务

当传一个错误的路由,路由失败时,配置跳转到一个错误页面。修改common模块build.gradle.kts, defaultConfig里面加上:dependencies 添加:annotationProcessor("com.alibaba:arouter-compiler:1.5.2")完整的common/build.…

2026/5/17 9:15:49 阅读更多 →
手机号码测吉凶:民俗趣味解读与在线查询平台体验

手机号码测吉凶:民俗趣味解读与在线查询平台体验

手机号码作为现代生活中高频使用的数字标识,承载着沟通联络的基础功能,也在民间文化中被赋予了数字寓意与吉凶解读的趣味空间。手机号码测吉凶,正是基于传统数理、五行谐音等民俗文化衍生出的休闲玩法,不具备科学判定依据&#xf…

2026/5/17 8:04:08 阅读更多 →

最新新闻

PIC18F8722外部EEPROM存储扩展实战指南

PIC18F8722外部EEPROM存储扩展实战指南

1. 为什么需要外部EEPROM存储扩展在嵌入式系统开发中,PIC18F8722这类微控制器自带有限的内部存储空间。以PIC18F8722为例,其内部EEPROM容量仅为1024字节(1KB),这对于需要存储大量配置参数、历史数据或日志记录的应用场…

2026/7/3 17:21:52 阅读更多 →
高效低查重!AI教材生成工具助力教师轻松完成教材编写

高效低查重!AI教材生成工具助力教师轻松完成教材编写

谁没有在编写教材时感到困惑呢? 面对一页空白的文档,沉思了半个多小时,知识点的整理似乎毫无头绪——是先讲解基本概念,还是先分享案例呢?章节的划分该按照逻辑、还是依据课时呢?不断修改的大纲总是无法符…

2026/7/3 17:21:52 阅读更多 →
从8万美元跌至千元级,车载激光雷达成本暴跌96%背后:芯片化、规模化与全场景落地实战

从8万美元跌至千元级,车载激光雷达成本暴跌96%背后:芯片化、规模化与全场景落地实战

目录 摘要 一、行业综述:激光雷达从天价科研设备到民用标配的蜕变 1.1 十年价格迭代核心数据 1.2 市场格局与产业现状 二、核心降本逻辑一:芯片化架构重构,从分立器件到单芯片集成 2.1 传统分立架构的致命成本缺陷 2.2 芯片化自研的核心降本原理 2.3 头部厂商差异化…

2026/7/3 17:19:52 阅读更多 →
结构化数据 + GEO:让 AI 真正“读懂”你的网站

结构化数据 + GEO:让 AI 真正“读懂”你的网站

如果你的网站内容连 AI 都“看”不明白,再好的产品和服务也会在生成式搜索时代石沉大海。而让 AI 精准理解你的第一步,就藏在看似不起眼的 Schema 标记里。 一、当搜索引擎变成“答案引擎” 过去十年,SEO 的核心是取悦搜索引擎的爬虫——让它…

2026/7/3 17:17:52 阅读更多 →
如何在Steam Deck上实现多平台游戏启动器的一键整合

如何在Steam Deck上实现多平台游戏启动器的一键整合

如何在Steam Deck上实现多平台游戏启动器的一键整合 【免费下载链接】NonSteamLaunchers-On-Steam-Deck Installs the latest UMU/GE-Proton and Non Steam Launchers under 1 Proton prefix folder and adds them to your steam library. Installs... Battle.net, Epic Games,…

2026/7/3 17:17:52 阅读更多 →
城配内卷时代:谁的“管理颗粒度”更细,谁就能活下来

城配内卷时代:谁的“管理颗粒度”更细,谁就能活下来

城配行业正在经历一场残酷的洗牌。市场规模早已突破万亿,但行业集中度极低——这意味着成千上万家中小车队在同一条赛道里拼价格、拼人效。订单还在涨,单价却在下滑。过去靠“多拉快跑”就能赚钱的日子一去不返,如今拼的是谁的成本更低、谁的…

2026/7/3 17:15:51 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻