我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
static WebApplicationType deduceFromClasspath() {
if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
return WebApplicationType.REACTIVE;
}
for (String className : SERVLET_INDICATOR_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return WebApplicationType.NONE;
}
}
return WebApplicationType.SERVLET;
}
在看整体的实现逻辑之前,我们先分别看两个内容,第一就是在上面的代码中使用到了相关的静态变量。
这些静态变量其实就是一些绑定的Java类的全类路径。第二个就是 ClassUtils.isPresent()
方法,该方法的逻辑也非常简单,就是通过反射的方式获取对应的类型的Class对象,如果存在返回true,否则返回false
所以到此推导的逻辑就非常清楚了
然后我们再来看下如何实现加载初始化器的。
// 加载配置在spring.factories文件中的ApplicationContextInitializer对应的类型并实例化
// 并将加载的数据存储在了 initializers 成员变量中。
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
首先所有的初始化器都实现了 ApplicationContextInitializer
接口,也就是根据这个类型来加载相关的实现类。
public interface ApplicationContextInitializer {
void initialize(C var1);
}
然后加载的关键方法是 getSpringFactoriesInstances()
方法。该方法会加载 spring.factories
文件中的key为 org.springframework.context.ApplicationContextInitializer
的值。
spring-boot项目下
Application Context Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.rsocket.context.RSocketPortInfoApplicationContextInitializer,\
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer
spring-boot-autoconfigure项目下
Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
具体的加载方法为 getSpringFacotiesInstance()
方法,我们进入查看
private Collection getSpringFactoriesInstances(Class type, Class<?>[] parameterTypes, Object… args) {
// 获取当前上下文类加载器
ClassLoader classLoader = getClassLoader();
// 获取到的扩展类名存入set集合中防止重复
Set names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
// 创建扩展点实例
List instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
AnnotationAwareOrderComparator.sort(instances);
return instances;
}
先进入 SpringFactoriesLoader.loadFactoryNames(type, classLoader)
中具体查看加载文件的过程.
然后我们来看下 loadSpringFactories
方法
通过Debug的方式查看会更清楚哦
通过 loadSpringFactories
方法我们看到把 spring.factories
文件中的所有信息都加载到了内存中了,但是我们现在只需要加载 ApplicationContextInitializer
类型的数据。这时我们再通过 getOrDefault()
方法来查看。
进入方法中查看
然后会根据反射获取对应的实例对象。
好了到这其实我们就清楚了 getSpringFactoriesInstances
方法的作用就是帮我们获取定义在 META-INF/spring.factories
文件中的可以为 ApplicationContextInitializer
的值。并通过反射的方式获取实例对象。然后把实例的对象信息存储在了SpringApplication的 initializers
属性中。
总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
,当自己能上手再买这些书看又是非常有收获的事了。
[外链图片转存中…(img-VmjcsLvm-1715649463128)]