二、SpringBoot自动配置
1、@Configuration注解
- 具体的可以查看博客(https://blog.csdn.net/weixin_46203713/article/details/120941746)
- 补充@Configuration(proxyBeanMethods = false)配置
- proxyBeanMethods = true : Full模式(默认)
- 组件之间存在依赖关系的时候使用,保证容器中的组件都是单实例的,IOC容器会检查
- proxyBeanMethods = false : Lite模式
- 组件之间不存在依赖关系的时候使用,IOC容器不会检查是实例是否存在,可以加速容器的启动过程
- proxyBeanMethods = true : Full模式(默认)
2、@Conditional注解
-
@Conditional注解可以查看博客(https://blog.csdn.net/weixin_46203713/article/details/120941746)
-
@Conditional注解有许多派生注解(使用派生注解的场景更多)
3、@ImportResource注解
- @ImportResource注解可以导入Spring的xml配置文件
- 例: @ImportResource(“classpath:applcation.xml”)
4、配置绑定(@ConfigurationProperties)
-
SpringBoot中核心配置文件是 application.properties 或者 application.yaml
-
若要使用配置绑定则像使用其他Spring提供的功能一样需要在IOC容器中
-
看下面案例,将application.properties中的配置,装载到对象上
-
application.properties
car.name=BYD car.price=10000
-
方式一:@Component + @ConfigurationProperties
@Component @ConfigurationProperties("car") public class Car { private String name; private Integer price; //getter和setter方法省略 }
-
方式二:@Configuration + @EnableConfigurationProperties
@SpringBootApplication//主程序类,程序的入口同样也是主配置类 @Configuration @EnableConfigurationProperties({Car.class}) //有两个功能:1.将Car的组件注册到容器中 2.开启Car配置绑定功能 public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class,args); } }
-
5、自动配置原理
-
加载自动配置类@SpringBootApplication
@SpringBootApplication//主程序类,程序的入口同样也是主配置类 public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class,args); } }
-
@SpringBootApplication注解由一下三个注解组成
-
@SpringBootConfiguration : @Configuration标注这是一个配置类
-
@ComponentScan : 配置包扫描
-
@EnableAutoConfiguration : 既然上面两个注解作用很单一那就说明所有功能都在该注解上
-
该注解由下面两个注解组成:@AutoConfigurationPackage 和 @Import
-
@AutoConfigurationPackage : 自动配置包,指定了默认的包规则
-
@Import(AutoConfigurationPackages.Registrar.class)
-
AutoConfigurationPackages.Registrar方法
//省略了部分无关方法以及实现接口等 static class Registrar { @Override public void registerBeanDefinitions( AnnotationMetadata metadata,BeanDefinitionRegistry registry) { register(registry,new PackageImports(metadata).getPackageNames().toArray(new String[0]));//该方法将包加载进去并注册 } }
-
-
-
@Import(AutoConfigurationImportSelector.class)
-
利用getAutoConfigurationEntry(annotationMetadata) 给容器中批量导入一些组件
-
调用List<String> configurations = getCandidateConfigurations(,)
-
利用工厂加载Map<String,List<String>> 从 META-INF/spring.factores加载加载组件
- 并不去将组件全部加载而是利用@Conditional以及派生注解按需加载
-
-
-
-
-
6、自动配置总结
- SpringBoot先加载所有的自动配置类 XxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值再XxxxProperties中拿,因为XxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些组件的的功能就有了
- 定制化配置:SpringBoot使用以用户配置的优先
- 用户直接@Bean替换底层的组件
- 用户看底层获取的配置文件获取了什么值就去修改
- XxxAutoConfiguration --> 组件 --> XxxProperties中获取 --> application.properties
7、Lombok的使用
-
导入Lombok的坐标
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
-
在IDEA中安装Lombok的插件
-
Lombok中的常用注解
@Data//添加getter、setter方法 @ToString//添加toString()方法 @EqualsAndHashCode//equals和HashCode方法 @NoArgsConstructor//无参构造器 @AllArgsConstructor//有参构造器(全部参数) @Slf4j//日志输出,可以直接在方法中使用日志的log对象,相当于声明了一个全局的log对象
8、dev-tools
-
引入pom.xml文件
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
9、Spring Initailizr(项目初始化)