配置优先级
支持三种格式的配置文件
server.port=8081 --application.properties
server:
port: 8082 --application.yml
server:
port: 8083 --application.yaml
优先级为properties>yml>yaml
开发时,推荐统一使用一种格式的配置(yml是主流)
java系统属性(优先级高于上三种)
-Dserver.port=9000
命令行参数(优先级高于java系统属性)
--server.port=10010
这两项在eidtconfiguration中VM options为java系统属性 Program arguments为命令行参数
1执行maven打包指令package
2执行java指令,运行jar包
java -Dserver.port=9000 -jar tlias-web-management.jar --server.port=10010
springboot项目打包时,需引入插件spring-boot-maven-plugin"(基于官网骨架创建项目,会自动添加该插件)
Bean管理
获取bean
默认情况下,spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean
方式:
根据name获取bean: Object getBean(String name)
根据类型获取bean:<T> T getBean(Class<T> requiredType)
根据name获取bean(带类型转换):<T> T getBean(String name,Class<T> requireType)
@Autowired
private ApplicationContext applicationContext;//IOC容器对象
@Test
public void testGetBean(){
//根据bean的名称获取(填入需要的bean对象类名 首字母小写)
DeptController bean1= (DeptController) applicationContext.getBean("deptController");
//根据bean的类型获取
DeptController bean2=applicationContext.getBean(DeptController.class);
//分局bean的名称及类型获取
applicationContext.getBean("DeptController",DeptController.class);
bean作用域
作用域 说明
singleton 容器内 同名称 bean 只有一个实例(单例)(默认)
prototype 每次使用该 bean 时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web环境中,了解)
session 每个会话范围内会创建新的实例(web环境中,了解)
application 每个应用范围内会创建新的实例(web环境中,了解)
可以通过@Scope注解来配置作用域
@Scope("prototype")
默认singleton中的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)
prototype的bean,每一次使用该bean的时候都会创建一个新的的实例
实际开发中,绝大部分的bean是单例的,也就是说绝大部分bean不需要配置scope属性
第三方bean
@Bean
如果要管理的bean对象来自与第三方(不是自定义的),是无法使用@Component及衍生注解声明bean的,需要用@Bean注解
若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类
通过@Bean注解的name/value属性指定bean名称,如果未指定,默认是方法名
如果第三方bean需要依赖其他的bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配
//启动类中,不建议
@Bean//将方法返回值交给IOC容器管理,成为IOC容器的bean对象
public ASXReader(){
return new SAXReader();
}
//集中分配,推荐
@Configuration//配置类
public class CommonConfig{
@Bean
public SAXReader saxReader(){
return new SAXReader();
}}
项目中自定义的,使用@Component及其衍生注解
项目中引入第三方的,使用@Bean注解
SpringBoot原理
spring framework
繁琐(依赖,配置)
spring boot
简单,快捷(起步依赖,自动配置)
起步依赖原理
自动配置
当spring容器启动后,一些配置类,bean对象就自动存入到了IOC容器中,不需要我们手动去声明,省去了繁琐的配置操作
自动配置原理
使用
方案一:@ComponentScan组件扫描 //放入需要扫描的包
方案二:@Import导入。使用@Import导入的类会被Spring加载到IOC容器中,
导入 普通类
导入 配置类
导入 ImportSelector 接口实现类
@EnableXxxx注解,封装@Import注解 方便
源码跟踪
@SpringBootApplication是springboot中最重要的注解(三部分组成)
@SpringBootConfiguration:与@Configuration注解作用相同,声明当前也是一个配置类
@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包
@EnableAutoConfiguration:SpringBoot实现自动化配置的注解
@Conditional
作用:按照一定条件进行判断,在满足给定的条件后才会注册对应的bean对象到Spring IOC容器中
位置:方法,类
@Conditional本省是一个父注解,派生出大量的子注解:
@ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型或名称),才注册bean到IOC容器中
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。
案例(自定义starter)
实际开发中,经常定义一些公共组件,提供团队使用。在SpringBoor的项目中,一般将这些公共组件封装为SpringBoot 的starter。
新建module两个spring-boot项目
starter的pom.xml中引入autoconfigure项目
autoconfig中引入阿里云oss的依赖
autoconfig中写入需要的java文件
autoconfig中新建自动配置类alt+insert生成get,set方法
在aliyun-oss-spring-boot-autoconfigure模块中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxx.imports