跳至主要內容

Spring Boot

HeChuangJun约 562 字大约 2 分钟

Spring Boot优缺点?

快速构建项目:通过IDEA或者官方的Spring Initializr
自动配置:提供Starter,对主流框架的无配置集成
项目独立运行:内嵌servlet容器,Tomcat、Jetty、Undertow

Spring Boot如何解决跨域问题?

@Configuration
public class CorsConfig implements WebMvcConfigurer {
  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
      .allowedOrigins("*")
      .allowCredentials(true)
      .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
      .maxAge(3600);
  }
}

Spring Boot自动配置原理、@EnableAutoConfiguration实现原理?如何自定义Starter?

@SpringBootApplication注解包含@EnableAutoConfiguration,@Configuration(指定类是Bean定义的配置类),@ComponentScan(扫描指定包下的Bean)
@EnableAutoConfiguration(开启自动配置功能)使用@Import({AutoConfigurationImportSelector.class}) AutoConfigurationImportSelector使用ImportSelector接口的selectImports方法加载META-INF/spring.factories文件的信息org.springframework.boot.autoconfigure.EnableAutoConfiguration=,封装成beanName,加载到IOC容器中,实现自动配置功能
SpringBoot在启动时扫描项目所依赖的jar包,寻找包含spring.factories文件的jar
根据spring.factories配置加载AutoConfigure类
根据@Conditional等条件注解进行自动配置并将Bean注入Spring IOC容器中

pom.xml引入SpringBoot依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
编写配置文件定义属性配置的前缀
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
    private String name;
    //getter、setter
}
自动装配
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloPropertiesConfigure {
  @Bean
  public User getUser(){
    return new User();
  }
}
配置自动类:在/resources/META-INF/spring.factories文件中添加自动配置类路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    cn.fighter3.demo.starter.configure.HelloPropertiesConfigure

Spring Boot 启动原理?为什么Spring Boot启动时能够找到main方法上的@SpringBootApplication注解?默认的包扫描路径是什么?

SpringApplication类
推断应用的类型是普通的项目还是 Web 项目
查找并加载所有可用初始化器 , 设置到 initializers 属性中
找出所有的应用程序监听器,设置到 listeners 属性中
推断并设置 main 方法的定义类,找到运行的主类
springbootstart.png

因为SpringApplication.run(Class<?>primarySource,String...args)方法接收主应用类(包含main方法的类),命令行参数。SpringBoot利用反射机制来读取传递给run方法的类MyApplication.class并检查注解,包括@SpringBootApplication

启动类@SpringBootApplication类所在包及其子包下的所有类