SpringBoot原理篇 一Springboot配置优先级1三种内部配置文件一文件类型properties文件yml文件yaml文件二文件类型执行顺序properties文件 yml文件 yaml文件建议配置文件统一使用同一种格式yml文件最经常使用2两种外部配置指令一文件格式java系统属性格式-Dserver.port9000 格式-D配置文件名配置属性命令行参数格式--server.port10010 格式--配置文件名配置属性二配置方式点击edit configuration选择要配置的项目配置VM option和program arguments假设没有这两个可以点击Mondify option选择add VM option就行细节这个配置方法只能在idea软件使用假设运行这个代码的jar包只有配置文件有效但如果不想使用配置文件的内容就可以在执行代码上添加指令三执行优先顺序命令参数 java系统属性四所有顺序排序命令参数 java系统属性 properties文件 yml文件 yaml文件五配置作用可以执行maven打包指令package将代码打包成jar包然后执行命令行运行jar包java -Dserver.port9000 -jar tilas-web-management-0.0.1-SNAPSHOT.jar --server.port10010格式java java系统属性(选填) jar包文件名 命令参数(选填)需要引入依赖spring-boot-maven-plugin如果是使用springboot官方的文件官方有提前引入二bean管理1bean的作用域关键了解前两个的运行时机以及作用细节假设没有指定bean的类型默认就是singleton2单例和多例bean一单例bean单例bean的使用时机就是如果没有数据的保存因为这样就不会有线程安全的问题优势不用多次创建目标类和销毁提高运行效率假设需要数据保存那么多个线程就会公用一个数据导致数据无效化二多例bean多例bean的使用时机就是需要数据的存储因为这样每一个新的线程就会创建一个新的bean供其使用就不会有线程安全的问题优势多个用户多条线程使用的数据相互独立互不影响但是需要多次创建和消除目标类效率低3第三方bean假设想要将第三方工具引入我们的项目无法使用直接注入依赖的方式注入工具类因为第三方的工具类是无法编辑的所以需要新的注解Bean添加依赖//注解新的bean交给ioc容器管理 //一旦交给ioc管理那么就会自动调配aliyunOSSProperties无需添加注解Autowired Bean public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties) { return new AliyunOSSOperator(aliyunOSSProperties); }假设第三方类为AliyunOSSProperties那么就将上面的方法写到启动类里面那么就会将这个方法添加到ioc容器内自动配对类但是我们希望启动类的方法单一所以不要将第三方bean的引入写在启动类上面就需要创建一个新的类用于处理这个方法使用注解Configuration表示配置类Configuration public class CommonConfig { //注解新的bean交给ioc容器管理 //一旦交给ioc管理那么就会自动调配aliyunOSSProperties无需添加注解Autowired Bean public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties aliyunOSSProperties) { return new AliyunOSSOperator(aliyunOSSProperties); } }三SpringBoot原理1起步依赖-原理引入某个依赖就会将其他常用的依赖一同引入减少代码的配置时间提高效率是根据maven的依赖传递2自动配置一自动配置是什么SpringBoot的自动配置就是当Spring项目启动后一些配置类bean对象就会自动存入ioc容器中不需要手动声明从而简化开发省去繁琐的配置操作二自动配置的方案1方案一导入普通类在启动类上面声明手动扫描注解ComponentScan(basePackages {包名字符串数组})缺点后续一旦有多个第三方工具包就需要我们手动扫描并且需要我们程序员了解第三方包名性能低扫描越多的包消耗时间越长SpringBootApplication //springBootApplication具备组件扫描的功能但是只能扫描当前包以及子包下的类 //所以需要手动配置扫描的包名一旦配置扫描范围那么原来的扫描范围就会失效 ComponentScan(basePackages {com.itheima,com.example}) public class SpringbootWebConfigApplication { public static void main(String[] args) { SpringApplication.run(SpringbootWebConfigApplication.class, args); } }2方案二导入配置类Configuration public class HeaderConfig { Bean public HeaderParser headerParser(){ return new HeaderParser(); } Bean public HeaderGenerator headerGenerator(){ return new HeaderGenerator(); } }也需要我们了解第三方的配置类的类名不利于开发Import(HeaderConfig.class)//配置类就是有注解Configuration的类3方案三导入ImportSelector接口实现类public class MyImportSelector implements ImportSelector { public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{com.example.HeaderConfig, com.example.TokenParser}; } }importSelect接口的作用就是可以批量注入工具类优势就是只要第三方开发人员配置好注入的包名使用者直接使用这个类的名字就行Import(MyImportSelector.class)//ImportSelector的实现类实现批量导入4方案四EnableXxx注解封装Import注解Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) Import(MyImportSelector.class) public interface EnableHeaderConfig { }使用Import注解将上面第三种方案给封装到我们自定义的注解上这样使用者就直接可以使用也不需要知道importSelect实现类的包名使用自定义注解EnableHeaderConfig三小结3自动配置源码跟踪一SpringBootApplication启动类源码跟踪自动配置在springboot项目中启动位置就是我们的启动类注解上SpringBootApplicationSpringBootApplication注解内部封装了其他三个重要的注解第一个注解SpringBootConfiguration底层其实就是封装了注解Configuration所以启动类注解底层就是配置类第三个注解ComponentScan就是扫描注解所以启动类注解才具备扫描功能第二个注解EnableAutoConfiguration表示开启自动配置的开关而Enable这种字母开头就表示底层一定会封装Import注解而AutoConfigurationImportSelector.class底层是ImportSelector的实现类importSelector底层可以批量注入第三方工具类importSelector的结果返回值就是String类型的数组数组内容就是第三方工具类的全类名而一下就是AutoConfigurationImportSelector的实现方法返回类型就是String数组再次进入getAutoConfigurationEntry其中主要的参数configurations和exclusions分别表示需要注入的所有全类名排除不需要注入的全类名进入getCandidateConfigurations方法内就是返回需要注入的全类名而下面的这个就是记录全类名的文件地址下面就是这个文件的记录内容所有需要注入的方法的全类名二注入条件设置而因为有太多的第三方类需要注入所以在真正的项目中类的注入并不是全部注入需要达到某些条件才可以实现自动注入所以就出现注解Conditional就表示需要达到某些条件才会注入三小结3自定义starter一功能可以包装某个比较单一重复的方法将方法的全类名添加到指定路径指定名字的文件内那么只要使用Autowired注解就能直接将方法注入例如aliyun的文件上传二实现流程1创建starter模块这个starter模块唯一的功能就是注入依赖将主要实现功能的模块注入starter模块2创建autoconfigure模块这个autoconfigure模块主要就是实现功能其中主要功能的类不需要使用Component注入到bean容器这个功能模块也不需要启动类然后创建一个autoconfigure类注明是配置类并且需要bean注解将这个类添加到容器内创建一个函数将我们需要调用的功能类返回结果那么就会因为有bean注解自动添加到ioc容器内3创建文件文件路径必须是META-INF.spring不能有任何不一样的地方这样才会被自动匹配注入文件内容必须是autoconfigure的全类名这样启动时才会自动将这个全类名添加到importSelecter进行批量注入文件名有点复杂直接看别人写好的然后复制就行四maven高级1分模块设计一设计格式二写法格式将其他模块与主模块分开设计然后在主模块的pom.xml文件内引入其他模块的依赖二优势方便维护每个模块只实现自己的功能方便查找问题所在模块方便开发能够实现多人开发一个工程最后由主模块同一依赖注入2继承一继承关系1概念继承描述的是两个工程之间的关系与java中的继承相似子继承是可以继承父工程的配置信息一般父工程配置的都是子工程的公共配置信息作用同一依赖管理简化配置信息实现parent.../parent工程之间继承只能单继承但是可以和java代码继承一样使用多重继承2实现流程1创建maven模块tlias-parent该工程就是父工程设置打包方式为pom默认是jar包jar包普通模块打包springboot项目基本都是java包内嵌tomcat进行war包普通web程序打包需要部署在外部tomcat服务器中运行pom包父工程或聚合工程该模块不写代码仅进行依赖管理2在子工程的pom.xml文件配置继承关系3在父工程配置各个工程共有的依赖3细节二版本锁定1作用可以直接在父工程中统一指定所有依赖的版本那么子工程在引入依赖时就不需要指定版本2写法properties maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target project.build.sourceEncodingUTF-8/project.build.sourceEncoding !-- 设置所有版本号在最上面这样方便查找修改-- lombok.version1.18.34/lombok.version spring-boot-starter.version3.2.8/spring-boot-starter.version aliyun-sdk-oss.version3.18.4/aliyun-sdk-oss.version jaxb-api.version2.3.1/jaxb-api.version activation.version1.1.1/activation.version jaxb-runtime.version2.3.3/jaxb-runtime.version jjwt.version0.9.1/jjwt.version mybatis-spring-boot-starter.version3.0.3/mybatis-spring-boot-starter.version mybatis-spring-boot-starter-test.version4.0.1/mybatis-spring-boot-starter-test.version pagehelper.version1.4.7/pagehelper.version /properties3聚合一目的假设我们在打包jar包我们使用分模块设计的方式打包jar包他就需要到本地仓库查找但是前提还需要我们手动把其他模块下载到本地仓库太繁琐所以需要聚合操作把需要使用的模块聚合一起然后直接打包就可以了二实现1需要一个聚合工程其实就是父工程在聚合工程内设置需要聚合的模块的相对地址2使用标签modules!-- 聚合模块-- modules module../tilas-pojo/module module../tilas-web-management/module module../tilas-utils/module /modules4私服就是假设多个公司需要使用同一个模块或者项目但是我们只能将模块保存到本地仓库而其他的公司无法获取到那么就需要私服相当于在多个公司之间创建一个仓库公共使用私服仓库分为三个部分central仓库是从中央仓库下载下来的模块依赖release仓库是表示稳定版本可以正式发布snapshot仓库表示快照版本就是不稳地版本配置访问私服和上传私服有点麻烦直接看第151集就行https://www.bilibili.com/video/BV1yGydYEE3H?spm_id_from333.788.videopod.episodesvd_sourceb430d058955f32bb76f01d965d0e93dfp151