# SpringBootInAction **Repository Path**: kassadin/springbootinaction ## Basic Information - **Project Name**: SpringBootInAction - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-05-04 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot In Action Spring Boot 比较重要的四个核心内容: 1. 自动配置:针对常见应用,自动处理相关配置 2. 起步依赖:告诉 Spring Boot 需要什么功能,它就能自动引入,并处理好版本 3. 命令行界面:作为 IDE 党,我感觉有点儿鸡肋,依然认为没有 IDE 的话 Java 开发没法玩 4. Actuator: 深入运行中的 Spring 应用,一探究竟 从根本上来说, Spring Boot的项目只是普通的Spring项目,只是它们正好用到了Spring Boot的起步依赖和自动配置而已。 Spring Boot没有引入任何形式的代码生成,而是利用了Spring 4的条件化配置特性,以及Maven和Gradle提供的传递依赖解析,以此实现Spring应用程序上下文里的自动配置。 简而言之,从本质上来说,Spring Boot就是Spring,它做了那些没有它你自己也会去做的Spring Bean配置。 在 `org.springframework.boot.autoconfigure` 下你能找到各种自动化配置的类,简单讲就是通过条件配置,如果 classpath 下包含 JdbcTemplate,就自动创建对应的 bean,如果包含数据库驱动就自动创建 `DataSource`,因为你引用他们就是为了这么做的,Spring Boot 进一步消除了模板代码。 ```java @Configuration @ConditionalOnClass({ DataSource.class, JdbcTemplate.class }) @ConditionalOnSingleCandidate(DataSource.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class JdbcTemplateAutoConfiguration { private final DataSource dataSource; public JdbcTemplateAutoConfiguration(DataSource dataSource) { this.dataSource = dataSource; } @Bean @Primary @ConditionalOnMissingBean(JdbcOperations.class) public JdbcTemplate jdbcTemplate() { return new JdbcTemplate(this.dataSource); } @Bean @Primary @ConditionalOnMissingBean(NamedParameterJdbcOperations.class) public NamedParameterJdbcTemplate namedParameterJdbcTemplate() { return new NamedParameterJdbcTemplate(this.dataSource); } } ``` ## 2. 第一个应用 简单的使用 Spring Initializr 生成初始化项目即可运行。但我这里连接不上,费了番功夫自己编译了一个,见底部链接。 入口类使用了 `@SpringBootApplication` 注解,了解 Spring 注解的话就比较容易理解,简化了必备的注解 1. Spring的@Configuration:Java 配置类,替代 XML 配置 2. Spring的@ComponentScan:启用组件扫描,自动注册 Bean 3. Spring Boot 的 @EnableAutoConfiguration : 开启了 Spring Boot 自动配置 ```java @SpringBootApplication public class Application {} @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {} ``` ## 3. 自定义配置 加入 security 后直接开跑,用户名 user, 密码在控制台 ```xml org.springframework.boot spring-boot-starter-security Using default security password: 8f9c396c-a311-4da0-84d5-860058867703 ``` ### 微调 Spring Boot能从多种属性源获得属性,包括如下几处。 (1) 命令行参数 (2) java:comp/env里的JNDI属性 (3) JVM系统属性 (4) 操作系统环境变量50 第 3 章 自定义配置 (5) 随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random.long}) (6) 应用程序以外的application.properties或者appliaction.yml文件 (7) 打包在应用程序内的application.properties或者appliaction.yml文件 (8) 通过@PropertySource标注的属性源 (9) 默认属性 这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。 application.properties和application.yml文件能放在以下四个位置。 (1) 外置,在相对于应用程序运行目录的/config子目录里。 (2) 外置,在应用程序运行的目录里。 (3) 内置,在config包内。 (4) 内置,在Classpath根目录。 ### 在一个 Bean 里搜集属性 @EnableConfigurationProperties 从配置中注入属性,无需添加,自动开启 ```java @Component @ConfigurationProperties("site") public class SiteConfig { private String name; private String desc; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } ``` ### Profile 配置中通过 spring.profiles.active 激活对应 profile #### 使用特定于Profile的属性文件 遵循application-{profile}.properties这种命名格式,这样就能提供特定于Profile的属性了。 公共或者默认配置依然可以放在 application.properties 配置中。 #### yaml 配置则可以放在同一个文件中,通过 --- 分割即可 ### 定制错误页面 Spring Boot会为错误视图提供如下错误属性。  timestamp:错误发生的时间。  status: HTTP状态码。  error:错误原因。  exception:异常的类名。  message:异常消息(如果这个错误是由异常引起的)。  errors: BindingResult异常里的各种错误(如果这个错误是由异常引起的)。  trace:异常跟踪信息(如果这个错误是由异常引起的)。  path:错误发生时请求的URL路径。 覆盖自动配置其实很简单,就是显式地编写那些没有Spring Boot时你要做的Spring配置。Spring Boot的自动配置被设计为优先使用应用程序提供的配置,然后才轮到自己的自动配置。 ## Else ### Spring Initializr 连接不上 ### Spring Boot Gradle 多 module 配置 https://spring.io/guides/gs/multi-module/ https://github.com/leon/springboot-multiproject