首页 > 其他分享 >10.配置优先级,bean的管理,SpringBoot原理

10.配置优先级,bean的管理,SpringBoot原理

时间:2023-11-24 18:01:55浏览次数:35  
标签:容器 SpringBoot 10 spring Bean bean 注解 IOC

配置优先级,bean的管理,SpringBoot原理

配置优先级:

  • 优先级(低->高):
application.yml
application.yml
application.properties
java系统属性(-Dxxx=xxx)
命令行参数(--xxx=xxx)
  • 例子-设置springboot项目端口号:
java系统属性: -Dserver.port=9000
命令行参数: --server.port=10010

bean的管理:

获取bean:

概念:
  • 默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过三种方法;
  • 上述所说的[Spring项目启动时,会把其中的bean都创建好] 还会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言;
ioc容器实例化:
  • 获得ioc容器的实例:private ApplicationContext applicationContext;使用@Autowired注解来依赖注入;
  • 再用这个实例调用获取的方法;
获取方法:
  • 根据name获取bean:Object getBean(String name)
  • 根据类型获取bean:<T> T getBean(Class<T> requiredType)
  • 根据name获取bean(带类型转换):<T> T getBean(String name,Class<T> requiredType)##

bean作用域:

概述:
  • 可以通过@Scope 注解来进行配置作用域:
@Scope("prototype")
分类:
作用域 说明
singleton 容器内间 名称 的 bean只有一个实例(单例)(默认)
prototype 每次使用该 bean 时会创建新的实例(非单例)
注意事项:
  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时);
  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例;
  • 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性;

第三方类:

概念:
  • 如果要管理的bean对象来自于第三方(不是自定义的),就需要用到@Bean注解;
  • 对一个方法使用@Bean注解,springboot会自动调用该方法,将当前方法的返回值对象交给IOC容器管理,成为IOC容器bean;
  • 方法里是用于实例化第三方对象的;
  • 若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类;
例子:
@Configuration
public class CommonConfig{
	@Bean
	public SAXReader saxReader(){
		return new SAXReader;
	}
}
注意事项:
  • 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名;
  • 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配;

SpringBoot原理:

概念:
  • SpringBoot简化Spring框架来开发程序,是依靠起步依赖自动配置来实现的;
起步依赖:
起步依赖的原理就是Maven的依赖传递;
自动配置原理:
概念;
  • SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去生命,从而简化了开发,省去了繁琐的配置操作;
启动类扫描非当前包及子包的类:
  • 方案一:@ComponentScan组件扫描;

    • 写在启动类上;
    • 里面的参数是一个数组,数组里的元素为全类名;
    @ComponentScan("com.example","com.caihongjia")
    @SpringBootApplication
    public class SpringbootwebConfig2Application{
    
    }
    
  • 方案二:@Import导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

    • 导入 普通类
    • 导入 配置类
    • 导入 ImportSelector 接口实现类;
      • 在导入的第三方依赖中,定义一个类实现ImportSelector接口,重写selectImports()方法;
      • 返回值为数组,数组元素为全类名;
    • 该注解写在启动类上;
    • 里面的参数是一个数组,数组里的元素对应类的class对象;
  • 方案三:@EnableXxx注解,自定义Enable开头的注解,使用@Import注解导入 ImportSelector 接口实现类;

    • 该自定义注解定义在第三方依赖中;
    • 然后再启动类里添加该自定义注解;
@Conditional注解:
  • 作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。

  • 位置:方法、类;

  • @Conditional本身是一个父注解,派生出大量的子注解,以下是较常用的子子注解:

    • @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器;
    • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器;
    • @ConditionalOnProperty:判断配置文件(application.yml)中有对应属性和值,才注册bean到IOC容器;
  • 例子:

    @Bean
    @ConditionalOnClass(name="io.jsonwebtoken.Jwts") //当前环境存在指定的这个类时,才注册bean到IOC容器
    public HeaderParser headerParser(){...}
    
    @Bean
    @ConditionalOnMissingBean //当不存在当前类型的bean时,才注册bean到IOC容器
    public HeaderParser headerParser(){...}
    
    @Bean
    @ConditionalOnProperty(name="name",havingValue="caihongjia") //配置文件中存在对应的属性和值,才注册bean到IOC容器
    public HeaderParser headerParser(){...}
    
自定义starter:
起步依赖命名规范:
  • SpringBoot官方:spring-boot-starter-xxx
  • 第三方官方:xxx-spring-boot-starter
