01---java面试八股文——springboot---10题
01-你是怎么理解Spring Boot 的约定优于配置
- 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。
- Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架下的一个脚手架,通过Spring Boot,我们可以快速开发基于 Spring 生态下的应用程序。
- 基于传统的Spring框架开发web应用,我们需要做很多和业务开发无关并且只需要做一次的配置:
- 管理 jar 包依赖
- web.xml 维护
- Dispatch-Servlet.xml 配置项维护
- 应用部署到 Web 容器
- 第三方组件集成到 Spring IOC 容器中的配置项维护
- 而在 Spring Boot 中,我们不需要再去做这些繁琐的配置,Spring Boot 已经自动帮我们完成了,这就是约定优于配置思想的体现。
- Spring Boot 约定优于配置的体现有很多:
- Spring Boot Starter 启动依赖,它能帮我们管理所有 jar 包版本
- 如果当前应用依赖了 spring mvc 相关的 jar,那么 Spring Boot 会自动内置Tomcat 容器来运行 web 应用,我们不需要再去单独做应用部署。
- Spring Boot 的自动装配机制的实现中,通过扫描约定路径下的spring.factories 文件来识别配置类,实现 Bean 的自动装配。
- 默认加载的配置文件 application.properties 等等。
- 总的来说,约定优于配置是一个比较常见的软件设计思想,它的核心本质都是为了更高效以及更便捷地实现软件系统的开发和维护。
02-聊一下Spring Boot 中自动装配机制的原理
- 自动装配,简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 器里面,不需要开发人员再去写 Bean 的装配配置。
- 在 Spring Boot 应用里面,只需要在启动类加上
@SpringBootApplication 注解
就可以实现自动装配。@SpringBootApplication 是一个复合注解,真正实现自动装配的注解是@EnableAutoConfiguration。 - 自动装配的实现主要依靠三个核心关键技术。
-
- 引入 Starter 启动依赖组件的时候,这个组件里面必须包含
@Configuration 配置类
,在这个配置类里面通过@Bean 注解声明需要装配到 IOC 容器的 Bean 对象。
- 引入 Starter 启动依赖组件的时候,这个组件里面必须包含
-
- 这个配置类是放在第三方的 jar 包里面,然后通过 SpringBoot 中的约定优于配置思想,把这个配置类的全路径放在 classpath:META-INF/spring.factories 文件中。这样SpringBoot 就可以知道第三方 jar 包里面的配置类的位置,这个步骤主要是用到了 Spring 里面的SpringFactoriesLoader来完成的。
-
- SpringBoot 拿到第三方 jar 包里面声明的配置类以后,再通过 Spring 提供的ImportSelector接口,实现对这些配置类的动态加载。
-
- 在我看来,SpringBoot 是约定优于配置这一理念下的产物,所以在很多的地方,都会看到这类的思想。它的出现,让开发人员更加聚焦在了业务代码的编写上,而不需要去关心和业务无关的配置。其实,自动装配的思想,在 SpringFramework3.x 版本里面的@Enable 注解,就有了实现的雏形。@Enable 注解是模块驱动的意思,我们只需要增加某个@Enable 注解,就自动打开某个功能,而不需要针对这个功能去做 Bean 的配置,@Enable 底层也是帮我们去自动完成这个模块相关Bean的注入。
03-谈谈你对springboot的理解
- Spring Boot 是一个功能强大且易于使用的框架,它极大地简化了 Spring 应用的开发和部署过程。通过提供默认配置、自动装配、内嵌 Servlet 容器等功能,Spring Boot 使得开发者能够更快地启动和运行应用,并专注于业务逻辑的实现。同时,Spring Boot 还提供了丰富的生态系统和监控管理工具,以及高度的灵活性和可扩展性,使得开发者能够轻松地构建现代化、高性能的应用程序。
04-为什么要使用Springboot
-
快速开发:Spring Boot 通过提供大量的默认配置和自动装配功能,极大地减少了开发者需要编写的配置代码。这意味着开发者可以更快地启动项目,专注于业务逻辑的实现,而不是在配置和集成上花费大量时间
-
简化配置:
- starter:可以减少依赖的配置,一个starter里面就包含了若干个依赖
- parent:减少依赖冲突,parent里面已经定义好对应的依赖管理,使用parent管理的依赖的时候无需自定义依赖的版本
-
能够独立运行:Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器 中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个jar包内
-
一站式解决方案:Spring Boot 与 Spring 框架中的其他项目(如 Spring MVC、Spring Data JPA、Spring Security 等)无缝集成,为开发者提供了一站式的解决方案。这意味着可以使用 Spring Boot 来构建完整的应用程序,而无需担心不同组件之间的兼容性和集成问题。
-
丰富的生态系统:Spring Boot 拥有丰富的第三方库和 Starter 项目,这些库和 Starter 项目提供了对常见功能和服务的支持。开发者可以通过添加相应的依赖来快速集成这些功能,而无需从头开始编写代码。
-
易于监控和管理:Spring Boot 提供了多种监控和管理工具,如 Spring Boot Actuator。通过 Actuator,开发者可以轻松地获取应用的运行信息,并进行远程管理。这使得应用的监控和管理变得更加容易和高效。
-
高度可扩展性:尽管 Spring Boot 提供了许多默认配置和自动装配功能,但它仍然保持了高度的可扩展性。开发者可以通过自定义配置、编写自定义的 Starter 等方式来扩展 Spring Boot 的功能,以满足特定的业务需求。
-
社区支持:Spring Boot 拥有庞大的社区支持和丰富的文档资源。这意味着开发者在遇到问题时,可以很容易地找到解决方案,并从社区中获得帮助。这降低了开发过程中的风险和不确定性。
-
现代化技术:Spring Boot 始终保持着与 Java 生态系统的同步更新,支持最新的 Java 版本和框架。这使得开发者能够使用最新的技术和工具来构建现代化的应用程序,从而保持竞争力。
-
易于部署:Spring Boot 应用可以打包成独立的可执行 JAR 文件,这使得它们更易于部署和管理。开发者可以将 JAR 文件直接部署到服务器或容器中,而无需进行复杂的配置和集成工作。
05-Springboot的核心注解是哪个?它主要由哪几个注解组成的?
- Springboot的核心注解是启动类上面的
@SpringBootApplication
注解,它是一个组合注解:它包含了@Configuration、@EnableAutoConfiguration 和 @ComponentScan
三个注解。- @SpringBootConfiguration:标识该类是 Spring Boot 应用程序的配置类,用于替代传统的 XML 配置文件。这个注解是 @Configuration 注解的特化,表明当前类是一个配置类,并用于定义 Spring 容器如何初始化、配置和管理 Bean。
- @EnableAutoConfiguration:自动配置注解,通过扫描 classpath 中的 jar 包,根据引入的依赖自动配置 Spring 框架。这个注解告诉 Spring Boot 根据添加的 jar 依赖为当前项目进行自动配置。例如,如果 classpath 下有 Spring MVC 的 jar 包,Spring Boot 会自动配置为 MVC 控制器。也可以关闭某个自动配置的选项,如关闭数 据 源 自 动 配 置 功 能 : @SpringBootApplication(exclude={ DataSourceAutoConfiguration.class })。
- @ComponentScan :自动扫描注解,用于自动扫描并注册组件(Bean),包括 @Controller、@Service、@Repository 和 @Configuration 等注解。这个注解默认会扫描与配置类相同的包及其子包下的所有 Bean,但可以通过指定包路径和过滤规则来进一步配置扫描行为
06-运行springboot有哪些方式
- 直接运行启动类:这是最直接的方式,通过集成开发环境(IDE)如 IntelliJ IDEA 或 Eclipse,你可以直接右键点击 Spring Boot 应用程序的启动类(即包含 main 方法的类),然后选择“Run”或“Debug”来运行应用程序。
- 使用 Maven 命令运行:在命令行中进入项目的根目录,然后执行 mvn spring-boot:run 命令来运行 Spring Boot 应用程序。这种方式依赖于 Maven 构建工具,并且需要项目中已经配置好 Spring Boot 插件。
- 打包成可执行的 JAR 文件运行:使用 Maven 或 Gradle 等构建工具,将 Spring Boot 应用程序打包成可执行的 JAR 文件。这通常通过执行 mvn package(Maven)或 gradle build(Gradle)命令来完成。打包完成后,你可以在命令行中使用 java -jar your-project.jar 命令来运行 JAR 文件。
- 打包成 WAR 文件并部署到 Servlet 容器运行(了解):如果需要将 Spring Boot 应用程序部署到外部的 Servlet 容器(如 Tomcat、Jetty 等),你可以将应用程序打包成 WAR 文件。这需要在项目的 pom.xml 文件中将打包方式设置为 WAR,并使用 Maven 或 Gradle 等构建工具执行打包命令。打包完成后,将生成的 WAR 文件部署到 Servlet 容器的 webapps 目录下,然后启动容器即可运行应用程序。
- 使用插件运行(了解):某些 IDE 或构建工具提供了专门的插件来运行 Spring Boot 应用程序。例如,在 IntelliJ IDEA 中,你可以安装 Spring Boot 插件,并通过该插件来运行和调试 Spring Boot 应用程序。
- 通过脚本运行(了解):对于一些自定义的运行需求,你可以编写脚本来启动 Spring Boot 应用程序。这些脚本可以包含设置环境变量、配置参数、启动服务等操作。
- 通过 Docker 容器运行:对于需要容器化部署的场景,你可以将 Spring Boot 应用程序打包成 Docker 镜像,并在 Docker 容器中运行。这种方式提供了更好的环境隔离和资源管理。
07-Springboot实现热部署有哪几种方式
- 使用 Spring Boot DevTools:Spring Boot DevTools 是 Spring Boot 官方提供的一个开发工具包,它支持自动重启、LiveReload 等功能,非常适合开发过程中的热部署需求。只需在项目的 pom.xml(Maven 项目)或 build.gradle(Gradle 项目)文件中添加 spring-boot-devtools 依赖,并在开发环境下启动应用程序。当代码或资源文件发生变化时,DevTools 会自动检测到这些变化,并重新启动应用程序,而无需手动重启。
- 使用Spring Loaded:Spring Loaded 是 Spring 官方早期提供的一款热部署工具,但目前已不再积极维护。尽管如此,它仍然可以在一些旧项目中使用。
使用 Spring Loaded 需要在项目的 pom.xml 文件中添加 Spring Loaded 依赖,并在启动应用程序时添加相应的 JVM 参数。 - IDE 的热部署功能:大多数流行的 IDE(如 IntelliJ IDEA、Eclipse、Spring Tool Suite 等)都提供了热部署功能,可以通过设置在不重启服务器的情况下重新加载更改。在 IntelliJ IDEA 中,可以通过设置自动编译和允许运行时编译来实现热部署。在 Eclipse 或 Spring Tool Suite 中,可以启用自动构建和自动发布功能。
08-Springboot的核心配置文件类型
有哪些,它们的加载顺序是咋样的?
-
springboot的核心配置文件类型有:
- application.properties
- application.yml
- application.yaml
-
不同的springboot核心配置文件的类型的加载顺序:
application.properties > application.yml > application.yaml
- 不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
09-Springboot的核心配置有哪几个,它们的加载顺序是咋样的?
- springboot的核心配置文件有application 和 bootstrap 配置文件。
- 区别:
- 加载顺序与优先级
- 加载顺序:Spring Boot在启动时会
先加载bootstrap.yml
,然后才会加载application.yml。这意味着bootstrap.yml中的配置可以被用来配置Spring Boot的基础设置,例如日志和加密,这些设置需要在应用程序的其他部分甚至是application.yml之前生效。 - 优先级:如果在bootstrap.yml和application.yml中都定义了相同的属性,则bootstrap.yml中的属性将具有更高的优先级,并覆盖 application.yml中的属性。
- 加载顺序:Spring Boot在启动时会
- 配置内容与用途
- bootstrap.yml:用于系统级别的一些参数配置来引导程序执行,应用于更加早期的系统级别的配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。在Spring Cloud环境中,bootstrap.yml通常用于配置与Spring Cloud Config Server的连接,以及加解密配置等。
- application.yml:用于定义应用级别的应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。提供了简便的方式来配置Spring Boot应用程序的各种组件,如数据源、数据库、缓存、邮件服务等。如果搭配spring-cloud-config使用,application.yml里面定义的文件可以实现动态替换。
- 环境隔离与配置管理
- 环境隔离:application.yml文件支持不同环境的配置,开发者可以为开发环境、测试环境和生产环境创建不同的配置文件,如application-dev.yml、application-test.yml和application-prod.yml,并通过spring.profiles.active属性来指定当前激活的环境配置。bootstrap.yml通常不包含环境特定的配置,因为它是在应用程序启动的最早期阶段加载的。
- 配置管理:通过使用application.yml文件,开发者可以将应用程序的配置信息集中管理,方便维护和更新。bootstrap.yml虽然也可以用于配置管理,但由于其加载顺序和优先级的特殊性,它更适合用于配置那些需要在应用程序启动之前就已经确定的、不经常变动的系统级参数。
- 加载顺序与优先级
10-SpringBoot配置文件的分类
-
SpringBoot提供的4级配置文件分别是:
- 类路径下配置文件(一直使用的是这个,也就是resources目录中的application.yml文件):服务于开发人员本机开发与测试
- 类路径下config目录下配置文件:服务于项目经理整体调控
- 程序包(打包好的工程)所在目录中配置文件:服务于运维人员配置涉密线上环境
- 程序包(打包好的工程)所在目录中config目录下配置文件:服务于运维经理整体调控
-
4种配置文件如果都存在的话,有一个优先级的问题,4个文件的加载优先顺序为:
-
- file :config/application.yml 【最高】
-
- file :application.yml
-
- classpath:config/application.yml
-
- classpath:application.yml 【最低】
-
-
多层级配置文件间的属性采用叠加并覆盖的形式作用于程序
相关文章:
01---java面试八股文——springboot---10题
01-你是怎么理解Spring Boot 的约定优于配置 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架…...

