Spring Boot
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 方法的定义类,找到运行的主类
因为SpringApplication.run(Class<?>primarySource,String...args)方法接收主应用类(包含main方法的类),命令行参数。SpringBoot利用反射机制来读取传递给run方法的类MyApplication.class并检查注解,包括@SpringBootApplication
启动类@SpringBootApplication类所在包及其子包下的所有类