操作:
  • 需求:自定义aliyun-oss-spring0starter,完成阿里云OSS操作工具类AliyunOSSUtils的自动配置;

  • 目标:引入起步依赖引入之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可;

  • 步骤:

    • 创建aliyun-oss-spring-boot-starter模块,为依赖管理功能

    • 创建aliyun-oss-spring-boot-autoconfigure模块,为自动配置功能,在starter中引入该模块;

    • 在aliyun-oss-spring-boot-autoconfigure模块中定义自动配置功能

    • 并在resources文件夹下,定义自动配置文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

    • 配置文件里面写,自动配置类的全类名;

      aliyun-oss-spring-boot-starter
      
      aliyun-oss-spring-boot-autoconfigure
      

标签:容器,SpringBoot,10,spring,Bean,bean,注解,IOC
From: https://www.cnblogs.com/chj020415/p/17854407.html

相关文章

  • KubeSphere 社区双周报 | Fluent Operator 2.6.0 发布 | 2023.11.10-11.23
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.11.10-2023.11.23。贡献者名单新晋KubeSphereCont......
  • Codeforces Round 910 (Div. 2)
    CodeforcesRound910(Div.2)A.MilicaandString解题思路:统计给定字符串\(s\)中的\(B\)的数量,记录为\(cnt\)。如果\(cnt==k\):输出0;如果\(cnt<k\):从左往右数,将第\(cnt-k\)个\(A\)的位置前的数全部变成\(B\).如果\(cnt>k\):从左往右数,将第\(k-cnt\)个\(B\)的......
  • error:0308010C:digital envelope routines::unsupported
    执行:npmrunserve 出现:error:0308010C:digitalenveloperoutines::unsupported原因:npm版本升级解决:package.json增加配置"scripts":{"serve":"setNODE_OPTIONS=--openssl-legacy-provider&&vue-cli-serviceserve","b......
  • 处理一张图片生成10个子图片,而且读取语义文本,比如'red hat'
    完成了,对两个函数的重构,放入了imagebox.py文件中我从博客的文章日志,继续处理twitter数据集,重构代码。正向反馈,提高效率。重构save_10_boximg函数1.添加im_file参数2.添加生成boxlist的流程,目的是,让接口只需要调用save_10_boximg函数,就可以完成对子图片的提取。这样就可以为下一步提......
  • 基于springboot,vue的教务管理系统源码 学生信息管理系统
    项目源码获取方式放在文章末尾处项目技术数据库:Mysql5.7数据表:9张开发语言:Java(jdk1.8)开发工具:idea前端技术:Vue后端技术:SpringBoot 项目源码获取方式放在文章末尾处功能简介该项目是一个教务管理系统,角色分为管理员,教师,学生三个角色,具体功能菜单如下:管理员端    登录    ......
  • 2.web(HTTP,Tomcat,SpringBootWeb)
    web(HTTP,Tomcat,SpringBootWeb)HTTP:概念:HyperTextTransferProtocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则;特点;基于TCP协议:面向连接,安全;基于请求-响应模型的:一次请求对应一次响应;HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响......
  • 基于springboot的医院管理系统
    项目源码获取方式放在文章末尾处项目技术数据库:Mysql5.7数据表:36张开发语言:Java(jdk1.8)开发工具:idea前端技术:HTML+CSS后端技术:SpringBoot 项目源码获取方式放在文章末尾处功能简介该项目是一个医院管理系统,可自行配置用户角色以及字典信息,具体功能菜单如下:   登录    后......
  • [SpringBoot][Maven]关于maven pom文件的packaging属性
    关于mavenpom文件的packaging属性前几天在调试源码运行程序的时候,因为将项目中pom文件的packaging属性用错导致源码包无法引入使用而报Bean注入错误,在此进行总结整理记录。packaging是maven的pom.xml中的一个标签,用于指定maven项目的输出格式,也就是打包类型,使用方式为:<packagi......
  • Top 10 Strong Earthquakes in the World
    ChileEarthquake(M=9.5)in1960inminutesputmore2millionspeopleinlostliveorhomesAlaskaEarthquake(M=9.2)in1964RussianEarthquake(M=9.0)in1952JapanEarthquake(M=9.0)in2011,2000peoplediedinminutesIndonesianEarthquake......
  • 10_填充每个节点的下一个右侧节点指针
    填充每个节点的下一个右侧节点指针给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个......