158文章网欢迎您
您的位置:158文章网 > 范文示例 > SpringBoot在线教育系统,附源码

SpringBoot在线教育系统,附源码

作者:158文章网日期:

返回目录:范文示例

今天小编给各位分享网上教学系统的知识,文中也会对其通过SpringBoot在线教育系统,附源码和SpringBoot核心原理:自动配置、事件驱动、Condition等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!

内容导航:
  • SpringBoot在线教育系统,附源码
  • SpringBoot核心原理:自动配置、事件驱动、Condition
  • springBoot是什么?
  • SpringBoot进阶之缓存中间件Redis
  • 一、SpringBoot在线教育系统,附源码

    分享两款教育教学系统,代码完整,功能完善,源码地址在文末。

    ▶▶▶1:Java开源智慧云智能教育平台源码 前后端分离

    00396

    基于 SpringBoot + Mybatis + Shiro + mysql + redis构建的智能教育平台。架构上使用完全前后端分离。

    一、管理端功能:

    1、功能模块:系统首页、教育教学模块、考试管理模块、统计分析模块、系统设置模块。

    2、支持多种题型:选择题、多选题、判断题、填空题、综合题以及数学公式。支持在线考试,教师在线批改试卷。

    3、试题管理:支持excel模板导入试题、支持使用富文本编辑试题及插入数学公式,同时还支持上传试题教学视频。

    4、试卷管理:支持将试卷导出成word文档、html页面进行打印、支持富文本图片导出到word。

    5、试卷批改功能:支持教师后台批改试卷,主观题系统自动评分、非主观题由教师评分、错题可设置添加到学员错题本。

    6、权限管理:主要包括用户管理、角色管理、权限管理。

    二、学生端功能模块:

    学员在线做课程试题、在线考试、错题本功能记录、考试记录、个人中心。

    ▶▶▶▶2:Java学校教务管理系统源码带微信小程序

    运行环境:jdk8+mysql5.7+IntelliJ IDEA+maven

    技术:springboot+mybatis+layui+shiro+jquery

    教务管理系统是一个基于网络的在线管理平台 , 帮助学校管理教务系统,用一个帐号解决学校教务教学管理,灵活的定制符合学校自己实际情况的教务系统。

    功能介绍:

    教务管理系统分为微信小程序端和3个子系统,3个子系统分别是管理员系统、教师系统和学生系统,分别对应拥有不同权限的角色:管理员、教师和学生;

    (1)管理员系统:管理员可以管理课程、管理教师、管理学生、发布校园公告、校建管理、教评问题管理、分配权限等功能;

    (2)教师系统:教师登录教师系统,可以查看自己所教授的课程信息、查看某门课程所选学生信息、给学生打分以及修改自己的登录密码;

    (3)学生系统:学生根据姓名和密码登录自己的学生系统,可以查看所有的课程信息、查看已选课程、查看已修课程、选课以及退课等操作。

    (4)微信小程序:主要实现了学生的成绩查询、学生信息查询、网上教评、学生选课、退课等功能。

    模块说明

    1、小程序端模块功能:

    小程序登录、查看成绩、退选课程、我的信息、校园公告、课表查询、选课、掌上教评

    2、PC端模块功能

    权限管理、角色管理、用户管理、学生成绩查询、教师成绩查询、教师查询学生成绩新闻发布、新闻管理、学校建设、学生教评、教师授课、学生信息查询/修改、教师信息查询/修改、学生退学情况查询、学生、教师录入、学生个人成绩查询、学生选课管理、学生退课、课程管理、学生成绩录入、学生成绩修改等。

    源码地址:

    ▶▶1:http:///#/index/goods/8a281cc5-8ff2-43fc-a8c6-ae99012c7299

    ▶▶2:http:///#/index/goods/0611e479-8cff-4efb-8603-ae60009c213d

    一、SpringBoot核心原理:自动配置、事件驱动、Condition

    SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理。

    如果还不清楚Spring原理的,可以先查看博主之前的文章,本篇主要分析SpringBoot的启动、自动配置、Condition、事件驱动原理。

    SpringBoot启动非常简单,因其内置了Tomcat,所以只需要通过下面几种方式启动即可:

    可以看到第一种是最简单的,也是最常用的方式,需要注意类上面需要标注 @SpringBootApplication 注解,这是自动配置的核心实现,稍后分析,先来看看SpringBoot启动做了些什么?

    在往下之前,不妨先猜测一下,run方法中需要做什么?对比Spring源码,我们知道,Spring的启动都会创建一个 ApplicationContext 的应用上下文对象,并调用其refresh方法启动容器,SpringBoot只是Spring的一层壳,肯定也避免不了这样的操作。

    另一方面,以前通过Spring搭建的项目,都需要打成War包发布到Tomcat才行,而现在SpringBoot已经内置了Tomcat,只需要打成Jar包启动即可,所以在run方法中肯定也会创建对应的Tomcat对象并启动。以上只是我们的猜想,下面就来验证,进入run方法:

    SpringBoot的启动流程就是这个方法,先看 getRunListeners 方法,这个方法就是去拿到所有的 SpringApplicationRunListener 实现类,这些类是用于SpringBoot事件发布的,关于事件驱动稍后分析,这里主要看这个方法的实现原理:

    一步步追踪下去可以看到最终就是通过SPI机制根据接口类型从 META-INF/spring.factories 文件中加载对应的实现类并实例化,SpringBoot的自动配置也是这样实现的。

    为什么要这样做呢?通过注解扫描不可以么?当然不行,这些类都在第三方jar包中,注解扫描实现是很麻烦的,当然你也可以通过 @Import 注解导入,但是这种方式不适合扩展类特别多的情况,所以这里采用SPI的优点就显而易见了。

    回到run方法中,可以看到调用了 createApplicationContext 方法,见名知意,这个就是去创建应用上下文对象:

    注意这里通过反射实例化了一个新的没见过的上下文对象 AnnotationConfigServletWebServerApplicationContext ,这个是SpringBoot扩展的,看看其构造方法:

    如果你有看过Spring注解驱动的实现原理,这两个对象肯定不会陌生,一个实支持注解解析的,另外一个是扫描包用的。

    上下文创建好了,下一步自然就是调用refresh方法启动容器:

    这里首先会调用到其父类中 ServletWebServerApplicationContext :

    可以看到是直接委托给了父类:

    这个方法不会陌生吧,之前已经分析过了,这里不再赘述,至此SpringBoot的容器就启动了,但是Tomcat启动是在哪里呢?run方法中也没有看到。

    实际上Tomcat的启动也是在refresh流程中,这个方法其中一步是调用了onRefresh方法,在Spring中这是一个没有实现的模板方法,而SpringBoot就通过这个方法完成了Tomcat的启动:

    这里首先拿到 TomcatServletWebServerFactory 对象,通过该对象再去创建和启动Tomcat:

    上面的每一步都可以对比Tomcat的配置文件,需要注意默认只支持了http协议:

    如果想要扩展的话则可以对 additionalTomcatConnectors 属性设置值,需要注意这个属性没有对应的setter方法,只有 addAdditionalTomcatConnectors 方法,也就是说我们只能通过实现 BeanFactoryPostProcessor 接口的 postProcessBeanFactory 方法,而不能通过 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法,因为前者可以通过传入的BeanFactory对象提前获取到 TomcatServletWebServerFactory 对象调用 addAdditionalTomcatConnectors 即可;而后者只能拿到BeanDefinition对象,该对象只能通过setter方法设置值。

    这段代码会在控制台打印所有的事件名称,按照顺序如下:

    以上是正常启动关闭,如果发生异常还有发布 ApplicationFailedEvent 事件。事件的发布遍布在整个容器的启动关闭周期中,事件发布对象刚刚我们也看到了是通过SPI加载的 SpringApplicationRunListener 实现类 EventPublishingRunListener ,同样事件监听器也是在 spring.factories 文件中配置的,默认实现了以下监听器:

    可以看到有用于文件编码的( FileEncodingApplicationListener ),有加载日志框架的( LoggingApplicationListener ),还有加载配置的( ConfigFileApplicationListener )等等一系列监听器,SpringBoot也就是通过这系列监听器将必要的配置和组件加载到容器中来,这里不再详细分析,感兴趣的读者可以通过其实现的 onApplicationEvent 方法看到每个监听器究竟是监听的哪一个事件,当然事件发布和监听我们自己也是可以扩展的。

    SpringBoot最核心的还是自动配置,为什么它能做到开箱即用,不再需要我们手动使用 @EnableXXX 等注解来开启?这一切的答案就在 @SpringBootApplication 注解中:

    这里重要的注解有三个: @SpringBootConfiguration 、 @EnableAutoConfiguration 、 @ComponentScan 。 @ComponentScan 就不用再说了, @SpringBootConfiguration 等同于 @Configuration ,而 @EnableAutoConfiguration 就是开启自动配置:

    @AutoConfigurationPackage 注解的作用就是将该注解所标记类所在的包作为自动配置的包,简单看看就行,主要看 AutoConfigurationImportSelector ,这个就是实现自动配置的核心类,注意这个类是实现的 DeferredImportSelector 接口。

    在这个类中有一个 selectImports 方法。这个方法在我之前的文章这一次搞懂Spring事务注解的解析也有分析过,只是实现类不同,它同样会被 ConfigurationClassPostProcessor 类调用,先来看这个方法做了些什么:

    追踪源码最终可以看到也是从 META-INF/spring.factories 文件中拿到所有 EnableAutoConfiguration 对应的值(在 spring-boot-autoconfigure 中)并通过反射实例化,过滤后包装成 AutoConfigurationEntry 对象返回。

    看到这里你应该会觉得自动配置的实现就是通过这个 selectImports 方法,但实际上这个方法通常并不会被调用到,而是会调用该类的内部类 AutoConfigurationGroup 的process和selectImports方法,前者同样是通过 getAutoConfigurationEntry 拿到所有的自动配置类,而后者这是过滤排序并包装后返回。

    下面就来分析 ConfigurationClassPostProcessor 是怎么调用到这里的,直接进入 processConfigBeanDefinitions 方法:

    前面一大段主要是拿到合格的 Configuration 配置类,主要逻辑是在 ConfigurationClassParser.parse 方法中,该方法完成了对 @Component 、 @Bean 、 @Import 、 @ComponentScans 等注解的解析,这里主要看对 @Import 的解析,其它的读者可自行分析。一步步追踪,最终会进入到 processConfigurationClass 方法:

    这里需要注意 this.conditionEvaluator.shouldSkip 方法的调用,这个方法就是进行Bean加载过滤的,即根据 @Condition 注解的匹配值判断是否加载该Bean,具体实现稍后分析,继续跟踪主流程 doProcessConfigurationClass :

    这里就是完成对一系列注解的支撑,我省略掉了,主要看 processImports 方法,这个方法就是处理 @Import 注解的:

    刚刚我提醒过 AutoConfigurationImportSelector 是实现 DeferredImportSelector 接口的,如果不是该接口的实现类则是直接调用 selectImports 方法,反之则是调用 DeferredImportSelectorHandler.handle 方法:

    首先创建了一个 DeferredImportSelectorHolder 对象,如果是第一次执行则是添加到 deferredImportSelectors 属性中,等到 ConfigurationClassParser.parse 的最后调用process方法:

    反之则是直接执行,首先通过register拿到 AutoConfigurationGroup 对象:

    然后在 processGroupImports 方法中进行真正的处理:

    在 getImports 方法中就完成了对process和 selectImports 方法的调用,拿到自动配置类后再递归调用调用 processImports 方法完成对自动配置类的加载。至此,自动配置的加载过程就分析完了,下面是时序图:

    在自动配置类中有很多Condition相关的注解,以AOP为例:

    这里就能看到 @ConditionalOnProperty 、 @ConditionalOnClass 、 @ConditionalOnMissingClass ,另外还有 @ConditionalOnBean 、 @ConditionalOnMissingBean 等等很多条件匹配注解。

    这些注解表示条件匹配才会加载该Bean,以 @ConditionalOnProperty 为例,表明配置文件中符合条件才会加载对应的Bean,prefix表示在配置文件中的前缀,name表示配置的名称, havingValue 表示配置为该值时才匹配, matchIfMissing 则是表示没有该配置是否默认加载对应的Bean。其它注解可类比理解记忆,下面主要来分析该注解的实现原理。

    这里注解点进去看会发现每个注解上都标注了 @Conditional 注解,并且value值都对应一个类,比如 OnBeanCondition ,而这些类都实现了 Condition 接口,看看其继承体系:

    上面只展示了几个实现类,但实际上Condition的实现类是非常多的,我们还可以自己实现该接口来扩展 @Condition 注解。Condition接口中有一个matches方法,这个方法返回true则表示匹配。该方法在 ConfigurationClassParser 中多处都有调用,也就是刚刚我提醒过的shouldSkip方法,具体实现是在 ConditionEvaluator 类中:

    再来看看matches的实现,但 OnBeanCondition 类中没有实现该方法,而是在其父类 SpringBootCondition 中:

    getMatchOutcome 方法也是一个模板方法,具体的匹配逻辑就在这个方法中实现,该方法返回的 ConditionOutcome 对象就包含了是否匹配和日志消息两个字段。进入到 OnBeanCondition 类中:

    可以看到该类支持了 @ConditionalOnBean 、 @ConditionalOnSingleCandidate 、 @ConditionalOnMissingBean 注解,主要的匹配逻辑在 getMatchingBeans 方法中:

    这里逻辑看起来比较复杂,但实际上就做了两件事,首先通过 getNamesOfBeansIgnoredByType 方法调用 beanFactory.getBeanNamesForType 拿到容器中对应的Bean实例,然后根据返回的结果判断哪些Bean存在,哪些Bean不存在(Condition注解中是可以配置多个值的)并返回MatchResult对象,而MatchResult中只要有一个Bean没有匹配上就返回false,也就决定了当前Bean是否需要实例化。

    本篇分析了SpringBoot核心原理的实现,通过本篇相信读者也将能更加熟练地使用和扩展SpringBoot。

    另外还有一些常用的组件我没有展开分析,如事务、MVC、监听器的自动配置,这些我们有了Spring源码基础的话下来看一下就明白了,这里就不赘述了。

    最后读者可以思考一下我们应该如何自定义starter启动器,相信看完本篇应该难不倒你。

    二、springBoot是什么?

      Spring Boot可以轻松创建可以“直接运行”的独立的、生产级的基于Spring的应用程序。

      我们对Spring平台和第三方保持固执己见的看法,因此您可以轻松上手。大多数Spring Boot应用程序需要最少的时间Spring配置。

      其特征如下:

      创建独立的Spring应用程序

      直接嵌入Tomcat、Jetty或Undertow(无需部署WAR文件)

      提供自以为是的“入门”依赖项以简化您的构建配置

      尽可能自动配置Spring和3rd方库

      提供生产就绪功能,例如指标、健康检查和外部化配置

      完全无需代码生成,无需XML配置

      Spring快速入门指南

      第一步:启动一个新的Spring Boot项目

      利用启动.spring.io创建一个“网络”项目。在“依赖项”对话框中搜索并添加“web”依赖项,如屏幕截图所示。点击“生成”按钮,下载zip,然后将其解压缩到计算机上的文件夹中。

      创建的项目启动.spring.io包含弹簧靴,一个使Spring准备好在您的应用程序中工作的框架,但不需要太多代码或配置。Spring Boot是启动Spring项目的最快和最流行的方式。

      第2步:添加您的代码

      在IDE中打开项目并在文件夹DemoApplication.java中找到该文件

      src/main/java/com/example/demo。现在通过添加下面代码中显示的额外方法和注释来更改文件的内容。您可以复制并粘贴代码或直接输入。

      hello()我们添加的方法旨在获取一个名为的字符串参数name,然后将该参数与"Hello"代码中的单词结合起来。这意味着如果您“Amy”在请求中将您的姓名设置为,则响应将为“Hello Amy”.

       RestController注释告诉Spring这段代码描述了一个应该在web上可用的端点。 GetMapping(“/hello”)告诉Spring使用我们的方法hello()来回答发送到该

      地址的请求。最后, RequestParam告诉Springname在请求中期待一个值,但如果它不存在,它将默认使用单词“World”。

      第3步:尝试一下

      让我们构建并运行程序。打开命令行(或终端)并导航到您拥有项目文件的文件夹。我们可以通过发出以下命令来构建和运行应用程序:

      您应该会看到一些与此非常相似的输出:

      这里的最后几行告诉我们Spring已经开始了。Spring Boot的嵌入式Apache Tomcat服务器充当Web服务器,并正在侦听localhostport上的请求8080。打开浏览器,在顶部的地址栏中输入你好.你应该得到一个很好的友好回应,如下所示:

    三、SpringBoot进阶之缓存中间件Redis

    大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 「基础知识」 的铺垫

    「大佬可以绕过 ~」

    本节给大家讲讲 「Java的SpringBoot框架」 , 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以 springboot 来构建项目了,一个稳健的系统需要引入稳定的技术~

    如果你是一路看过来的,很高兴你能够耐心看完。前几期都是带大家学习了 SpringBoot 的基础使用以及集成 mybatis 开发,这也是我们写业务的基础,如果你还不熟悉这些,请先看完它们。接下来的几期内容将会带大家进阶使用,会先讲解基础 中间件 的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有 收获 ,本期将会给大家讲解最热门的缓存中间件技术 Redis ,同样的,我们集成到 Springboot 中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码

    Redis 是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。全称叫 Remote Dictionary Server(远程数据服务) 是由 C语言 编写的,Redis是一个 key-value 存储系统,它支持丰富的数据类型,如: string、list、set、zset(sorted set)、hash

    它本质上是一种键值对数据库,我们之前学习的 mysql 它是持久层的关系型数据库,而 redis 它的存储主要存在 内存 中。我们都知道在 内存 中的数据读取是非常快的,就好比你把一个变量存到磁盘读取和直接放到代码中运行,肯定是在代码中拿到的速度快,因为运行时期,都是直接存到内存的。

    给大家总结一下:

    有了基本的概念之后,我们下面进行环境搭建,在学习阶段,安装 redis 很简单,生产环境一般我们也会选择云产品,一切为了服务保障,虽说它只是做缓存用,但也是系统的一把 保护伞

    如果你是 mac 用户,你可以运行如下命令:

    安装完成后会提示你运行命令,运行即可。

    win 用户也很简单,直接下载 redis 软件,双击运行即可,运行之后它会有一个小方块的图案,和 locahost:6379 的log,说明运行成功了。初始阶段没有配置的 redis 默认 host 就是本地, port 就是 6379 , 而且是 没有密码 就可以访问的。

    推荐一个客户端软件 Redis Desktop Manager ,它是 redis 的客户端界面软件,方便面我们学习的时候 清理缓存 使用,生产慎连。

    我们不给大家讲它的基本命令使用,它也有语法,可以通过类似命令执行,如果想学习的小伙伴,可以自行搜索。本期重点内容是在 sprinboot 中的使用,我们平时开发不可能是去命令行里敲的,都是代码里执行,而目前市面上有很多封装好的库,我们可以直接调用它的方法,很方便的就可以操作它了,不用记一些繁琐的命令,下面我们就实际操作一下:

    修改 pom.xml

    修改 application.yml :

    redis 默认是有 16 个库,不是 15 个啊,从 0 开始算的,我们随便连一个

    通过代码很好理解, 首先需要引入 StringRedisTemplate ,然后需要设置一个 key ,那么思考一下,这个 key 允许重复吗

    我们进客户端看一下,发现 key 还是只有一个,但是值变成了新的值了,所以可以得知 key 是唯一的,我们重新设置的时候相当于刷新了它。

    redis 中删除缓存有两种方式,一种是自我消亡,也就是 过期 销毁,还有有一种是 主动 销毁,我们先看一下,过期时间如何设置

    我们设置了 10s 后过期,过完10s后发现,这个```key data``消失了。我们在看看如何主动删除

    我们可以利用 Redis 做一个计数器,实现自增功能,你可以用它做网站访问统计

    通常做法,我们会把它封装一下,后续使用直接引入封装好的即可,把它直接交给 Springboot容器 管理

    其实这个类,你还可以继续进一步封装,比如约束 key 的规范,约束过期时间,约束数据类型等等,这一切也都是为了规范和后期维护,防止滥用缓存

    缓存的主要场景是用于解决热点数据问题,因为这些数据是访问频率比较高的,当大量的请求进来, mysql 可能压力很大,这样一来,数据查询效率就很慢,用户肯不高兴等了,这样用户体验很不好。所以我们一般做法,都是把这些热点数据放到缓存里,因为缓存读取速度很快。当有新数据的时候,我们再及时更新它,一般流程是先查询缓存,查到了直接返回缓存数据,查不到再走数据库,然后再刷回缓存。

    但是并发足够大的时候,还是会暴露出很多问题,比如面试常问的一些高频问题 缓存雪崩、缓存穿透、缓存雪崩 ,这些问题后边会给大家专门讲,和如何去防范。所以总的来说,引入任何一门技术并不是万事大吉,还需我们不断的在实践中积累经验

    本期到这里就结束了,总结一下,我们了解了什么是 redis ,以及在 springboot 中如何去使用它们,很简单,没什么复杂的东西。但这里想多说一点的是,缓存的设计却是很复杂的,因为工具是死的,人是活的,我们如何正确设计,需要我们在项目中不断的积累。

    我们之前教大家查询列表数据,都是所有数据返回,还没有教大家如何去做分页,下期将带大家学习一下 mybatis 分页插件的使用 ,下期不见不散, 关注我,不迷路~

    关于网上教学系统的问题,通过《springBoot是什么?》、《SpringBoot进阶之缓存中间件Redis》等文章的解答希望已经帮助到您了!如您想了解更多关于网上教学系统的相关信息,请到本站进行查找!

    本文标签:网上教学系统(1)

    相关阅读

    • SpringBoot在线教育系统,附源码

    • 158文章网范文示例
    • 今天小编给各位分享网上教学系统的知识,文中也会对其通过SpringBoot在线教育系统,附源码和SpringBoot核心原理:自动配置、事件驱动、Condition等多篇文章进行知识讲解,如果文章内容
    关键词不能为空

    范文示例_作文写作_作文欣赏_故事分享_158文章网