计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

【进阶OpenCV】 (3)--SIFT特征提取
文章目录 sift特征提取一、基本原理二、特点三、代码实现1. 函数方法2. 检测图像中的关键点3. 绘制关键点4. 计算关键点描述符5. 输出特征坐标点 总结 sift特征提取 SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)特征检测是一种…...

HarmonyOS/OpenHarmony Audio 实现音频录制及播放功能
关键词:audio、音频录制、音频播放、权限申请、文件管理 在app的开发过程中时常会遇见一些需要播放一段音频或进行语音录制的场景,那么本期将介绍如何利用鸿蒙 audio 模块实现音频写入和播放的功能。本次依赖的是 ohos.multimedia.audio 音频管理模块&am…...

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用
1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…...

Activiti 工作流大致了解
一、什么是 Activiti 简而言之,就是系统的流程图,如:请假审批流程、账单审批流程等。 二、mysql与pom配置 mysql要使用jdbc:mysql://localhost:3306/activiti?autoReconnecttrue pom文件要添加关键依赖 <!--activiti核心依赖--> &…...
速盾:高防 CDN,网站安全的有力保障
在当今数字化时代,网站安全已成为企业和个人关注的焦点。随着网络攻击手段的不断升级,传统的安全防护措施已经难以满足需求。而高防 CDN(Content Delivery Network,内容分发网络)的出现,为网站安全提供了有…...

