6.1 基本配置
6.1.1 入口类和@SpringBootApplication
Spring Boot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法其实就是一个标准的Java应用的入口方法。在main方法中使用SpringApplication.run(Ch522Application.class,args),启动Spring Boot应用项目。
@SpringBootApplication是Spring Boot的核心注解,是一个组合注解。源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@SpringBootApplication注解主要组合了@Configuration、@EnableAutoConfiguration、@ComponentScan;若不使用@SpringBootApplication注解,则可以在入口类上直接使用@Configuration、@EnableAutoConfiguration、@ComponentScan。
其中,@EnableAutoConfiguration让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置。
6.1.2 关闭特定的自动配置
@SpringBootApplication的源码我们可以看出,关闭特定的自动配置应该使用@SpringBootApplication注解的exclude参数,例如:
@SpringBootApplication(exclude ={DataSourceAutoConfiguration.class})
6.1.3 定制Banner
1.修改Banner
(1)在Spring Boot启动的时候会有一个默认启动图案
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
(2)我们在src/main/resources下新建一个banner.txt。
(3)通过 http://patorjk.com/software/taag 网站生成字符,如敲入的为“KK”,将网站生成的字符复制到banner.txt中。
2.关闭banner
(1)main里的内容修改为:
SpringApplication app = new SpringApplication(Ch522Application.class);
app.setShowBanner(false);
app.run(args);
6.1.4 Spring Boot的配置文件
Spring Boot使用一个全局的配置文件application.properties或application.yml,放置在src/main/resources目录或者类路径的/config下。
6.1.5 starter pom
Spring Boot为我们提供了简化企业级开发绝大多数场景的starter pom,只要使用了应用场景所需要的starter pom,相关的技术配置将会消除,就可以得到Spring Boot为我们提供的自动配置的Bean。
例如:
名称 | 描述 |
---|---|
spring-boot-starter | spring boot核心starter,包含自动配置,日志,yaml配置文件的支持 |
spring-boot-starter-aop | 使用spring-aop和AspectJ支持面向切面编程 |
6.1.6 使用xml配置
Spring Boot提倡零配置,即无xml配置,但是在实际项目中,可能有一些特殊要求你必须使用xml配置,这时我们可以通过Spring提供的@ImportResource来加载xml配置。
例如:
@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"})
6.2 外部配置
Spring Boot允许使用properties文件、yaml文件或者命令行参数作为外部配置。
6.2.1 命令行参数配置
Spring Boot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行:
java -jar xx.jar
可以通过命令修改Tomcat端口号
java -jar xx.jar --server.port=8090
6.2.2 常规配置
在Spring Boot里,我们只需在application.properties定义属性,直接使用@Value注入即可。
示例
(1)application.properties增加属性:
book.author=zzj
book.name=spring boot
(2)修改入口类
package com.wisely.ch5_2_2;
@RestController
@SpringBootApplication
public class Ch522Application {
@Value("${book.author}")
private String bookAuthor;
@Value("${book.name}")
private String bookName;
@RequestMapping("/")
String index() {
return "book name is:"+bookName+" and book author is:" + bookAuthor;
}
public static void main(String[] args) {
SpringApplication.run(Ch522Application.class, args);
}
}
6.2.3 类型安全的配置(基于properties)
上例中使用@Value注入每个配置在实际项目中会显得格外麻烦,因为我们的配置通常会是许多个,若使用上例的方式则要使用@Value注入很多次。
Spring Boot还提供了基于类型安全的配置方式,通过@ConfigurationProperties将properties属性和一个Bean及其属性关联,从而实现类型安全的配置。
示例
(1)新建spring boot项目
(2)添加配置,application.properties
author.name=zzj
author.age=20
(3)类型安全的Bean,代码如下:
package com.wisely.ch6_2_3.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Component
@ConfigurationProperties(prefix = "author") //1
public class AuthorSettings {
private String name;
private Long age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
}
①通过@ConfigurationProperties加载properties文件内的配置,通过prefix属性指定properties的配置的前缀,通过locations指定properties文件的位置,例如:
@ConfigurationProperties(prefix = "author",locations = {"classpath:config/author.properties"})
(4)检验代码
package com.wisely.ch6_2_3;
@RestController
@SpringBootApplication
public class Ch623Application {
@Autowired
private AuthorSettings authorSettings; //1
@RequestMapping("/")
public String index(){
return "author name is "+ authorSettings.getName()+" and author age is "+authorSettings.getAge();
}
public static void main(String[] args) {
SpringApplication.run(Ch623Application.class, args);
}
}
6.3 日志配置
Spring Boot支持Java Util Logging、Log4J、Log4J2和Logback作为日志框架,无论使用哪种日志框架,Spring Boot已为当前使用日志框架的控制台输出及文件输出做好了配置。
logging.file=/logs/mylog 日志文件名
logging.level.org.springframework=DEBUG 日志级别
6.4 Profile 配置
Profile是Spring用来针对不同的环境对不同的配置提供支持的,全局Profile配置使用application-{profile}.properties(如application-prod.properties)。
通过在application.properties中设置spring.profiles.active=prod来指定活动的Profile。
6.5 Spring Boot运行原理
Spring Boot关于自动配置的源码在spring-boot-autoconfigure-1.3.0.x.jar内。
6.5.1 运行原理
关于Spring Boot的运作原理,我们还是回归到@SpringBootApplication注解上来,这个注解是一个组合注解,它的核心功能是由@EnableAutoConfiguration注解提供的。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({ EnableAutoConfigurationImportSelector.class, AutoConfigurationPackages.Registrar.class })
public @interface EnableAutoConfiguration {
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
这里的关键功能是@Import注解导入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包。