首先,SpringBoot的自动配置不等于自动装配!
自动配置是Auto-Configuration,针对的是SpringBoot中的配置类,
而自动装配是Autowire,针对的是Spring中的依赖注入。
进入主题:
自动配置简单来说就是自动去把第三方组件的Bean装载到IOC容器中,不需要开发人员再去写Bean相关的配置。在SpringBoot应用里只需要在启动类上加@SpringBootApplication注解就可以实现自动配置。
@SpringBootApplication注解是一个复合注解,真正去实现自动配置的注解是它里面的@EnableAutoConfiguration这样一个注解。自动配置的实现主要依靠三个核心的关键技术:
①、第一个,引入Starter
启动依赖组件的时候,这个组件里必须要包含一个@Configuration配置类,而在这个配置类里面我们需要通过@Bean这个注解去声明需要装配到IOC容器里面的Bean对象。
②、第二个,这个配置类是放在第三方的jar包里面,然后通过SpringBoot中约定优于配置的这样一个理念,使用Spring里拥有的SpringFactoriesLoader(Spring的一种加载方式,在Spring的底层非常常见)去把这个配置类的全限定名(路径)放在classpath:/META-INF/spring.factories文件里面,这样SpringBoot就可以知道第三方jar包里面这个配置类的位置。
约定优于配置理念:
维基百科解释如下:
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做出决定的数量,活得简单的好处,而又不失灵活性。
本质上是说,开发人员仅需要规定应用中不符约定的部分,例如,如果模型中有个名为 Sale 的类,那么数据库中对应的表就会默认命名为 sales。只有偏离这一约定时,例如将该表命名为“products_sold”,才需写有关这个名字的配置。
如果您所用工具的约定与你的期望相符,便可省去配置;反之,你可以配置来达到你所期待的方式。
如何理解 Spring Boot 中的约定优于配置
/META-INF/spring.factories文件以key-value键值对作为内容,其中有一个Key为EnableAutoConfiguration且Value为各个第三方jar包的Configuration全限定名,而@EnableAutoConfiguration注解就是通过这里自动加载到所有符合要求的第三方依赖
③、第三个,SpringBoot拿到所有第三方jar包里面声明的配置类以后,再通过Spring提供的ImportSelector这样一个接口来实现对这些配置类的动态加载,从而去完成自动配置这样一个动作。
在我看来,Springboot是约定优于配置这一理念下的一个产物,所以在很多地方都能看到这一类的思想,它的出现让开发人员可以更加聚焦(集中注意)在业务代码的编写上,而不需要去关心和业务无关的配置。
拓展:其实自动配置的思想在SpringFramework3.x版本里面的@Enable注解就已经有了实现的一个雏形,@Enable注解是一个模块驱动的意思,也就是说我们只需要增加@Enable注解就能自动打开某个功能,而不需要针对这个功能去做Bean的配置,@Enable注解的底层也是去帮我们自动去完成这样一个模块相关Bean的注入的,然后基于这一理念有了后来的SpringBoot自动配置。
以上就是我对于SpringBoot自动配置的一个理解。
关于SpringBoot自动配置的更深入理解可以参考这个视频:
B站目前讲的最透彻的SpringBoot自动配置,大厂面试必备知识点#安员外很有码
10分钟让你彻底明白Java SPI,附实例代码演示#安员外很有码
面试大厂应该需要拓展得这么详细,多数面试就按照上面简短回答一下理解就好。
但po主本人是不太能硬背下面试题的(背完很快就会忘),所以一般是多看几个原理视频把机制理解透彻后用自己想到的话讲出来
顺带再贴一下ChatGPT给出的java config常见注解作为拓展学习~
在使用 Java Config 配置 Spring 应用程序时,常见的注解包括:
-
@Configuration:用于标记一个类为配置类,相当于 XML 配置文件中的 标签。
-
@Bean:用于标记一个方法为 Spring Bean 的定义,相当于 XML 配置文件中的 标签。
-
@ComponentScan:用于指定要扫描的包,并自动将标记为 @Component、@Service、@Repository等注解的类注册为 Spring Bean。
-
@Autowired:用于自动注入一个依赖对象,相当于 XML 配置文件中的
<property>
标签。 -
@Qualifier:用于指定注入的 Bean 的名称,配合@Autowired一起使用。
-
@Value:用于从配置文件中读取属性值,并注入到一个变量中。
-
@Profile:用于指定不同的环境或配置激活时才注册相应的 Bean。
-
@Scope:用于指定 Bean 的作用域,包括 singleton(单例)和 prototype(原型)等。
-
@PostConstruct:用于指定初始化方法,在 Bean 创建后执行。
-
@PreDestroy:用于指定销毁方法,在 Bean 销毁前执行。
这些注解是常见的 Java Config 配置中使用的注解,通过它们可以方便地完成 Spring Bean 的定义、依赖注入和各种配置。这种基于注解的配置方式相比传统的 XML 配置更加简洁和可读性更高。