宝塔搭建nextcould 30docker搭建onlyoffic8.0
宝塔搭建nextcould 宝塔搭建nextcould可以参考这两个博文 我搭建的是30版本的nextcould,服务组件用的是下面这些,步骤是一样的,只是版本不一样而已 nginx 1.24.0 建议选择nginx,apache没成功。 MySQL 8.0以上都可以 php 8.2.…...

【源码+文档+调试讲解】交通信息管理系统
摘 要 智能交通信息管理系统是一种基于计算机技术的软件系统,旨在提高交通管理的效率和服务质量。通过该系统可以实现智能交通管理的全面管理和优化。智能交通信息管理系统具备集成管理功能。它能够整合智能交通管理的各个业务环节,包括个人中心、用户管…...
小阿轩yx-案例:Ansible剧本文件实践
小阿轩yx-案例:Ansible剧本文件实践 Playbook 介绍 什么是 playbook playbook 顾名思义,即剧本,现实生活中演员按照剧本表演在 ansible 中,由被控计算机表演,进行安装,部署应用,提供对外的服…...
【ShuQiHere】深入理解微架构(Microarchitecture):LC-3 的底层实现 ️
【ShuQiHere】🖥️ 微架构(Microarchitecture) 是计算机体系结构中的重要概念,它定义了如何将 指令集架构(Instruction Set Architecture, ISA) 转化为实际硬件。通过微架构,我们可以理解计算机…...
Ubuntu24.04.1系统下VideoMamba环境配置
文章目录 前言第一步:基本的环境创建第二步:causal-conv1d和mamba_ssm库的安装第三步:安装requirements.txt 前言 VideoMamba环境的配置折磨了我三天,由于Mamba对Cuda的版本有要求,因此配置环境的时候Cuda版本以及各种…...

