跳至主要內容

springboot

HeChuangJun约 1279 字大约 4 分钟

1. springboot优缺点?

  • √快速构建项目,通过 Intellij IDEA 或者官方的 Spring Initializr 就可以快速创建新项目

  • √自动配置:提供了一系列的 Starter,对主流框架的无配置集成

  • √项目独立运行,内嵌servlet容器Tomcat、Jetty 或者 Undertow

  • 提供运行时应用监控。Spring Boot 提供基于 HTTP、JMX、SSH 对运行时的项目进行监控。

  • 极大地提高了开发、部署效率

  • 因为自动配置 Spring Bean 的功能,我们可能无法知道,哪些 Bean 被进行创建了。这个时候,如果我们想要自定义一些 Bean ,可能存在冲突,或者不知道实际注入的情况。

2. 如何统一引入Spring Boot版本?

方式1.继承 spring-boot-starter-parent 项目,容易与别的项目冲突
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.1.RELEASE</version>
</parent>
方式2.导入 spring-boot-dependencies 项目依赖,比较自由
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.1.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

3. Spring Boot 有哪些配置方式?

  • XML 配置文件。<bean>
  • 注解配置。@Component
  • Java Config 配置。使用 @Bean 和 @Configuration

4. Spring Boot 有哪几种读取配置的方式?

  • @Value注解,读取配置到属性。支持和 @PropertySource注解一起使用,指定使用的配置文件。
  • @ConfigurationProperties注解,读取配置到类上。支持和@PropertySource注解一起使用,指定使用的配置文件。

5. bootstrap.properties和application.properties有何区别?

  • bootstrap(.yml/.properties):由父ApplicationContext加载,比applicaton优先加载,配置在应用程序上下文的引导阶段生效。在SpringCloud Config或者Nacos中会用到。且属性不能被覆盖;
  • application(.yml/.properties):由ApplicatonContext加载,用于项目的自动化配置。

6. SpringBoot中如何解决跨域问题 ?

@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);
    }
}

7. springboot配置文件读取顺序?√

  • config/application.properties|yml(项目根目录中config目录下)

  • application.properties|yml(项目根目录下)

  • resources/config/application.properties|yml(项目resources目录中config目录下)

  • resources/application.properties|yml(项目的resources目录下)

  • 如果同一个目录下,默认先读取application.properties。然后application.yml

  • 如果同一个配置属性,默认使用第1个读取到的

  • 配置文件放置在项目的resources目录下,因为配置文件的修改,通过热部署不用重新启动项目,热部署作用范围是classpath下

8. springboot实现将配置文件放到classpath,那么所有的文件将不受所放位置的影响

  • Xbootclasspath/a:与路径无空格 路径为同jar路径下的config文件,此时所有的配置文件都会像classpath一样加载
  • java -Xbootclasspath/a:/config/ -jar testspringbootMybaits-0.0.1-SNAPSHOT.jar注意此时的配置文件会覆盖原来的配置!!!!!!
  • /config/根目录,config/相对当前目录
  • jar包指定编码启动 java -Dfile.encoding=utf-8 -jar test.jar

9. SpringBoot 自动配置原理、@EnableAutoConfiguration实现原理

  • @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 等条件注解](Spring Boot 条件注解) 的条件,进行自动配置并将Bean注入Spring IoC中

如何自定义一个SpringBoot Srarter?

  • 引入 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 {
}
  • 配置自动类:在/resources/META-INF/spring.factories文件中添加自动配置类路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    cn.fighter3.demo.starter.configure.HelloPropertiesConfigure

Springboot 启动原理?

  • SpringApplication这个类主要做了以下四件事情:
    • 推断应用的类型是普通的项目还是 Web 项目
    • 查找并加载所有可用初始化器 , 设置到 initializers 属性中
    • 找出所有的应用程序监听器,设置到 listeners 属性中
    • 推断并设置 main 方法的定义类,找到运行的主类
      springbootstart.png
  • 为什么SpringBoot在启动的时候能够找到main方法上的@SpringBootApplication注解?
  • 因为它利用了Java的反射机制和类加载机制,SpringApplication.run(Class<?>primarySource,String...args)方法接收两个参数:第一个是主应用类(即包含main方法的类),第二个是命令行参数。primarySource参数提供了一个起点,SpringBoot通过它来加载应用上下文。
  • SpringBoot利用Java反射机制来读取传递给run方法的类(MyApplication.class)。它会检查这个类上的注解,包括@SpringBootApplication。

Spring Boot 默认的包扫描路径是什么?

  • 以启动类 @SpringBootApplication 注解所在的包为根目录的,默认情况会扫描启动类所在包及其子包下的所有组件。