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容器。