✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Java从入门到精通
✨特色专栏: MySQL学习
🥭本文内容:SpringSecurity6 | 自动配置(下)
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: Leo知识库,欢迎大家访问
✨✨ 粉丝福利订阅✨✨
Leo哥收集了一些关于面试以及其他学习资源,这里分享给大家,各位卷王快收下吧!!!
学习参考 :
大家好,我是Leo哥🫣🫣🫣,上一节我们揭开了为什么引入依赖之后就会进行登录鉴权这一神秘面纱,了解复习了关于SpringBoot的自动配置以及如何一步一步的通过自动配置让我们请求加上认证权限。本次我们接着讨论关于自动配置相关问题。好了,话不多说让我们开始吧😎😎😎。
既然我们知道了有关SpringBoot自动装配的一些基本流程。具体的方法调用路径或者叫配置路径是这样的:首先是三个核心的注解:
@SpringBootApplication-> @EnableAutoConfiguration>@Import(AutoConfigurationImportSelector)
然后通过@Import注解去加载他的所有配置文件到SpringBoot中。这样加载到SpringSecurity的核心文件。最终调用到上边的方法,导致所有的方法都得进行登录认证。
那么这些个注解尤其是**@Import**是如何生效的呢,具体是怎么生效的呢,在什么时候被加载呢,其实上一篇文章我们已经有了一些简单的了解,这节课我们随着Leo哥的视角通过源码方式来深入学习一下。
我们找到我们项目的启动类。
然后通过Ctrl + 鼠标左键,点进去run方法。
我们查看这个里面的构造方法:
然后我们找到run()方法
可以看到这个prepareContext这个方法。它接受6个参数,分别是bootstrapContext,context,environment,listeners,applicationArguments和printedBanner,并对这些参数进行处理以准备上下文。
然后我们通过Ctrl + 鼠标左键,点到prepareContext这个里面去查看。
那么他在这里做了什么准备工作呢,我们来简单分析一下:
它的功能是在Spring应用启动过程中准备并设置应用上下文(ApplicationContext)
主要作用: 识别入口类,读取入口类的所有内容包括注解在内。并注册到注解解读器announationreader中,方便后续注解进行解析。
通过getAllSources()获取所有源信息,也就是我们当前的入口类信息,然后把这些source放到一个set集合中,最后去加载load,接下来我们点开load方法继续查看。
到这里,前面的工作已经基本完成了:读取入口类中重要的信息,包括注解包括入口类本身。将入口类中的注解注册到注解解读器annotationreader当中。
真正解析Bean的工作是从refreshContext当中进行的。
首先通通过prepareContext方法进行准备,然后通过refreshContext进行装载工作,那么他具体是怎么进行转载的呢,下面我们点进去这个方法继续查看。
这部分代码涉及应用上下文的刷新动作。这里我逐行解释一下:
注册关闭钩子(shutdown hook):
最后跑到了一个applicationContext的refresh方法当中。
刷新应用上下文:
refresh(context)
这是调用ApplicationContext的
refresh()
方法,该方法是启动和重新启动Spring上下文的核心方法。它会执行以下关键步骤:
这个refreshContext方法的目的是确保SpringBoot应用中的ApplicationContext处于最新状态,具备服务请求的能力。这通常发生在应用启动时,或者需要重新加载上下文配置的任何时候。
接下来会进行Bean处理的13方法,其中一个比较关键的方法: invokeBeanFactoryPostProcessors
我们点过去这个方法
invokeBeanFactoryPostProcessors 方法接收一个 ConfigurableListableBeanFactory 类型的参数 beanFactory。
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()) 这一行调用了 PostProcessorRegistrationDelegate 类的 invokeBeanFactoryPostProcessors 方法,传入了两个参数,即当前的 beanFactory 和获取的一些BeanFactory后处理器列表(通过 getBeanFactoryPostProcessors() 获取)。
接下来的注释提到了检测 LoadTimeWeaver 并准备进行织入(weaving)。具体地说,它通过以下条件进行检查:
如果以上条件都满足,那么会执行以下两个操作:
总结:
经常refresh()的层层调用2进到AbstractApplicationContext类中refresh0方法,该方法主要有13
个步骤用于对bean对象进行解析加载,其中第5步invokeBeanFactoryPostProcessors()进行核心加
载类上的**@Configurer**、@Bean、@Import等注解。
以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。
如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。
上一篇:分享SQL重复记录查询的几种方法