2024年最新SpringBoot源码分析系列之一:配置自动化(2),java面试基础知识笔试

总结

蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。


经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

蚂蚁金服5面,总结了49个面试题,遇到的面试官都是P7级别以上

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

}

}

以上代码中,@SpringBootApplicationSpringBoot的核心注解,它是一系列注解的集合。它对应的源码如下所示。在这些注解当中@EnableAutoConfiguration即为当前的项目提供自动配置功能,它也是一系列注解的集合。该注解可以让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置。

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(excludeFilters = {

@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),

@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

public @interface SpringBootApplication {

@AliasFor(annotation = EnableAutoConfiguration.class)

Class<?>[] exclude() default {};

@AliasFor(annotation = EnableAutoConfiguration.class)

String[] excludeName() default {};

@AliasFor(annotation = ComponentScan.class, attribute = “basePackages”)

String[] scanBasePackages() default {};

@AliasFor(annotation = ComponentScan.class, attribute = “basePackageClasses”)

Class<?>[] scanBasePackageClasses() default {};

}

通过注解的方式实现配置的自动化,主要在spring-boot-autoconfigure-1.4.3.RELEASE-sources.jar这个jar包中提供了对于SpringBoot自动化配置的支持。这个jar包中包含了如下包,篇幅有限只列出了部分包。

这里写图片描述

在这个jar包中的META-INF文件夹中,可以看到spring.factories文件

这里写图片描述

在spring.factories文件中我们看到了一些初始化的类、监听器以及构建类等等。

这里写图片描述

我们具体看一下@EnableAutoConfiguration这个注解里面的内容。Spring中有很多@Enable-*开头的注解,类似@EnableScheduling以及@EnableCaching等等,这类注解即为该修饰的类赋予某项能力,在每个该类注解中都会通过@Import注解来导入实现对应功能的类。

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import(EnableAutoConfigurationImportSelector.class)

public @interface EnableAutoConfiguration {

String ENABLED_OVERRIDE_PROPERTY = “spring.boot.enableautoconfiguration”;

/**

  • Exclude specific auto-configuration classes such that they will never be applied.

  • @return the classes to exclude

*/

Class<?>[] exclude() default {};

/**

  • Exclude specific auto-configuration class names such that they will never be

  • applied.

  • @return the class names to exclude

  • @since 1.3.0

*/

String[] excludeName() default {};

}

在该注解中引入了EnableAutoConfigurationImportSelector这个类,按照这个类的字面理解为自动配置导入选择器,它实现了以下几个接口。

public class AutoConfigurationImportSelector

implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,

BeanFactoryAware, EnvironmentAware, Ordered{

}

在这个类中,使用SpringFactoriesLoader.loadFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包,spring-boot-autoconfigure-x.x.x.x.jar里就有一个spring.factories文件,这个文件中声明了有哪些类要自动配置。

protected List getCandidateConfigurations(AnnotationMetadata metadata,

AnnotationAttributes attributes) {

//获取

List configurations = SpringFactoriesLoader.loadFactoryNames(

getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

Assert.notEmpty(configurations,

"No auto configuration classes found in META-INF/spring.factories. If you "

  • “are using a custom packaging, make sure that file is correct.”);

return configurations;

}

二、Kafka自动配置源码分析

下面分析下Kafka自动配置类,贴上其源码,相关源码已经加上注释。

//配置注解

@Configuration

//KafkaTemplate类在classpath目录下存在时,才会去解析KafkaAutoConfiguration自动配置类

@ConditionalOnClass(KafkaTemplate.class)

//自动注入属性,如果在application.properties配置文件中定义,则会将配置文件中key对应的value值注入到KafkaProperties中

@EnableConfigurationProperties(KafkaProperties.class)

//导入KafkaAnnotationDrivenConfiguration

@Import(KafkaAnnotationDrivenConfiguration.class)

public class KafkaAutoConfiguration {

private final KafkaProperties properties;

private final RecordMessageConverter messageConverter;

public KafkaAutoConfiguration(KafkaProperties properties,

ObjectProvider messageConverter) {

this.properties = properties;

this.messageConverter = messageConverter.getIfUnique();

}

//向Spring容器注入bean

@Bean

//在上下文中没有KafkaTemplate时,才会实例化bean

@ConditionalOnMissingBean(KafkaTemplate.class)

public KafkaTemplate<?, ?> kafkaTemplate(

ProducerFactory<Object, Object> kafkaProducerFactory,

ProducerListener<Object, Object> kafkaProducerListener) {

KafkaTemplate<Object, Object> kafkaTemplate = new KafkaTemplate<>(

kafkaProducerFactory);

if (this.messageConverter != null) {

kafkaTemplate.setMessageConverter(this.messageConverter);

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

下面的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

在这里插入图片描述

最新整理电子书

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

…(img-Ejzq9vnp-1715225750090)]

最新整理电子书

[外链图片转存中…(img-4IxCT7PN-1715225750091)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值