SpringBoot详细整理必看
SpringBoot是一个自动配置,开箱即用的生产级的基于Spring的应用程序,无需繁琐的配置文件,即可搭建Web环境,将每个组件封装为各类启动器,需要用时则添加。只需很少的配置,可以修改默认配置
Starters
在我们初始入门时候都会快速体验使用如下pom.xml文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>版本号</version>
</parent>
这是一个父级启动器,SpringBoot 中含有大量 Starters,你可以获取所有服务组件。SpringBoot 官方提供的Starters 以 spring-boot-starter-*
命名
main类
SpringBoot 在配置完父级 Starter 后,提供一个含有 @EnableAutoConfiguration
的注解的类,我们应该将该类放置在你的应用代码所在包的上层包
中。SpringBoot会将该注解的类下所有包都进行扫描,以找到所有的 @ComponentScan
,@Service
等注解
在主配置类上配置
@ComponentScan
注解,它会将该类所在包以下的所有含有@Service
,@Component
等注解的bean注入到容器中
添加自动配置类注解@Configuration
@Configuration
标注的类会把方法返回的bean注入到容器中,其实不用**@Configuration标注的类中如果方法都由@Bean
注解标注,那么也是可以将这些bean注入容器中的,加不加@Configuration注解区别在于加了@Configuration**的类中的方法被其他方法执行过一次后即会被注入带容器中,不用再次注入
@Configuration
public class MyConfig {
@Bean
public BeanOne one(){
return new BeanOne(1);
}
@Bean
public BeanTwo two(){
one();
return new BeanTwo(2);
}
}
这是一个自定义的配置类,用于向容器注入两个bean,其中two()方法内执行了one() 方法
public class BeanOne {
private int id;
public BeanOne(int id){
System.out.println("BeanOne初始化...");
this.id = id;
}
}
public class BeanTwo {
private int id;
public BeanTwo(int id){
System.out.println("BeanTwo初始化...");
this.id = id;
}
}
如果加了 @Configuration 注解,BeanOne只执行一次初始化,否则会执行两次初始化。而且加@Configuration注解明显标志这个bean为配置bean
@SpringBootApplication
在上述中主配置类上配置了@Controller
,@EnableAutoConfiguration
,@ComponentScan
三个注解,可以使用@SpringBootApplication
来替换这三个注解,它们的功能等价
运行程序jar包
在pom.xml配置文件中添加插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTqw2uTc-1589626159811)
点执行package
或执行mvn package
命令,就可以在target目录下看到***-0.0.1-SNAPSHOT.jar**文件,执行java -jar *-0.0.1-SNAPSHOT.jar
就可以运行jar程序
配置文件
配置文件可以是 properties
,也可以是 yaml
配置文件位置:
- file:./config/
- file:./
- classpath:/config/
- classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的相同配置;不同的配置间互不影响,四处的文件都可以被读取,进行互补配置
配置文件取值
当在application.yml中配置了:
name: ${random.value}
在bean中的属性上使用@Value
注解
public class BeanOne {
@Value("${name}")
private String name;
这样在取出BeanOne时,就会将看到name属性已经有一个随机值了
使用@ConfigurationProperties
注解指定前缀 prefix = “app”
@ConfigurationProperties(prefix = "app")
@Component
public class BeanProperties {
String name;
boolean gender;
List<String> list;
Map<String,Object> map;
BeanOne one;
//setter and getter
对应的配置文件:
app:
name: 张三
gender: true
list:
- hello
- haha
map:
abc: 123
dfg: 456
thu: 789
one:
name: ${random.value}
@ConfigurationProperties
注解也可以用在返回一个bean的public @Bean方法上,从环境中取出值赋给返回的bean
@ConfigurationProperties(prefix = "beanvalue")
@Bean
public BeanValue beanValue(){
...
}
在类上指定注解@PropertyResource,使用指定位置的配置文件取值
@PropertyResource(value = {"classpath:app.yml"})
@ConfigurationProperties(prefix = "app")
@Component
public class BeanProperties {
@Profile
Spring Profiles 提供了一种分离应用程序配置的方法,在指定的环境才能使用指定的配置文件。
任何配置类无论是标注了 @Configuration
注解还是标注了 @Component
注解等,都可以在类上标注 @Profile
注解,指明该配置类只有该环境才能被加载使用
@Configuration
@Profile("one")
//@Component
public class MyConfig {
spring:
profiles:
active: one
Web开发
自动配置
SpringBoot为Spring MVC
提供了大量的自动配置 auto-configuration
,SpringBoot在原来Spring MVC的基础上开启了以下配置
- 引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。
- 对静态资源的支持,包括对WebJars的支持。
- 自动注册Converter,GenericConverter,Formatter beans。
- 对HttpMessageConverters的支持。
- 自动注册MessageCodeResolver。
- 对静态index.html的支持。
- 对自定义Favicon的支持。
- 自动使用ConfigurableWebBindingInitializer bean。
如果想我们自己再配置其他MVC配置,例如配置一个拦截器。只需在你的Configuration类里注入一个WebMvcConfigurerAdapter
并且不使用 @EnableWebMvc
注解
@Configuration
public class MvcConfig {
@Bean
public WebMvcConfigurerAdapter mvcIntercepted() {
return new WebMvcConfigurerAdapter() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(new MyInterceptor());
}
};
}
}
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if("/hello".equals(request.getServletPath())){
System.out.println("拦截器拦截到hello请求");
return false;
}
return true;
}
}
当发送/hello请求时,拦截器会拦截该请求,并打印消息
WebMvcConfigurerAdapter 被Spring弃用了,可以让配置bean 实现
WebMvcConfigurer
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}