springboot入门(三)-----启动类注解@SpringBootApplication

@SpringBootApplication:

我们点进去发现,它是一个组合注解,主要构成这个注解的,是由SpringBootConfiguration,EnableAutoConfiguration,ComponentScan这三个注解构成(除了元注解)
在这里插入图片描述
接下来我们看看这三个注解的具体作用:

SpringBootConfiguration:

我们发现SpringBootConfiguration注解其实就是spring框架中的Configuration,被它修饰的注解是一个配置类,也会有springioc容器所管理,相当于一个spring配置文件
在这里插入图片描述

ComponentScan

有了配置注解SpringBootConfiguration后,ComponentScan就是用来扫描包的,它来告诉spring去扫面组件,但是去哪扫面呢?有一个String[]类型的注解参数basePackages,可以传入需要扫描的路径,如果你不传,那就以当前类的包作为路径。所以这么一来,你的Application类在哪个包里,自动扫描就在哪个包里扫。你只要在这个包或者子包里编写@Controller类或者其他@Component类,都会被扫到的。假设你的Application类所在的包为com.jym.demo,那建议你所有的代码都放这个包下,省得因为组件没放入容器而出错。
在这里插入图片描述

EnableAutoConfiguration:

自动配置当前springboot项目所依赖的bean,起到无需配置文件的作用
我们点进去看发现:
在这里插入图片描述
Impor注解:将导入的类也会交给给springIOC容器所管理
在这里导入了一个类AutoConfigurationImportSelector
然后查看AutoConfigurationImportSelector
主要看公有方法:发现主要的公有方法只有 selectImports
在这里插入图片描述
然后我们看倒数第二行代码:

            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);

查看getAutoConfigurationEntry方法:
在这里插入图片描述
除了一些逻辑外,主要的方法是getCandidateConfigurations方法
继续跟进:
在这里插入图片描述
发现有个断言:里面提到了META-INF/spring.factories
想到看可能会跟配置有关:然后我们查看一下
在这里插入图片描述
发现需要的依赖bean都在这个配置文件里,springboot就是从这里读出来,放入ioc容器中的
在这里插入图片描述
但是具体怎么实现智能装配bean的呢?
SpringFactoriesLoader的支持
通过 SpringFactoriesLoader.loadFactoryNames(),把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中,还是这个getCandidateConfigurations方法
在这里插入图片描述
spring.factories中每个类都会有ConditionalXX注解,这个注解就是判断什么时候将bean注入的
@ConditionalOnClass : classpath中存在该类时起效
@ConditionalOnMissingClass : classpath中不存在该类时起效
@ConditionalOnBean : DI容器中存在该类型Bean时起效
@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效
@ConditionalOnExpression : SpEL表达式结果为true时
@ConditionalOnProperty : 参数设置或者值一致时起效
@ConditionalOnResource : 指定的文件存在时起效
@ConditionalOnJndi : 指定的JNDI存在时起效
@ConditionalOnJava : 指定的Java版本存在时起效
@ConditionalOnWebApplication : Web应用环境下起效
@ConditionalOnNotWebApplication : 非Web应用环境下起效

世界上有10种人,一种是懂二进制的,一种是不懂二进制的。

感谢您的收看,如有哪里写的不对 请留言,谢谢。

发布了71 篇原创文章 · 获赞 54 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/weixin_43326401/article/details/104067516