springboot配置原理

1.配置文件优先级

再springboot中有三种配置文件,  properties配置文件,yml配置文件,yaml配置文件,按照优先级  properties>yml>yaml

除了配置文件配置,还有java系统配置 和命令行参数配置两种配置

 怎么配置命令行参数呢,在Java中的在我们java启动的地方 有

下拉列表 有一个编辑配置

就可以进行配置,然后就会发现 tomcat执行的是9000的端口号,这时候我们会知道配置的优先级为

当我们项目打包好之后怎么配置优先级呢?我们在maven中执行package打包命令打包好jar包之后

java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010

用上面的命令在命令行输出就可以设置参数了

2.bean管理

之前我们再用@componet 注解和他的衍生注解@controller @service @repository 三个注解 来声明ioc的bean对象,用@autowired 注解进行依赖注入,这都有bean管理的身影

1.从ioc容器中手动获取bean对象

通常springboot在启动时候会自动创建ioc容器,在启动过程中自动创建好bean对象放在ioc容器中

假如 现在我们有一个DeptController 的类,我们想获取这个类的bean对象 ,我们在测试类中注入ioc容器的ioc容器对象   ApplicationContext   ,然后再测试类中用 以下方法可以直接获取

打印出来发现bean对象的地址值都是相同的,说明ioc容器当中的bean对象只有一个

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

2.2bean的作用域

前面的创建的bean对象都是单例对象,也就是只有一个实例对象,如何设置非单例对象 就可以用@scope注解设置

在需要生命的类上加入@scope(value)就可以了

@lazy 注解  是延迟加载bean对象,只有bean对象被使用的时候才会加载bean对象

不设置scope的话默认是singleton模式

2.3第三方bean

第一种方法在启动类上加入@bean注解  

这种不太好,因为我们一般要保持启动类的纯粹性,所以不能在启动类中添加

第二种方式  自己创建一个配置类

然后加入@configuration 注解

 在类中声明第三方bean

如果第三方bean需要依赖其他bean对象,在bean的定义方法中设置形参就要可以了,。容器会自动装配

bean的使用原则

如果是在项目当中我们自己定义的类,想将这些类交给IOC容器管理,我们直接使用@Component 以及它的衍生注解来声明就可以。 如果这个类它不是我们自己定义的,而是引入的第三方依赖当中提供的类,而且我们还想将这个类 交给IOC容器管理。此时我们就需要在配置类中定义一个方法,在方法上加上一个@Bean注解,通 过这种方式来声明第三方的bean对象。

3.springboot原理

springboot的起步依赖原理 就是 maven的依赖传递

自动配置

我们要进行事务管理、要进行AOP程序的开发,此时就不需要我们再去手动的声明这些 bean对象了,我们直接使用就可以从而大大的简化程序的开发,省去了繁琐的配置操作。

配置类也是springioc容器当中的一个bean对象

我们在引入第三方依赖的时候,该依赖中会有一些bean,但是有时候我们注入的时候并不会找到该bean对象,是因为springboot扫描的时候没有扫描到该依赖的包,是因为 我们在添加@componet注解声明bean对象的时候,需要保证注解能被spring的组件扫描到,需要用@componentscan注解手动扫描该依赖,但是这样太繁琐了

所以我们用import引入

@import注解导入普通类

import导入配置类

也是相同的方法 import中写入配置类的class文件

我们使用这种方式还得引入配置类的class文件,但是当引用的配置类较多的时候比较繁琐

所以 我们直接让 第三方依赖来指定配置的bean

比较常见的方案就是第三方依赖给我们提供一个注解,这个注解一般都以@EnableXxxx开头的注 解,注解中封装的就是@Import注解

源码跟踪

在启动类注解 @springbootapplication 中

包含如下注解

我们先来看第一个注解   @springbootconfiguretion

里面包含了@configuration 说明springboot启动类就是一个配置类

再看@componentscan注解

@ComponentScan注解是用来进行组件扫描的,扫描启动类所在的包及其子包下所有被 @Component及其衍生注解声明的类。

再看最核心的

@EnableAutoConfiguration注解

AutoConfigurationImportSelector类中重写了ImportSelector接口的selectImports()方法

然后重写了selectimports方法 ,用AutoConfigurationEntry()方法通过调用 getCandidateConfigurations(annotationMetadata, attributes)方法获取在配置文 件中配置的所有自动配置类的集合

getCandidateConfigurations方法的功能: 获取所有基于METAINF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imp orts文件、META-INF/spring.factories文件中配置类的集合

自动配置源码小结

自动配置原理源码入口就是@SpringBootApplication注解,在这个注解中封装了3个注解,分别 是: @SpringBootConfiguration 声明当前类是一个配置类 @ComponentScan 进行组件扫描(SpringBoot中默认扫描的是启动类所在的当前包及其子包) @EnableAutoConfiguration 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类) 在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中METAINF/spring.factories、METAINF/spring/org.springframework.boot.autoconfigure.AutoConfigurat ion.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。 当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定 名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器 中,交给IOC容器管理。

而在INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imp orts中定义的配置类非常的多,每个配置类有很多的bean 都会注入到ioc容器吗,并不会,回一个@conditional注解可以按照条件装配,

@Conditional本身是一个父注解,派生出大量的子注解: @ConditionalOnClass:判断环境中有对应字节码文件,才注册bean到IOC容器。 @ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册 bean到IOC容器。 @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三氧化真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值