Spring Boot系统配置自动装载

1 Spring Boot设计理念

1.1 Spring Boot介绍

Spring Boot对Spring平台和第三方库进行了整合,可创建可以运行的、独立的、生产级的基于Spring的应用程序。(大多数Spring Boot应用程序只需要很少的Spring配置)
Spring Boot可以使用java -jar或更传统的war部署启动的java应用程序进行创建,可以内嵌Tomcat、Jetty、Undertow容器,快速启动web程序。

1.2 设计目标
  • 为所有Spring开发提供更快且可通用的入门体验
  • 开箱即用,可以根据需求快速调整默认值
  • 提供大型项目(例如嵌入式服务器、运行状况检查和统一配置)通用的一系列非功能性功能
  • 绝对没有代码生成,也不需要XML配置
1.3 Spring Boot优势
传统开发方式快速构建方式
非Spring BootSpring Boot
配置文件全JAVA文件,少量配置
外部部署内置服务器容器
第三方依赖复杂引入傻瓜式引入第三方组件
1.4 运行你的Spring Boot程序
  1. 通过IDEA运行main方法
  2. maven插件运行:mvn spring-boot:run,需要添加spring-boot-maven-plugin到我们的pom.xml文件中
  3. 创建可执行的jar,需要添加spring-boot-maven-plugin
    1. 打包命令:mvn package
    2. 执行命令:java -jar xxx.jar
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
1.5 编写你的程序
@SpringBootApplication
public class Example{
	public static void main(String[] args){
		SpringApplication.run(Example.class, args);
	}
}

Spring Boot中通用的约定

  1. 注解扫描的包目录basePackage为启动类Main函数入口所在的包路径
  2. 配置文件约定是classpath目录下的application.yml或者application.properties
  3. web开发的静态文件放在classpath,访问的顺序依次是:/META-INF/resources -> resources -> static -> public
  4. web开发中页面模板,约定放在classpath目录,/templates目录下

2 系统配置自动装配

2.1 @SpringBootApplication注解

这个注解相当于三个注解的功能集成
@EnableAutoConfiguration:启用Spring Boot的自动bean加载机制
@ComponentScan:在应用程序所在的包上启用扫描

默认的包结构及其作用

  1. 主程序Application.java放在根包,在其他类之上
  2. @SpringBootApplication注解写在主程序上
  3. Spring对类的扫描默认仅涵盖主程序所在的包及子包
2.2 零Spring配置文件

SpringBoot中建议放弃通过XML定义Spring应用程序,推荐在代码类上面通过@Configuration实现配置。
如有需要,还可以通过@ImportResource类导入xml配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmls="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans"
	 http://springframework.org/schema/beans/spring-beans.xsd>
	<bean id="exampleBean" class="examples.ExampleBean"/>
	<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
</beans>

替换为下面的代码

@Configuration
public class AppConfig{
	@Bean
	public ExampleBean example(){
		return new ExampleBean();
	}
}

注:要使@Configuration生效,你需要将它写在SpringBoot入口程序类上面,或者使用@EnableAutoConfiguration或@SpringBootApplication这两个注解来开启自动加载功能。

2.3 个性化加载配置
类型配置说明
条件依赖@ConditionalOnClass应用中包含某个类时,对应的配置才生效
@ConditionalOnMissingClass应用中不包含某个类时,对应的配置才生效
@ConditionalOnBeanSpring容器中存在指定class的实例对象时,对应的配置才生效
@ConditionalOnMissingBeanSping容器中不存在指定class的实例对象时,对应的配置才生效
@ConditionalOnProperty指定参数的值符合要求时,对应的配置才生效
@ConditionOnResource指定文件资源存在时,对应的配置才生效
@ConditionalOnWebApplication当前处于web环境时(WebApplicationContext),对应的配置才生效
@ConditionalOnNotWebApplication当前处于非web环境时,对应的配置才生效
@ConditionalOnExpression指定参数的值符合要求时,对应的配置才生效,和ConditionalOnProperty的区别在于这个注解使用springEL表达式
先后顺序@AutoConfigureAfter在指定的Configuration类之后加载
@AutoConfigureBefore在指定的Configuration类之前加载
@AutoConfigureOrder指定该Configuration类的加载顺序,默认值0
2.4 外部参数配置信息加载

Spring应用程序可以通过属性文件,YAML文件,环境变量和命令行参数等方式的外部化参数配置

  • 启动时命令行传参 java -jar app.jar --name="test"
  • SpringBoot配置信息中的特殊值SPRING_APPLICATION_JSON='{"name":"test"}'
  • 如果是web应用,可以读取ServletConfig init参数
  • 如果是web应用,可以读取ServletContext init参数
  • JNDI属性来自java:comp/env
  • Java系统属性(System.getProperties())
  • 操作系统环境变量
  • 配置文件application.properties、application.yml、application-{profile}.properties、application-{profile}.yml
  • @PropertySource注解导入的配置 @PropertySource(value={“person.properties”})
  • 程序入口通过SpringApplication.setDefaultProperties方法设定的参数配置
public static void main(String[] args){
	SpringApplication springApplication = new SpringApplication(Example.class, args);
	springApplication.setAddicationProfiles();
	Properties properties = new Properties();
	properties.setProperty("names", "study");
	springApplication.setDefaultProperties(properties);
	springApplication.run(args);
}
2.5 环境化配置 - profile
  • profile是什么机制?
  1. Spring配置文件提供的一种隔离应用程序配置的方法,使其仅在特定环境中可用
  2. 可通过profile指定Bean的应用环境(如开发、测试、生产等环境)
  3. 可通过profile指定不同环境的配置参数值
  • 如何指定profile?

通过配置参数spring.profiles.active来指定应用启用的profiles。默认default

  1. 在环境变量中指定:jvm参数、命令行参数、application.properties中都可以
  2. 代码中指定:springApplication.setAdditionalProfiles(“dev,test”);
  • 如何在开发中使用?
  1. Configuration类或者Bean定义方法上,都可以通过添加@Profile(“dev”)注解,实现指定环境下生效
  2. 配置文件中:<beans pfofile=“dev”><bean…></beans>
2.6 配置文件
  • 配置文件可以存放在哪些位置?
  1. 当前项目运行的盘符/config文件夹下面:file:./config/
  2. 当前项目运行的目录下面:file:./
  3. classpath下面的config文件夹:classpath:./config
  4. classpath的根目录:classpath:/
  5. 上述配置文件按优先级排列,排在上面的位置会覆盖优先级降低的配置。
  • 自定义配置名称和存储路径
  1. spring.config.name(spring_config_name)=properties.file-name
  2. spring.config.location(spring_config_location)=classpath:/config/,file:./config
  3. 必须将它们定义为环境属性,通常是操作系统环境变量,JVM参数或命令行参数。
2.7 参数使用
  1. 通过@Value("${my.name}")注解,将制定的参数配置注入到属性中
  2. 注入Environment对象
//伪代码,注入env对象
@Autowired
Environment environment;

//使用实例
environment.getProperty("name");
@RestController
public class HelloWorldController{
	@Autowired
	Environment environment;

	@RequestMapping("/index")
	public String index(){
		return environment.getProperty("name");
	}

	@RequestMapping("/test-errorpage")
	public String errorpage(){
		int i = 1 / 0;
		return environment.getProperty("name");
	}
}
  1. 通过注解@ConfigurationProperties(prefix=“my”),将注解加在指定的类上,spring会为实例对象的属性进行赋值,属性需有getters和setters方法
参考文章

网易云课堂《Java高级开发工程师》

结语

本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值