c++第十二章续(队列结构类模拟)
队列类 设计类,需要开发公有接口和私有实现 Queue类接口 公有接口: 默认初始化,和可以用显式初始化覆盖默认值 Queue类的实现 如何表示队列数据: 一种方法是使用new动态分配一个数组,它包含所需的元素数。不过&…...

数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall
数据集-目标检测系列-豹子 猎豹 检测数据集 leopard>> DataBall 数据集-目标检测系列-豹子 猎豹 检测数据集 leopard 数据量:5k 想要进一步了解,请联系。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集&#x…...

基于ESP8266—AT指令连接阿里云+MQTT透传数据(3)
MQTT_RX设备为接收(订阅)数据的Topic,使用ESP8266通过AT指令实现。 首先需要串口通信软件,如 SSCOM、PuTTY、SecureCRT 等串口调试工具,功能丰富,支持常见的串口调试功能,用于发送AT指令。 以下是ESP8266通过AT指令连接阿里云MQTT服务的步骤: 1、初始化WiFi 发送下面…...

redis的数据结构,内存处理,缓存问题
redisObject redis任意数据的key和value都会被封装为一个RedisObject,也叫redis对象: 这就redis的头信息,占有16个字节 redis中有两个热门数据结构 1.SkipList,跳表,首先是链表,和普通链表有以下差异&am…...
机器学习模型评估与选择
前言 承接上篇讲述了机器学习有哪些常见的模型算法,以及使用的场景,本篇将继续讲述如何选择模型和评估模型。几个概念了解一下: 经验误差:模型在训练集上的误差称之为经验误差;过拟合:模型在训练集上表现…...

Web认识 -- 第一课
文章目录 前言一、HTML是什么?二、了解Web1. 基本概念2.Web标准3. Web构成1.前端1. HTML2.CSS3. javaScript4.常见浏览器介绍 2.Web标签构成1.结构标准2.表现标准 -- css3. 行为标准 -- javaScript 总结 前言 这里是我们进入前端学习的开端,在本次更新之后我会陆续…...

Recaptcha2 图像识别 API 对接说明
Recaptcha2 图像识别 API 对接说明 本文将介绍一种 Recaptcha2 图像识别2 API 对接说明,它可以通过用户输入识别的内容和 Recaptcha2验证码图像,最后返回需要点击的小图像的坐标,完成验证。 接下来介绍下 Recaptcha2 图像识别 API 的对接说…...
6种MySQL高可用方案对比分析
大家好,我是 V 哥,关于 MySQL 高可用方案,在面试中频频出现,有同学在字节面试就遇到过,主要考察你在高可用项目中是如何应用的,V 哥整理了6种方案,供你参考。 MySQL的高可用方案有多种…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...