SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition

一.SpringBoot自动配置在这里插入图片描述

(1)Condition条件判断

可以实现选择性的创建Bean操作(Condition就是满足你写的条件(如要加某个maven坐标才创建bean)才创建bean的)

方法1:
@Bean
@Conditional(自定义类),要实现Condition接口的matches方法返回true才创建:

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第1张图片

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第2张图片
classcondition就是一个条件类
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第3张图片

方法2:
在这里插入图片描述

用@ConditionOnClass注解(“放你想要的坐标(条件)(字节码文件名)”),(就是满足了这个条件,才会创建这个类下的所有bean,下面就是演示创建user的bean
然后条件类上加@Conditional注解

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第4张图片
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第5张图片
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第6张图片
ConditionOnBean就是要满足condition有这个bean才创建SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第7张图片有兴趣的童鞋可以详细了解下 Spring Boot 提供的条件注解

@ConditionalOnBean:当容器里有指定 Bean 的条件下
@ConditionalOnMissingBean:当容器里没有指定 Bean 的情况下
@ConditionalOnSingleCandidate:当指定 Bean 在容器中只有一个,或者虽然有多个但是指定首选 Bean
@ConditionalOnClass:当类路径下有指定类的条件下
@ConditionalOnMissingClass:当类路径下没有指定类的条件下
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnExpression:基于 SpEL 表达式作为判断条件
@ConditionalOnJava:基于 Java 版本作为判断条件
@ConditionalOnJndi:在 JNDI 存在的条件下差在指定的位置
@ConditionalOnNotWebApplication:当前项目不是 Web 项目的条件下
@ConditionalOnWebApplication:当前项目是 Web 项 目的条件下

(2)启用内置web服务器(原理还是condition)

就是你在pom文件排除tomcat坐标,就可以使用另外3个web服务器了SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第8张图片
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第9张图片
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第10张图片
启动就完事了

(3)@Enable*注解(底层是用import的)

import注解见下
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第11张图片
com.itheima.config是另一个工程的包,我们这个包直接扫描不到就创建不了对应的bean,可以使用下面的3种方式解决(推荐2,3)
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第12张图片SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第13张图片

(4) @Import

@Import的作用:加载类,这些类都会被Spring创建,并且加入到IOC容器
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第14张图片SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第15张图片

(5)@EnableAutoConfiguration

@SpringbootApplication:
@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制

@Configuration:允许在上下文中注册额外的 bean 或导入其他配置类

@ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。如下图所示,容器中将排除TypeExcludeFilter和AutoConfigurationExcludeFilter。

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第16张图片

@EnableAutoConfiguration 是实现自动装配的重要注解,我们以这个注解入手。

SpringBoot自动配置@EnableAutoConfiguration就是使用了@Import和@Contition而已

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第17张图片SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第18张图片
SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第19张图片

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第20张图片

SpringBoot自动配置@EnableAutoConfiguration、@Import、@Condition_第21张图片

总结
Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖

参考:https://www.cnblogs.com/javaguide/p/springboot-auto-config.html

你可能感兴趣的:(springboot)