目录
配置文件(方式)
三种配置文件优先级排名(从高到低)
1. properties配置文件
2. yml配置文件
3. yaml配置文件
另外两种配置方式
Java系统属性配置 (低)(格式: -Dkey=value)
命令行参数 (高)(格式:--key=value)
优先级
命令行参数 > 系统属性参数 > properties参数 > yml参数 > yaml参数
思考
项目已经打包上线了,这个时候我们又如何来设置Java系统属性和命令行参数呢?
在项目所在文件中敲cmd,进入命令窗口java -Dserver.port=9000 -jar XXXXX.jar --server.port=10010
注意事项
Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目,会自动添加该插件)
Bean管理
引入管理其他依赖时一定要先获取
一定要先声明这个,才能引入其他依赖 通过.getBean获取bean
@Autowired
private ApplicationContext applicationContext;
1. 从IOC容器中获取到bean对象
根据name获取bean
Object getBean(String name)
//bean对象.getBean("本类的首字母小写全名")
根据类型获取bean
<T> T getBean(Class<T> requiredType)
//bean对象.getBean(本类全名.class)
根据name,类获取bean(带类型转换)
<T> T getBean(String name, Class<T> requiredType)
//bean对象.getBean("本类的首字母小写全名",本类全名.class)
2. bean的作用域(了解,一般不用配置,默认单例)
Spring中的@Scope注解来进行配置作用域
@Scope("作用域属性")
作用域配置
singleton
IOC容器中名称的bean只有一个单例(默认),在容器启动时被创建
prototype
每次使用该bean时会创建新的实例(非单例)
控制器(了解)
@Lazy //延迟加载
第一次使用bean对象时,才会创建bean对象并交给ioc容器管理
3. 管理第三方的bean对象
先在pom.xml文件中,引入dom4j
<!--Dom4j-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
原因
第三方提供的类是只读的。无法在第三方类上添加@Component注解或衍生注解
@Bean注解
管理的bean对象来自于第三方(不是自定义的)
解决方案
在启动类上添加@Bean标识的方法
不建议使用(项目中要保证启动类的纯粹性)
@Bean方法上,方法的返回值就是Bean的类型,方法名默认是Bean的name
在配置类中定义@Bean标识的方法
定义一个配置类
@Configuration //配置类 (在配置类当中对第三方bean进行集中的配置管理)
public class CommonConfig {//声明第三方bean
@Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
//通过@Bean注解的name/value属性指定bean名称, 如果未指定, 默认是方法名
public SAXReader reader(DeptService deptService){
System.out.println(deptService);
return new SAXReader();
}}
从config中引入第三方Bean
@Autowired
private SAXReader saxReader;
@Autowired
private ApplicationContext applicationContext;
//使用原始默认的Bean的名字 ,首字母小写
@Test
public void testBean(){
Object saxReader = applicationContext.getBean("saxReader");
System.out.println(saxReader);
}
当想在第三方Bean中注入其他Bean,直接在第三方Bean的方法参数中引入(Bean的类名 空格 首字母小写类名 )
注意事项
通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
SpringBoot原理
Spring Framework:繁琐(依赖,配置)
Spring Boot(底层还是SpringFramework):简单快捷
起步依赖
原理就是Maven的依赖传递。
所有的常见依赖(官网地址:https://docs.spring.io/spring-boot/docs/2.7.7/reference/htmlsingle/#using.build-systems.starters)。
web开发的起步依赖:springboot-starter-web
官方或者第三方,把一个具体功能所需要的所有坐标依赖及版本进行统一管理,只需要引入starter的坐标即可
自动配置
SpringBoot项目在启动时通过自动配置完成了bean对象的创建,并放入IOC容器中
方案
方案1:@ComponentScan 组件扫描
1. 使用繁琐
2. 性能低
方案2:@Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)
导入形式
普通类
配置类
ImportSelector接口实现类
其类中重写接口中的方法,方法中写的是返回值是要成为bean的权限定类名
结论
我们不用自己指定要导入哪些bean对象和配置类了,让第三方依赖它自己来指定
第三方依赖中提供的注解
1.使用第三方依赖提供的 @EnableXxxxx注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
public @interface EnableHeaderConfig {
}
2.在使用时只需在启动类上加上@EnableXxxxx注解即可
原理
@SpringBootApplication
@EnableAutoConfiguration
@Import导入了一个实现ImportSelector接口的类
有selectImports方法--读取jar包中META-INF/spring/xxxxxxx.imports文件的内容
文件内容是需要自动配置的Bean的全类名,通常是配置类
配置类里的所有@Bean方法也同时放入容器了
原理分析
SpringBoot启动类上使用的核心注解@SpringBootApplication
元注解(不再解释)
@SpringBootConfiguration
声明当前类是一个配置类
@SpringBootConfiguration注解上使用了@Configuration,表明SpringBoot启动类就是一个配置类。
@EnableAutoConfiguration
封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)
在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。
@ComponentScan
用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。
@Conditional
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring的IOC容器中。
位置:方法、类
本身是父注解,派生的子注解:
@ConditionalOnClass(name=""):判断环境中有对应字节码文件,才创建bean到IOC容器。
@ConditionalOnMissingBean(name=""):判断环境中没有对应的bean(类型或名称),不存在才创建bean到IOC容器。
@ConditionalOnProperty(name ="",havingValue = ""):判断配置文件中有对应属性和值,决定是否创建bean到IOC容器。
自定义起步依赖starter分析
1. starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])
2. autoconfigure模块(自动配置)
实现步骤
第1步:创建自定义starter模块(进行依赖管理)
把阿里云OSS所有的依赖统一管理起来
第2步:创建autoconfigure模块
在starter中引入autoconfigure (我们使用时只需要引入starter起步依赖即可)
第3步:在autoconfigure中完成自动配置
1. 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好
2. 定义配置文件,把自动配置类的全类名定义在配置文件中