springsecurity 加载页面慢_(五)SpringBoot中的SpringSecurity

一、SpringBoot中集成SpringSecurity

由于项目使用了SpringBoot,所以在项目中集成SpringSecurity十分的简单。只需要引入下面坐标即可:

d1ecdb0252dc4416e43212c1db41a1a8.png

然后启动项目,在控制台我们能够看到这样一段日志:

be51f0061fe3831f8f90961f28efe5d6.png

引入SpringSecurity之后,我们来随便编写一个Controller:

bfcc6dee8a9e6a1b1420d1515f6e698c.png

然后通过浏览器访问这个url,意外发生了:

2f4132fd4440fcddf36f4a1f560c4733.png

72618b1565c32c8873169d859972eef8.png

我们的请求被302到了一个/login页面,然而我们的项目中并没有这个login页面。不用着急,这个就是SpringSecurity的默认行为,当你集成它的那一刻,他就开始守护我们的项目了。默认登录账号为user,而密码就是前面日志中看到的那一串随机生成的字符串。

ccbffa1ec3b8b094420f087a664ff55b.png

登录成功后我们就能访问到原来的controller了,是不是很神奇呢。我们只是引入了一个jar包,就多了一个这么牛逼的功能。你一定会思考它是如何工作的。所以在我们更深入的去使用它之前,我觉得最好还是了解一下它的工作原理,不然会很迷的。

二、SpringBoot是如何集成SpringSecurity

因为一个成熟的框架必定涉及到了很多知识,所以一次性就想理清整个框架的来龙去脉基本是不可能的。我们只能通过编程经验慢慢的一点点的发掘框架其中的奥秘。要想了解SpringBoot是如何去工作的,在了解之前我们需要把最起码的相关注解和配置熟悉下。项目基本的配置我在

landexiang:(一)SpringBoot搭建基本后端应用​zhuanlan.zhihu.com
a31206b1d14d09e5e3b1cf9cf2126dd5.png

中已经介绍过了。在这篇文章中我只是简单的提到了@EnableAutoConfiguration这个注解是用来帮我们提供默认配置的,虽然没说错只是介绍的过于简单了。我们来稍微深入的去了解一下这个注解,SpringSecurity是如何被集成到SpringBoot中的奥秘自然而然就会被揭开。

首先来看这个注解的详细内容:

52037cfb54753e2aeefdc3736cb0863e.png

然后看一下@Import注解的内容:

a5fda04fdde8cd120ac1c09a4cea4cd1.png

这个注解本身没什么特别的地方,就是一个需要注解在类上的运行时注解,而且只提供了一个属性。不过上面的注释可以给我们提供需要多帮。注释大概意思是:@Import提供了和在xml配置文件中的<import/>标签相同的能力。允许我们导入注解了@Configuration的类,或者是实现了ImportSelector或者ImportBeanDefinitionRegistrar接口的实现类。在spring4.2之前,我们甚至可以导入一个组件类,类似于AnnotationConfigApplicationContext.register方法(这是一个可以动态注册配置类的方法,放个扩展链接)。

使用 Java 配置进行 Spring bean 管理​www.ibm.com

通过导读注释我们可以了解到@Import注解可以引入多种类,从而实现不同的功能。我们可以看到@EnableAutoConfiguration上的@Import引入了一个AutoConfigutationImportSelector.class的类。找到这个类的所在:

c73ffea4166c1f40843ca1dafeceec7d.png

它的顶级接口为

abc7fa3f52cf2f77bfabfe002095893d.png

注释大意为:ImportSelectors引入的配置类和普通的@Import注解引入的配置类处理方式一样,但是如果使用DeferredImportSelector也可以使通过selector引入的配置类在其他的所有直接被发现或者被引入@Configuration配置类处理之后进行处理。可能看到这还不是很懂,我们发现DeferredImportSelector是AutoConfigutationImportSelector的直接父级接口,继续看这个提到的DeferredImportSelector配置类上的注释,大意为:这是一种在所有@Configuration的bean被处理之后才运行的特殊的ImportSelector,即前面提到的推迟运行行为。这个类型的selector在我们依靠@Conditional来引入某些配置时尤其有用。实现类也可以另外的实现Ordered接口然后通过使用@Order注解来表明自己的优先级。另外还提供了一个getImportGroup方法,可以提供过滤或者排序的功能。

1aabd9e9fdebd866a14269fdc0aebae5.png

AutoConfigurationImportSelector类就额外继承了Orderd接口。

7beaebd6fc7db5f41adb431c659e7503.png

另外通过顶级接口ImportSelectors我们可以得出一个结论,这个类主要提供的功能就是selectImports方法,因为顶级接口中只有这一个方法。通过源码看到它返回一个字符串数组,所以我们自然而然会想到应该看下作为实现类的AutoConfigurationImportSelector中的selectImports方法的具体实现:

37282a103d34b5b5f50e686d0ec61924.png

我们注意到这一行:

a2f98149e64e9c853158f202896533ec.png

一般像这种,参数只传了个类加载器的加载数据函数,通常都具有一些默认行为。可能加载的是默认路径,也可能加载的是指定类,带着我们的推断进入源码:

85e371b7435822e36f9ecd7aa480a0ae.png

果不其然,加载的指定路径下的一个配置文件。来看下它的getResources细节,另外值得注意的是debug的过程中这里如果单纯的按F7是无法进入的,需要强制进入,shift + F7,我们可以看到执行加载任务的是RestartClassLoader

cb1bf766d7dfb94892a4817dc653b646.png

debug显示其父加载器是系统类加载器:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值