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