使用Spring Boot开发项目时我们经常需要存储Session,因为Session中会存一些用户信息或者登录信息。传统的web服务是将session存储在内存中的,一旦服务挂了,session也就消失了,这时候我们就需要将session存储起来,而Redis就是用来缓存seesion的一种非关系型数据库,我们可以通过配置或者注解的方式将Spring Boot和Redis整合。而在分布式系统中又会涉及到session共享的问题,多个服务同时部署时session需要共享,Spring Session可以帮助我们实现这一功能。将Spring Session集成到Spring Boot框架中并使用Redis进行缓存是目前非常流行的解决方案,接下来就跟着我一起学习吧。
工具/材料IntelliJ IDEA
首先我们创建一个Spring Boot 2x的项目,在applicationproperties配置文件中添加Redis的配置,Spring和Redis的整合可以参考我其他的文章,此处不再详解。我们设置服务端口serverport为8080端口用于启动第一个服务。
接下来我们需要在pom文件中添加spring-boot-starter-data-redis和spring-session-data-redis这两个依赖,spring-boot-starter-data-redis用于整合Spring Boot和Redis,spring-session-data-redis集成了spring-session和spring-data-redis,提供了session与redis的整合方案。
接下来我们创建一个配置类RedisSessionConfig,这个类使用@Configuration注解表明这是一个配置类。在这个类上我们同时添加注解@EnableRedis>
先通过Spring boot方式启动项目,然后从Spring容器里面获取到SupportService对象,再获取url值。这样你的SupportService才是交由Spring管理的,字段也才会自动填充。 直接运行main方法,相当于没有使用Spring那套东西
SpringBoot 提供了 Maven 插件 spring-boot-maven-plugin,将 Spring Boot 项目打成 jar 包或者 war 包。
只需要在pomxml文件中加入下面这个插件配置,再通过mvn clean package获取jar包即可。
打包后 通过下面的命令即可启动一个服务。
可以看到,主要有三个大目录META-INF,BOOT-INF以及org,
比较重要的是MAINIFESTMF文件:
该文件声明了Main-Class 配置项:可以理解为jar包的启动类,这里设置为 spring-boot-loader 项目的 JarLauncher类,进行 Spring Boot 应用的启动。
还有一个Start-Class 配置项:配置的内容是我们springboot项目的主启动类。
classes文件中保存了 Java 类所编译的 class文件以及配置文件等。
lib目录中保存了我们项目所依赖的jar包。
该文件中即springboot为我们提供的jar包启动类,亦即JarLauncherclass
当使用 java -jar filenamejar 命令启动时,会执行封装在 JAR 文件中的程序。JAR 文件需包含 manifest,其中一行格式为 Main-Class:classname,指定了一个包含 public static void main(String[] args) 方法的类,作为该程序的启动点。
对应在示例的这个项目,问题可以翻译为为什么不可以直接使用comjsvcjarlearnJarlearnApplication类作为启动类?
主要是因为,Java 没有提供任何加载嵌套 jar 文件的标准方法(即加载本身包含在 jar 中的 jar 文件)。当需要分发一个可以从命令行运行而不需要解压缩的自包含应用程序时 , 会出现问题。
同时,我试了下,直接运行application类的话,是找不到主类的:
因为在文件目录中,JarlearnApplication实际上是在META-INF/maven/ 中的,所以会找不到。
所以,springboot以 orgspringframeworkbootloaderJarLauncher 为启动类,
又自定义了 LaunchedURLClassLoader 用来加载BOOT-INF中的class文件以及BOOT-INF/lib中的嵌套jar包。
我这边通过引入 spring-boot-loader 模块来看下JarLaunch的源码:
可以看到main方法中,执行了launch方法,改方法由JarLaunch的父类Launcher提供:
launch方法主要分为三步:
基本思路就是将 orgspringframeworkbootloader 包路径添加到 javaprotocolhandlerpkgs 环境变量中,从而使用自定义的 URLStreamHandler 实现类 Handler处理 jar: 协议的 URL。
关于handler 可以自行百度下。
这里有两个主要方法:
也就是 getClassPathArchivesIterator 以及 createClassLoader
首先是 getClassPathArchivesIterator :
首先是isSearchCandidate,在JarLaunch中实现:
可以看出是只处理BOOT-INF/文件夹下的内容。
然后会通过 getNestedArchives 获取到嵌套的Archive,其中的 isNestedArchive 方法也由JarLaunch实现:
基本就是获取 BOOT-INF/classes/ 下的目录以及 BOOT-INF/lib/ 下的jar文件,最终通过 getNestedArchives 将其封装为对应的Archive并返回。
然后就是 createClassLoader 方法:
基本上就是通过archives获取到所有的URL,然后创建处理这些URL的ClassLoader。
主要就是通过 getMainClass 方法获取到manifest文件中配置的 Start-Class :
然后通过另一个launch方法,开始执行:
这里createMainMethodRunner创建出来的是什么呢?
最终调用的其实就是MainMethodRunner的run方法了,其实也就是通过反射调用Application的main方法了。
以上就是关于SpringBoot整合SpringSeesion实现Redis缓存全部的内容,包括:SpringBoot整合SpringSeesion实现Redis缓存、Dubbo: 在springboot中的启动过程、springboot通用service启动报错等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)