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 Boot | Spring Boot |
配置文件 | 全JAVA文件,少量配置 |
外部部署 | 内置服务器容器 |
第三方依赖复杂引入 | 傻瓜式引入第三方组件 |
1.4 运行你的Spring Boot程序
- 通过IDEA运行main方法
- maven插件运行:
mvn spring-boot:run
,需要添加spring-boot-maven-plugin
到我们的pom.xml文件中 - 创建可执行的jar,需要添加
spring-boot-maven-plugin
- 打包命令:mvn package
- 执行命令: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中通用的约定
- 注解扫描的包目录basePackage为启动类Main函数入口所在的包路径
- 配置文件约定是classpath目录下的application.yml或者application.properties
- web开发的静态文件放在classpath,访问的顺序依次是:/META-INF/resources -> resources -> static -> public
- web开发中页面模板,约定放在classpath目录,/templates目录下
2 系统配置自动装配
2.1 @SpringBootApplication注解
这个注解相当于三个注解的功能集成
@EnableAutoConfiguration:启用Spring Boot的自动bean加载机制
@ComponentScan:在应用程序所在的包上启用扫描
默认的包结构及其作用
- 主程序Application.java放在根包,在其他类之上
- @SpringBootApplication注解写在主程序上
- 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 | 应用中不包含某个类时,对应的配置才生效 | |
@ConditionalOnBean | Spring容器中存在指定class的实例对象时,对应的配置才生效 | |
@ConditionalOnMissingBean | Sping容器中不存在指定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是什么机制?
- Spring配置文件提供的一种隔离应用程序配置的方法,使其仅在特定环境中可用
- 可通过profile指定Bean的应用环境(如开发、测试、生产等环境)
- 可通过profile指定不同环境的配置参数值
- 如何指定profile?
通过配置参数spring.profiles.active来指定应用启用的profiles。默认default
- 在环境变量中指定:jvm参数、命令行参数、application.properties中都可以
- 代码中指定:springApplication.setAdditionalProfiles(“dev,test”);
- 如何在开发中使用?
- Configuration类或者Bean定义方法上,都可以通过添加@Profile(“dev”)注解,实现指定环境下生效
- 配置文件中:<beans pfofile=“dev”><bean…></beans>
2.6 配置文件
- 配置文件可以存放在哪些位置?
- 当前项目运行的盘符/config文件夹下面:file:./config/
- 当前项目运行的目录下面:file:./
- classpath下面的config文件夹:classpath:./config
- classpath的根目录:classpath:/
- 上述配置文件按优先级排列,排在上面的位置会覆盖优先级降低的配置。
- 自定义配置名称和存储路径
- spring.config.name(spring_config_name)=properties.file-name
- spring.config.location(spring_config_location)=classpath:/config/,file:./config
- 必须将它们定义为环境属性,通常是操作系统环境变量,JVM参数或命令行参数。
2.7 参数使用
- 通过@Value("${my.name}")注解,将制定的参数配置注入到属性中
- 注入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");
}
}
- 通过注解@ConfigurationProperties(prefix=“my”),将注解加在指定的类上,spring会为实例对象的属性进行赋值,属性需有getters和setters方法
参考文章
结语
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~