Spring开发实战,李兴华原创编程图书
  DzeAR5woCouH 2023年11月15日 33 0

Spring是现代Java开发之中被大规模采用的开发框架,并且在该框架的基础上扩展出了无数个技术分支,被技术界的友人称为“Spring全家桶”,在开发者已经掌握了Java与JavaWEB基础上可以进行Spring框架的学习。

在本书之中会从零开始为读者详细的进行Spring开发框架的原理分析,并且通过一系列的案例讲解了Spring开发应用的基础模型,并基于此模型进行了不断的应用结构扩展,除了核心的IoC&DI、AOP技术之外,还讲解了SpringJDBC、事务处理框架、SpringDataJPA、SpringCache以及常见的RabbitMQ消息组件于SpringAMQP服务整合。

除了核心的技术实现之外,本书也针对于当前Java面试中常见的问题进行了总结,同时通过功能管理的设计方式进行了Spring之中的核心源码解读,为后续的SSM框架开发、SpringBoot、SpringCloud打下了坚实的学习基础。

本书附有配套视频、源代码、习题、教学课件等资源。为了帮助读者更好地学习本书,作者还提供了在线答疑。

本书适合作为高等教育本、专科院校计算机相关专业的教材,也可供广大计算机编程爱好者自学使用。

Spring开发实战,李兴华原创编程图书_Java

在Java发展的历史过程之中,总是伴随有大量的开发框架存在,而在这些开发框架中最为著名的就是Spring开发框架,所以当我要开始编写Spring图书的时候我自己也曾犹豫过,毕竟Spring全家桶包含有太多的技术层次,同时又要兼顾面试、开发与学习的需要,很明显这不是一本图书可以写完的,即便写完了,可能页数也将达到1300页以上。

 

Spring开发实战,李兴华原创编程图书_Java_02

图0-1 Spring图书划分


为了可以帮助读者更加全面的掌握Spring开发技术,在本系列中将Spring的核心知识分为了四本图书进行讲解,如图0-1所示,而本书就是学习后续Spring技术的基础知识,当读者学习完SpringBoot课程的时候就已经具备了就业能力。但是如何可以帮助读者轻松的学会Spring这一门技术呢?实际上这也是我在近20年的教学生涯中始终在思考的问题,技术本身就是抽象的,如果继续使用抽象的文字继续去描述抽象的概念,很明显对所有读者都是不公平的,对于自己的教育生涯也是不负责任的表现。


“把知识更简单的教授给学生“,是我对自己的核心要求,但是图书的创作不是讲课,可以随意的扩展,可以面对面的进行疑问的解答。在图书的创作过程中,首先要做的就是给出明确的学习目标,而后就是进行概念准确无误的表述,最后则是通过大量的图形和案例进行技术的清晰描述与实现,但是即便做到了这样的地步,我们在创作中依然还是不满意,为了增加图书的可读性,又追加了大量的提示、注意以及问答环节,通过这样一系列的努力,来让每一位读者学的轻松,学的明白,最重要的是可以将这些技术直接转化为工作中的生产力。

 

Spring开发实战,李兴华原创编程图书_JPA_03

众所周知Java技术体系的庞大,而在整个Java开发之中,掌握Spring开发框架仅仅只能够实现程序层次上的开发,但是要想从一个普通的初学者发展到Java程序员,再到Java架构师,其中也需要开发者学习不少的技术知识,所以才有了本系列的图书,如图0-2所示。我们编写这套图书的原动力就是希望每一位技术爱好者都可以通过自己的努力,学习到实用技术,而后成功进入到软件开发的工作领域。


学习Java是自学好?还是参加Java培训机构进行学习呢?这是在我职业教学生涯中见到最多的问题,实际上在早期技术要求相对简单的时候,进入培训机构参加Java学习可以很快的掌握Java语言的应用技能,但是由于时间短,有可能在你还未能完全领会Java核心设计思想的时候,课程就已经结束了,虽然你可以具备一定的开发能力,但是由于天生短板的存在,会导致职业发展之路并不是那么的顺畅,而且在当今的就业环境中,此类问题会更加的突出,所以我们才努力将已有的教学经验和开发经验全部整理成书,鼓励大家在大学通过自学的方式掌握Java编程技术,这样不仅掌握的知识牢固,还能够积攒大量的代码调错经验,而这样的人才也更加受当今就业企业的喜爱,但是自学之路是坎坷的,而成果是喜人的,我们能做的就是为您指引学习的方向,让每位学生少走弯路。


本书是一本系统的讲解Spring课程的技术图书,书中的章节核心思想来自于Spring官方学习文档,同时又追加了我个人对Spring技术的理解,本书一共分为11个章节,具体章节的安排如下:

第01章、Spring前世今生:全面的分析了传统Java、JavaWEB以及JavaEE开发中的种种弊端,并介绍了Spring开发框架的主要特点以及框架的应用架构;

第02章、Spring控制反转:通过一个基础的Java程序的使用,进行了Spring设计思想的分析,并基于Gradle实现了项目的构建,通过具体的应用案例分析了IoC的使用特点,SpringTest测试整合,以及Logback日志处理。

第03章、Bean管理与依赖注入:全面分析DI技术的使用特点,包括Bean对象的实例化处理、对象依赖注入管理操作,同时分析了如何使用基于Annotation注解扫描的配置方式实现Bean依赖管理;

第04章、Spring资源管理:为了简化IO操作的难度,Spring提供了资源管理的支持,通过资源管理操作可以实现字符串路径的匹配处理;

第05章、Spring表达式语言:Spring为了增强字符串的应用,提供了SpEL支持结构,本章主要分析了SpEL的基本使用,核心源码的解读,并基于其表达式的语法使用实现了Profile资源注入的处理。

第06章、Spring核心源码解读:Spring的核心源代码是现代Java面试中必备的一项,为了可以帮助读者更好的理解源代码,本章从功能设计的角度对代码进行层层剖析,由浅入深的方式实现了Spring启动过程的分析,以及注解配置分析。

第07章、AOP切面编程:Spring中的动态代理实现支持,可以基于AspectJ表达式实现代理配置,同时又通过AOP的源代码分析了JDK动态代理与CGLib动态代理在Spring中的实现;

第08章、SpringJDBC与事务处理:JDBC是项目开发的核心重点,SpringJDBC对已有的JDBC进行了轻量级的封装,同时提供了HikaiCP数据库连接池的支持,在本章中分析了如何使用JdbcTemplate实现数据CRUD处理,并重点分析了Sping的事务组成架构,以及如何基于AOP方式实现声明式事务管理。

第09章、SpringDataJPA:JPA是JakartaEE的数据层开发技术标准,其标准可以基于Hibernate组件实现,本章中完整的分析了此标准的实现,并通过具体的案例分析讲解了JPA查询、JPA缓存、JPA锁、JPA数据关联,并在最后全面分析了SpringDataJPA的实现特点,以及如何使用SpringDataJPA简化数据层开发定义。

第10章、Spring整合缓存服务:开发中会存在有多种不同的数据源,而为了更加方便的实现缓存的管理,Spring框架扩展了SpringCache服务组件,在本章中为读者分析了Caffeine缓存组件的使用,由于缓存牵扯到的许多算法会在面试中出现,所以本章又对Caffeine的核心设计思想进行了分析,最后又分别讲解了ConcurrentHashMap缓存、Caffeine缓存以及Memcached缓存在SpringCache中的整合处理。

第11章、Spring整合AMQP消息服务:为了可以达到削峰填谷功能,项目开发中一般都会引入消息组件,在本章中讲解了稳定可靠的RabbitMQ组件,从该组件的安装、配置一直讲解到其应用,并通过SpringAMQP的支持实现了消息生产者与消费者程序的开发。


本书的学习主要是以Spring的核心组成为主,而后基于该组成结构又进行了常用应用结构的使用分析,而这些讲解的技术都是当今企业流行的开发技术,对于每一位Java程序人员都非常的重要。除了内容详尽之外,本书也包含如下特点:

1、 图示清晰:为了帮助读者轻松的跨过技术学习的难关,更好的理解架构的思想以及技术的本质,本书会采用大量的图形进行分析,全书的图形覆盖率达到了平均每节0.8个,几乎每一个小节都会提供有图形解释;

2、 注释全面:初学者对于技术的学习难免会出现空白点,为了便于读者理解程序代码,在全书中出现的代码覆盖率达到了99%以上,真正帮助了为学习者扫平障碍的目的;

3、 案例实用:所有的案例均来自实际项目开发中的应用架构,不仅方便读者学习,同时也为工作带来全面帮助;

4、 层次分明:每一节技术知识,都会根据需要划分为“掌握、理解、了解”三个层次,便于读者安排学习顺序;

5、 就业面试:Spring中源代码实现部分以及概念的使用部分会存在有大量的面试问题,我们对这些面试的知识进行了反向设计,以增加对应的章节,可以说本书就是Spring的面试宝典;

6、 视频全面:每一个小节的知识都包含有一个完整的视频讲解,通过手机扫码可以解决你学习中出现的各种问题;

7、 结构清晰:按照知识点的作用进行结构设计,充分的考虑到了学生认知模式的需要,降低学习难度;

8、 架构领先:基于Gradle构架工具与IDEA开发工具进行讲解,符合当今企业技术的使用标准;

9、 无障碍阅读:对可能产生的疑问、相关概念的扩展,都会通过“提示、注意、问答”进行说明;

10、 教学支持:高校教师凭借教师资格可以向出版社申请教学PPT、教学大纲以及教学自测习题。

11、 代码完整:每一节的课程均提供有代码文件或者是项目工程文件,并保证代码可以正常运行;


最后的最后我想说的是,因为写书与各类的公益技术直播,我错过了许多与我孩子和家人欢聚的时光,我内心感到非常的愧疚,但是我希望不久的未来我能为我的孩子编写一套属于他自己的编程类图书,帮助所有有需要的孩子进步,因为我喜欢研究编程技术,也勇于自我突破,如果你也是这样的一位软件工程师,也希望加入到我们这个公益技术直播的行列之内,让我们抛开所有的商业模式的束缚,一起将自己学到的技术传播给更多的爱好者,以我们微薄之力推动整个行业的技术发展,就如同我说过的,教育的本质是分享,并不是赚钱的工具。


图书目录:

第1章、Spring前世今生 1

1.1、Java与WEB开发 1

1.2、JavaEE标准架构 2

1.3、Spring简介 3

1.4、Spring设计架构 4

1.5、本章概览 5


第2章、Spring控制反转 1

2.1、Java原生实例化对象管理 1

2.1.1、工厂设计模式与对象实例化 3

2.1.2、基于配置文件管理使用类 4

2.2、Spring编程起步 6

2.2.1、编写第一个Spring应用 10

2.2.2、SpringTest运行测试 11

2.2.3、Spring整合Logback日志组件 12

2.3、本章概览 14


第3章、Bean管理与依赖注入 1

3.1、Bean的依赖注入 1

3.1.1、使用p命名空间实现依赖注入 3

3.1.2、构造方法注入 4

3.1.3、自动装配 6

3.1.4、prototype原型设计模式 8

3.1.5、Bean延迟初始化 10

3.2、注入数据集合 11

3.2.1、注入Set集合 13

3.2.2、注入Map集合 13

3.2.3、注入Properties集合 15

3.3、Annotation自动装配 16

3.3.1、基于Annotation实现Bean注册 18

3.3.2、Configuration注解 20

3.3.3、Qualifier注解 22

3.3.4、DependsOn注解 24

3.3.5、Conditional注解 24

3.3.6、Profile注解 26

3.3.7、ComponentScan注解 29

3.4、本章概览 29


第4章、Spring资源管理 1

4.1、资源读取 1

4.1.1、Resource资源读取 2

4.1.2、ClassPathResource 3

4.1.3、WritableResource 5

4.1.4、资源读写与NIO支持 6

4.2、ResourceLoader 7

4.2.1、Resource资源注入 8

4.2.2、路径通配符 10

4.3、本章概览 11


第5章、Spring表达式语言 1

5.1、定义并使用Spring表达式语言 1

5.1.1、SpEL解析原理 2

5.1.2、ParserContext与表达式分隔符 4

5.2、SpEL基本表达式 5

5.2.1、SpEL字面表达式 5

5.2.2、SpEL数学表达式 6

5.2.3、SpEL关系表达式 6

5.2.4、SpEL逻辑表达式 7

5.2.5、SpEL三目运算符 8

5.2.6、SpEL字符串处理表达式 8

5.3、Class表达式 9

5.4、表达式变量操作 10

5.5、List集合表达式 12

5.6、Map集合表达式 15

5.7、SpEL整合Spring配置 17

5.7.1、基于Annotation使用SpEL 18

5.7.2、Profile配置与SpEL处理 19

5.8、本章概览 20


第06章、Spring核心源码解读 1

6.1、Spring属性管理 1

6.1.1、PropertySource属性源 1

6.1.2、PropertySources属性源管理 3

6.1.3、PropertyResolver属性解析 4

6.2、Spring运行环境管理 6

6.2.1、ConfigurableEnvironment配置环境管理 6

6.2.2、Environment与Profile管理 8

6.2.3、ConversionService转换服务 10

6.3、ApplicationContext结构分析 11

6.3.1、EnvironmentCapable 13

6.3.2、ApplicationEventPublisher事件发布器 14

6.3.3、MessageSource与国际化资源管理 16

6.3.4、PropertyEditor属性编辑器 18

6.4、Bean生命周期管理 21

6.4.1、InitializingBean和DisposableBean 23

6.4.2、JSR-250注解管理生命周期 25

6.4.3、Lifecycle生命周期处理规范 26

6.4.4、SmartLifecycle生命周期扩展 28

6.4.5、SmartInitializingSingleton回调处理 30

6.5、BeanDefinitionReader 32

6.5.1、XmlBeanDefinitionReader 33

6.5.2、ResourceEntityResolver 33

6.5.3、BeanDefinition 35

6.5.4、BeanDefinitionParserDelegate 36

6.6、BeanFactory 38

6.6.1、ListableBeanFactory配置清单 39

6.6.2、ConfigurableBeanFactory获取单例Bean 41

6.6.3、Bean创建 42

6.6.4、ObjectProvider 44

6.6.5、FactoryBean 46

6.7、BeanFactoryPostProcessor 48

6.7.1、BeanFactoryPostProcessor结构解析 50

6.7.2、EventListenerMethodProcessor自定义事件处理 51

6.7.3、CustomEditorConfigurer属性编辑器配置 53

6.7.4、PropertySourcesPlaceholderConfigurer属性资源配置 54

6.7.5、ConfigurationClassPostProcessor配置类解析 55

6.8、BeanPostProcessor初始化处理 57

6.8.1、Bean初始化流程 58

6.8.2、Aware依赖注入管理 59

6.8.3、ApplicationContextAwareProcessor 62

6.9、Spring容器启动分析 63

6.9.1、刷新Spring上下文 66

6.9.2、StartupStep 67

6.9.3、prepareRefresh()刷新预处理 70

6.9.4、obtainFreshBeanFactory()获取BeanFactory 71

6.9.5、prepareBeanFactory()预处理BeanFactory 73

6.9.6、initMessageSource()初始化消息资源 75

6.9.7、initApplicationEventMulticaster()初始化事件广播 76

6.9.8、registerListeners()注册事件监听器 77

6.9.9、finishBeanFactoryInitialization()初始化完成 78

6.10、Annotation扫描注入源码解读 79

6.10.1、ClassPathBeanDefinitionScanner扫描处理 80

6.10.2、AnnotatedBeanDefinitionReader配置类处理 82

6.10.3、BeanDefinitionReaderUtils工具类 84

6.11、本章概览 84


第7章、AOP切面编程 1

7.1、AOP编程模型 1

7.1.1、AOP简介 2

7.1.2、AOP切入点表达式 3

7.1.3、AOP基础实现 4

7.2、AOP配置深入 6

7.2.2、通知参数接收 7

7.2.3、后置通知 8

7.2.3、环绕通知 9

7.2.4、基于Annotation实现AOP配置 12

7.3、AOP源码解读 14

7.3.1、@EnableAspectJAutoProxy注解 15

7.3.2、AspectJAutoProxyRegistrar 16

7.3.3、AnnotationAwareAspectJAutoProxyCreator 19

7.3.4、createProxy()创建代理对象 21

7.4、本章概览 23


第8章、SpringJDBC与事务处理 1

8.1、SpringJDBC 1

8.1.1、DriverManagerDataSource 2

8.1.2、HikariCP数据库连接池 4

8.2、JdbcTemplate操作模版 6

8.2.1、JdbcTemplate数据更新操作 8

8.2.2、KeyHolder 10

8.2.3、数据批处理 11

8.2.4、RowMapper 13

8.3、Spring事务管理 16

8.3.1、Spring事务处理架构 17

8.3.2、编程式事务控制 18

8.4、Spring事务组成分析 20

8.4.1、事务隔离级别 22

8.4.2、事务传播机制 26

8.4.3、只读事务控制 29

8.5、Spring声明式事务管理模型 30

8.5.1、@Transactional注解 30

8.5.2、AOP切面事务管理 32

8.5.3、Bean事务切面 34

8.6、本章概览 36


第9章、SpringDataJPA 1

9.1、JPA编程起步 1

9.1.1、JPA编程起步 3

9.1.2、JPA连接工厂 7

9.1.3、DDL自动更新 9

9.1.4、JPA主键生成策略 10

9.2、JPA数据操作 13

9.2.1、JPQL语句 15

9.2.2、JPQL数据更新 18

9.2.3、SQL原生操作 20

9.2.4、Criteria数据操作 21

9.3、JPA数据缓存 26

9.3.1、JPA一级缓存 26

9.3.2、JPA对象状态 28

9.3.3、JPA二级缓存 30

9.3.4、JPA查询缓存 33

9.3.5、CacheMode 35

9.4、JPA锁机制 36

9.4.1、JPA悲观锁 37

9.4.2、JPA乐观锁 40

9.5、JPA数据关联 41

9.5.1、一对一数据关联 41

9.5.2、一对多数据关联 45

9.5.3、多对多数据关联 49

9.6、SpringDataJPA 52

9.6.1、SpringDataJPA编程起步 54

9.6.2、Repository接口 59

9.6.3、Repository方法映射 62

9.6.4、CrudRepository数据接口 64

9.6.5、PagingAndSortingRepository数据接口 66

9.6.6、JpaRepository数据接口 67

9.7、本章概览 68


第10章、Spring整合缓存服务 1

10.1、Caffeine缓存组件 1

10.1.1、手工缓存 2

10.1.2、缓存同步加载 4

10.1.3、异步缓存 5

10.1.4、驱逐策略 7

10.1.5、缓存数据删除与监听 12

10.1.6、CacheStats 13

10.2、Caffeine核心源码解析 15

10.2.1、Caffein数据存储结构 17

10.2.2、缓存数据存储源码分析 19

10.2.3、频次记录源码分析 22

10.2.4、缓存驱逐源码分析 25

10.2.5、TimerWheel 29

10.3、SpringCache 30

10.3.1、ConcurrentHashMap缓存管理 34

10.3.2、@Cacheable详解 36

10.3.3、Caffeine缓存管理 37

10.4、SpringCache缓存管理策略 38

10.4.1、缓存更新策略 38

10.4.2、缓存清除策略 40

10.4.3、多级缓存策略 41

10.5、Memcached分布式缓存 43

10.5.1、Memcached数据操作命令 45

10.5.2、Spring整合Memcached 46

10.5.3、SpringCache整合Memcached缓存服务 49

10.6、本章概览 52


第11章、Spring整合AMQP消息服务 1

11.1、AMQP与RabbitMQ 1

11.1.1、配置wxWidgets组件库 3

11.1.2、配置ErLang开发环境 4

11.1.3、RabbitMQ安装与配置 5

11.2、RabbitMQ程序开发 6

11.2.1、创建消息生产者 7

11.2.2、创建消息消费者 9

11.2.3、消息应答 11

11.2.4、消息持久化 12

11.2.5、虚拟主机 14

11.3、发布订阅模式 16

11.3.1、fanout广播模式 16

11.3.2、direct直连模式 18

11.3.3、topic主题模式 21

11.4、Spring整合RabbitMQ 23

11.4.1、RabbitMQ消费端 25

11.4.2、RabbitMQ生产端 29

11.4.3、消费端注解配置 32

11.4.4、对象消息传输 34

11.4.5、消息批处理 36

11.5、RabbitMQ集群服务 38

11.5.1、搭建RabbitMQ服务集群 40

11.5.2、RabbitMQ集群镜像配置 42

11.5.3、RabbitMQ集群程序开发 43

11.6、本章概览 45


图书配套视频列表:

0101_【理解】Java与WEB开发 WEB开发是Java的主要应用形式,可以充分发挥出Java处理性能,本课程带领读者回顾了WEB开发的优势,并分析了Java与WEB处理性能之间的重要联系。


0102_【理解】JavaEE标准架构 JavaEE定义了完善的WEB开发架构,以及符合其运行环境的容器设计标准,本课程为读者讲解了JavaEE标准架构中的核心组件。


0103_【理解】Spring简介 Spring是为了构建轻量级项目应用而提供的开发框架,本课程为读者解释了轻量级的概念,同时分析了Spring框架在项目中的主要作用。


0104_【理解】Spring设计架构 Spring开发框架除了满足了基本的工厂与代理设计要求之外,还提供有大量的服务组件,本课程通过Spring官方文档为读者介绍了Spring的设计架构。


0201_【掌握】对象实例化的本质操作 关键字new是Java提供的最常用的一个关键字,同时也是在项目开发中使用最多的一个关键字,可是一个良好的使用习惯会决定了你代码的编写质量和运行稳定性,本课程从宏观的角度分析了关键字new对象实例化所带来的设计问题。


0202_【掌握】工厂设计模式与对象实例化 为了实现对接口子类的封装,可以通过工厂设计模式实现子类的隐藏,本课程将探索对象实例化模式的改进,并基于反射实现了工厂设计模式。


0203_【掌握】基于配置文件管理使用类 如果要想进行有效的对象管理,则可以基于配置文件的方式完成,同时考虑到JVM中的垃圾回收问题,则要进行对象的统一管理,本课程对已有的工厂设计模式应用继续进行修改,重点说明了容器在项目中的作用,并利用代码进行了简单的实现。


0204_【掌握】搭建Spring项目 为了便于管理Spring以及其相关的各种依赖,需要通过构建工具进行项目的搭建,本课程将基于Gradle工具为读者讲解如何搭建Spring开发环境,同时实现了父子项目模块的搭建,为后续开发打下了基础。


0205_【掌握】编写第一个Spring应用 基于Gradle的项目可以方便的实现所需依赖库的配置管理,本课程将通过具体的代码编写实例,为读者讲解一个Spring项目的基本结构。


0206_【掌握】SpringTest运行测试 完整的项目除了实现功能之外,还需要保证代码执行的正确性,所以在真实项目中一定要对代码的功能进行测试,本课程为读者讲解了Spring与JUnit5的整合应用。


0207_【掌握】Spring整合Logback日志组件 Spring本身提供了详细的日志机制,开发者只需要配置正确的日志组件就可以使用,本课程讲解了日志的作用,并通过具体操作实现了Spring与Logback组件整合。


0301_【掌握】Bean的依赖注入 在项目中会存在不同的Bean对象间的耦合关联问题,在本课程中为读者分析了这种关联问题存在的形式,并通过具体的配置讲解了这一关联关系在配置文件中的定义。


0302_【理解】使用p命名空间实现依赖注入 为了简化Spring配置文件定义的长度,在Spring中提供了p命名空间的支持,本课程通过具体的操作实例为读者分析了p命名空间的作用以及具体实现。


0303_【理解】构造方法注入 构造方法可以实现对象实例的属性初始化配置,所以在Spring中也提供了通过构造注入来代替Setter注入的操作形式,本课程通过具体的代码进行了该实现的分析。


0304_【理解】自动装配 考虑到配置简化的问题,在Spring中支持引用类型的自动装配处理,可以根据名称、类型实现自动的依赖关联,本课程为读者分析了自动装配的实现操作,同时讲解了如何进行候选优先启用的操作实现。


0305_【理解】prototype原型设计模式 原型设计模式是一种高效的对象创建管理方式,其基于对象克隆技术实现,本课程为读者分析了原型设计模式的实现结果,并基于Spring实现了原型配置模型。


0306_【理解】Bean延迟初始化 为了提升Spring的启动性能,可以将暂时不需要的Bean进行延迟化处理,Spring配置文件提供了专属的lazy-init属性,本课程通过实例说明了该属性的作用。


0307_【理解】注入数据集合 Spring中设置了数据集合的注入管理操作,可以通过数组或List集合实现接收,本课程通过具体的实例讲解了数据集合的注入操作。


0308_【掌握】注入Set集合 Spring提供了方便的集合注入管理,除了List之外也可以实现Set数据集合的注入,本课程对已有代码进行修改,通过Set类型实现了配置类对象的存储。


0309_【掌握】注入Map集合 Map集合实现了二元偶数据集合存储,本课程对已有的操作代码进行了修改,基于Map集合实现了集合数据的注入操作。


0310_【掌握】注入Properties集合 属性是一种特殊的集合,可以实现相关配置项的定义,本课程讲解了在Spring中属性的配置以及Properties对象实例的注入。


0311_【掌握】Annotation自动装配简介 Annotation自动装配是一种更加灵活的配置形式,基于扫描包与注解的整合可以减少配置文件的使用,本课程为读者分析了传统Spring项目开发的问题与解决方案。


0312_【掌握】基于Annotation实现Bean注册 理解注解自动配置的实现操作最佳的做法,是基于原始的设计分层的方式进行说明,本课程通过一套完整的实例,为读者分析了Bean扫描注册实现处理。


0313_【掌握】Configuration注解 在Spring中如果要想彻底取代掉配置文件的存在,则还要提供自定义Bean的注册操作,本课程为读者讲解了如何通过配置类,并结合“@Configuration”与“@Bean”两个注解的整合实现Bean的手工配置与注册。


0314_【掌握】Qualifier注解 Spring容器中经常会因为不同的配置环境而产生相同类型的Bean实例,这样就会在注入时出现无法准确匹配的问题,本课程为读者分析了此种情况对项目的影响,并讲解了如何通过“@Qualifier”和“@Primary”注解来解决此类问题。


0315_【掌握】DependsOn注解 在一些特殊环境下,不同的Bean之间会存在有依赖关系的定义,所以在Spring中提供了@DependsOn注解以实现先后关系的配置,本课程讲解了该注解的具体使用。


0316_【理解】Conditional注解 Spring配置的Bean之间一般会存在有注入关联,在注入关联时也需要动态的考虑是否存在有指定的关联Bean存在的问题,所以提供了Conditional条件注解,本课程通过具体的分析实例讲解了该注解的使用。


0317_【理解】Profile注解 为便于不同的运行环境管理,在Spring中直接提供了Profile配置支持,本课程为读者分析了Profile配置的意义,并且通过具体的操作对这一功能进行了展示。


0318_【理解】ComponentScan注解 扫描注册是Spring项目开发中最为重要的技术,所以在Spring内部也可以通过配置类提供的@ComponentScan注解来实现,本课程为读者分析了这一机制的具体应用。


0401_【理解】Resource作用分析 在实际的项目中很多的项目资源不一定会保存在应用之中,而是有可能存在于各个位置,本课程为读者分析了项目应用过程中对于资源读取的思考,并且分析了Spring框架所提供的Resource接口的组成。


0402_【掌握】Resource资源读取 资源的读取是项目中的核心所在,在Resource接口中为了解决资源读取问题,提供了相关的实现子类,本课程为读者分析了这些子类的作用,并且通过具体的代码实现了内存资源、File资源以及网络资源数据的读取。


0403_【掌握】ClassPathResource 对于应用的外部资源来讲即便不使用Spring也是便于资源读取的,但是对于应用之中资源(即:CLASSPATH资源)则读取会非常的麻烦,而这正是Spring资源操作的特点,本课程通过实例为读者分析了ClassPathResource子类的使用及其实现形式。


0404_【掌握】WritableResource Spring3.x版本之后为了进一步实现Resource资源管理,提供了WritableResource写入资源管理的统一支持,本课程通过具体的案例为读者讲解了该接口的使用


0405_【掌握】资源读写与NIO支持 随着性能的话题被越来越多的提及,Spring开发框架对于资源的管理也进行了NIO的改造,提供了与NIO相关的处理方法,本课程为读者分析了Resource与Channel的关系,并通过具体的代码讲解了实例开发。


0406_【掌握】ResourceLoader 为了进一步体现Spring解耦和的设计思想,在Spring中提供了ResourceLoader,利用该接口可以实现Resource接口实例的获取,同时可以基于字符串的方式来进行资源操作的标记,本课程为读者分析了ResourceLoader的作用与具体应用。


0407_【掌握】Resource资源注入 ResourceLoader提供了资源匹配符的统一解析处理,这样就可以基于Spring的Bean管理机制实现资源的注入配置,本课程通过实例讲解了如何通过XML配置文件实现Resource接口实例的注入操作。


0408_【掌握】路径通配符 除了可以实现单个资源定位之外,Spring也提供了路径通配符的形式实现一组资源的定位处理,本课程为读者讲解了Ant路径通配符在Spring资源定位中的使用,并通过具体的操作实现了所有jar文件中的资源匹配处理。


0501_【理解】Spring表达式基本使用 Spring表达式拥有一套完整的处理机制,不仅需要字符串的配合也需要有相关的工具类支持,本课程直接利用Spring内置的表达式处理类讲解了Spring表达式的基本使用,并展示了相关支持类的操作特点。


0502_【理解】SpEL解析原理 Spring中的表达式语言编程功能十分强大,同时考虑到代码的维护效果,也进行了设计层次上的设计,本课程通过一个简单的表达式计算案例,为读者分析了SpEL的解析与执行处理流程。


0503_【理解】ParserContext与表达式分隔符 为了便于表达式的编写,往往会提供有边界符的定义,考虑到用户需求的不同,SpEL支持自定义边界符的定义,并提供了ParserContext接口,本课程为读者说明了该接口的作用,并通过ExpreesionParser整合了自定义边界符的定义。


0504_【理解】SpEL字面表达式 字面表达式指的就是字符串之中直接定义的内容,该内容可能是各种类型,也可以进行各种数学的缩写,本课程通过实力分析了这些字面表达式的使用。


0505_【理解】SpEL数学表达式 数学计算是一个常见的表达式操作,在SpEL内部支持有Java提供的数学计算表达式,本课程为读者通过实例演示了这些数学计算表达式的使用。


0506_【理解】SpEL关系表达式 关系表达式可以直接进行字面值的内容大小比较,SpEL对关系表达式也提供了全面的实现标记,本课程通过具体的案例为读者讲解了SpEL关系表达式的使用。


0507_【理解】SpEL逻辑表达式 逻辑表达式可以实现多个关系表达式的结果连接,SpEL对Java的逻辑表达式提供了有效的实现处理,本课程通过具体的案例对这些逻辑表达式进行了讲解。


0508_【理解】SpEL三目运算符 Java中的三目是种简化的赋值运算符,也是种较为常用的运算符,SpEL也提供了三目运算符的使用支持,本课程分析了传统的三目运算以及Elivis运算符的改进操作。


0509_【理解】SpEL字符串处理表达式 字符串是Java应用最广泛的数据类型,同时也提供有多种字符串的处理方法,SpEL可以通过表达式来直接实现字符串操作方法的定义,极大的简化了字符串的处理方式,本课程将通过具体的案例进行常用操作的讲解。


0510_【理解】Class表达式 反射是Java语言设计的灵魂所在,而Spring可以基于字符串的形式实现反射机制的相关操作,本课程通过实例为读者讲解了该操作的使用。


0511_【理解】表达式变量操作 SpEL表达式的灵活之处在于可以直接进行变量的定义,并且利用变量实现不同数据内容的设置,本课程为读者分析了自定义变量、根变量的作用,并且通过一系列具体的案例分析了变量如何实现内容替换、反射处理、null处理的实现。


0512_【理解】List集合表达式 List集合可以实现待输出数据的存储处理,在SpEL之中可以通过字符串定义List集合,也可以实现外部List集合数据修改操作,本课程通过案例对这一功能进行了讲解。


0513_【理解】Map集合表达式 Map集合实现了二元偶对象的存储,SpEL中可以通过表达式变量与外部Map集合建立关联,随后采用key的形式进行内容的获取与修改处理,本课程使用了一系列的案例对SpEL的Map集合操作进行了讲解。


0514_【理解】配置文件中整合SpEL SpEL的出现极大的丰富了字符串的代码功能,同时也可以在配置文件中使用,本课程将基于Spring配置文件实现属性的注入,并基于SpEL实现属性内容的处理。


0515_【掌握】基于Annotation使用SpEL 为了简化Spring配置文件的代码,SpEL也可以直接结合@Value注解进行内容处理后的属性注入操作,本课程通过具体的实例为读者讲解了这一功能的使用。


0516_【掌握】Profile配置与SpEL处理 profile是项目能够在不同环境下运行的重要配置资源,在Spring中支持有资源配置项的导入与读取处理,本课程将这一功能与SpEL整合以实现属性的动态配置。


0601_【理解】PropertySource属性源 项目中资源是重要的数据存储结构,为了便于所有资源的统一获取,在Spring框架中提供了PropertySource操作标准,本课程为读者分析了这一设计的意义,并通过具体的案例讲解了该类的使用。


0602_【理解】PropertySources属性源管理 为便于多个不同属性源的统一操作,Spring提供了PropertySources操作接口,本课程将对此接口的使用进行分析,同时利用具体的代码进行了案例实现。


0603_【理解】PropertyResolver属性解析 Spring中对于需要解析处理的文本有多种类型,而为了统一解析的操作,提供了专属的PropertyResolver接口,本课程为读者分析了该接口的使用,同时该接口也是后续解读Spring核心源代码中所使用到的核心知识。


0604_【理解】ConfigurableEnvironment配置环境管理 JavaSE中的System类实现了整个系统运行属性的管理,在Spring中为了统一属性资源,提供了ConfigurableEnvironment接口,本课程通过实例分析了该接口的使用。


0605_【理解】Environment与Profile管理 Spring内置了多环境管理的支持,而多环境的管理内部是基于Environment接口实现的,本课程通过原生代码的形式,为读者分析了基于Annotation启动的应用上下文的使用,以及配置类的动态注册与Profile切换管理。


0606_【理解】ConversionService数据转换服务 程序的开发中经常需要进行各类数据转换的处理,Spring为便于用户的灵活操作,内置了转换器的支持,本课程为读者分析了转换器的作用以及相关接口的使用。


0607_【理解】ApplicationContext继承结构 ApplicationContext是Spring中的重要处理机制,本课程为读者分析了该接口的基本使用流程,并通过FileSystemApplicationContext子类实现本地磁盘文件的配置解析。


0608_【理解】EnvironmentCapable Environment提供了当前应用环境的支持,在ApplicationContext中为了便于环境的管理,提供了EnvironmentCapable接口,本课程对这一接口的定义及使用进行了分析。


0609_【理解】ApplicationEventPublisher事件发布器 事件型驱动应用是解耦和设计的常见做法,Spring对Java已有的事件处理模型,做了进一步的简化处理,本课程将通过ApplicationEventPublisher接口对这一扩展的功能进行实际案例分析。


0610_【理解】MessageSource资源读取 为了便于程序的配置管理,在开发中会大量的使用资源文件,为此在Spring中提供了MessageSource接口以实现资源返回与国际化应用,本课程通过具体的应用案例,为读者分析了资源数据读取与国际化使用配置。


0611_【理解】PropertyEditor属性编辑器 属性的注入管理是Spring中的重要技术支持,但是在实际的开发中属性的配置可能多种多样,为了便于属性内容的处理,提供了PropertyEditor属性编辑器,本课程讲解了属性编辑器的作用,并通过具体的资源配置进行了实例操作的讲解。


0612_【理解】Bean的初始化与销毁 为了便于对象的管理,Spring中扩充了传统Java对象的生命周期操作,提供了自定义生命周期的初始化与销毁操作,本课程通过实例为读者讲解了如何基于Spring配置文件实现自定义生命周期方法的使用与触发管理。


0613_【理解】InitializingBean和DisposableBean XML配置文件的方式虽然方便简单,但是所定义的初始化和销毁处理并不符合于程序开发的规范,所以在Spring中提供了InitializingBean初始化与DisposableBean销毁接口,本课程通过实例为读者分析了这两个接口存在的意义与具体使用。


0614_【理解】JSR-250注解管理生命周期 为了进一步实现解耦和的设计需求,Spring支持了JSR-250的注解规范,这样就避免了严格的接口实现要求,本课程通过实际案例为读者分析了核心注解的使用,同时讲解了@Autowired与@Resource注解的区别。


0615_【理解】Lifecycle生命周期处理规范 Lifecycle是在Spring 2.0时提出的生命周期控制接口,该接口定义了Bean的初始化与销毁操作规范,并且与Spring容器紧密结合,本课程通过实际的应用案例,为读者分析了该接口的具体应用。


0616_【理解】SmartLifecycle生命周期扩展 项目开发中一般会存在有若干个不同的Bean,为了可以对不同的Bean进行有效的生命周期维护,提供了SmartLifecycle子接口,本课程分析了该接口的组成特点,并且通过具体的实例讲解了该接口的具体应用以及与上下文操作方法之间的关联。


0617_【理解】SmartInitializingSingleton回调处理 SmartInitializingSingleton是一种Bean自身的回调处理,在Bean单例配置的环境下,可以实现Bean初始化后的回调处理操作,本课程讲解了该接口具体应用案例。


0618_【理解】BeanDefinitionReader简介 基于XML配置方式启动的Spring容器,需要对XML文件进行解析处理,为了此操作的标准化处理,提供了BeanDefinitionReader接口,本课程对该接口的功能进行了介绍,同时分析了该接口的关联结构以及常用方法。


0619_【理解】XmlBeanDefinitionReader 为便于读者理解BeanDefinitionReader接口的具体使用,本次将利用Spring内置的实现子类对该接口的功能进行说明,并通过一个具体的案例实现了bean元素处理。


0620_【理解】ResourceEntityResolver 标准的XML解析处理需要基于DTD或XSD规范进行处理,为了支持此规范的处理,Spring提供了EntityResolver接口,本课程讲解了该接口的继承结构,并根据XML配置文件提供的publicId和systemId获取到了目标XML的解析规范。


0621_【理解】BeanDefinition Spring中为了便于所有注册Bean的定义,提供了BeanDefinition处理接口用于描述Bean的定义信息,本课程为读者分析了该接口的定义结构以及基本使用。


0622_【理解】BeanDefinitionParserDelegate Spring中对XML文件最为重要的支持就是准确的解析处理,为此提供了专属的解析工具类,本课程对这一工具类的使用进行了使用结构上的分析,并利用该工具类对给定的资源进行了DOM解析处理。


0623_【理解】BeanFactory BeanFactory是Spring之中Bean对象的管理工厂类,所有在Spring容器中保存的对象实例均可以通过该接口获取,本课程为读者分析了BeanFactory的基本实现结构,并对Spring中的单例实现进行了应用分析。


0624_【理解】ListableBeanFactory Spring容器中需要维护大量的Bean对象,如果要想获取这些配置Bean的详细信息,则可以使用ListableBeanFactory接口,本课程为读者分析了该接口的组成结构,并且通过具体的实例分析了该接口中主要方法的使用。


0625_【理解】ConfigurableBeanFactory获取单例Bean Spring容器中会保存有两种类型Bean的获取,一个是单例结构,另外一个是原型结构,为了更准确的描述单例结构的管理,Spring提供了ConfigurableBeanFactory接口,本课程分析了该接口的关联结构与实际操作。


0626_【理解】Bean创建 BeanFactory最为重要的功能就是Bean的创建与管理,所以针对于Bean的创建提供了专属的AutowireCapableBeanFactory接口,本课程通过源码解读的形式,分析了该接口中提供的Bean创建方法的使用。


0627_【理解】ObjectProvider Spring中所有Bean的使用往往都会通过BeanFactory完成,为了便于用户更方便的进行Bean管理,提供了ObjectProvider功能接口,本课程为读者分析了该接口的使用,并且通过了具体的操作案例,讲解了如何通过ObjectProvider获取Bean实例。


0628_【理解】FactoryBean FactoryBean是进行对象批量获取的工厂接口标准,同时该接口也被BeanFactory所管理,本课程为读者分析了FactoryBean的具体应用形式,并基于BeanFactory实现子类中的方法源码进行了该接口的使用分析。


0629_【理解】BeanFactoryPostProcessor Spring中维护的Bean实例,在一些特殊的环境下会存在有动态修改的逻辑需要,所以提供了BeanFactoryPostProcessor处理接口,本课程分析了该接口的作用,通过具体的案例进行了实际讲解,并分析了该操作处理的核心源代码。


0630_【理解】BeanFactoryPostProcessor结构解析 BeanFactoryPostProcessor实现了BeanFactory回调处理操作,本课程通过Spring源代码为读者分析了该操作接口的核心执行流程,并总结了其与SmartInitializingSingleton接口的实现区别


0631_【理解】EventListenerMethodProcessor自定义事件处理 事件是Spring中重要的解耦和机制,本课程分析了EventListenerMethodProcessor事件方法处理器的源代码,总结了EventListenerFactory与EventListener注解的关联。


0632_【理解】CustomEditorConfigurer属性编辑器配置 属性编辑器是Spring提供的重要的资源注入扩展功能,而该功能与BeanFactory的整合操作,是由CustomEditorConfigurer类完成的,本课程分析了该类的源代码定义。


0633_【理解】PropertySourcesPlaceholderConfigurer属性资源配置 Spring实现了资源文件的直接属性初始化的处理操作,而这些操作的背后也都是基于BeanFactoryPostProcessor接口的功能实现的,本课程分析了资源处理的相关实现类,并且分析了BeanDefinitionVisitor类的使用。


0634_【理解】ConfigurationClassPostProcessor配置类解析 Spring支持有注解的环境配置,为了便于所有注解解析的操作需要,在Spring的内部提供了ConfigurationClassPostProcessor,本课程为读者分析了该类的继承结构,并基于源码解读的方式分析了ConfigurationClassParser类中的注解解析处理。


0635_【理解】BeanPostProcessor初始化处理 BeanPostProcessor是针对于Bean初始化管理结构而设计的拦截机制,本课程为读者介绍了该接口的作用与方法功能,并通过一个实际的案例分析了该接口与Spring容器中全部Bean之间的关联。


0636_【理解】Bean初始化流程 Spring提供了Bean的统一管理,但是随着Spring版本的不断更新,也加入了众多的生命周期控制操作,本课程对已经学习过的生命周期控制操作进行了归类,并通过具体的案例分析了这些操作结构的执行顺序。


0637_【理解】Aware依赖注入管理 Spring最大的特色在于依赖管理结构的使用,而为了可以明确的实现依赖管理的配置标记,Spring提供了Aware处理接口,本课程通过具体的实例为读者分析了Aware接口的实际使用,并介绍了Spring内置的Aware接口实现子类的作用。


0638_【理解】ApplicationContextAwareProcessor 系统内置了许多的Aware子接口,Spring为了解决BeanPostProcessor子类定义过多的设计问题,提供了ApplicationContextAwareProcessor实现类,本课程通过该类的源代码为读者分析了系统Bean实例的注入操作。


0639_【理解】Spring配置文件路径处理 基于配置文件启动的Spring容器是最为常见的一种类型,而这就需要通过特定的类进行处理,本课程为读者解读了配置文件解析的源代码。


0640_【理解】刷新Spring上下文 容器刷新是整个Spring启动的重要一步,本课程为读者宏观的介绍了refresh()方法之中的主要作用,并介绍了AbstractApplicationContext与其他结构之间的关联。


0641_【理解】StartupStep Spring提供了ApplicationStartup以及StartupStep应用步骤记录标准,本课程为读者分析了该标准的设计目的,并通过具体的实例实现了自定义了记录器的应用开发。


0642_【理解】prepareRefresh()刷新预处理 Spring容器启动的第一步需要对当前的环境做一些准备,所以提供了prepareRefresh()处理方法,本课程对该方法中的源代码组成结构进行了分析。


0643_【理解】obtainFreshBeanFactory()获取BeanFactory BeanFactory是Spring容器初始化的关键核心,所以容器启动时需要进行XML解析处理,而后才可以实现Bean的注册配置,本课程分析了obtainFreshBeanFactory()方法的使用结构,以及与XmlBeanDefinitionReader类之间的关联定义。


0644_【理解】prepareBeanFactory()预处理BeanFactory BeanFactory是Spring容器初始化的关键核心,所以容器启动时需要进行XML解析处理,而后才可以实现Bean的注册配置,本课程分析了obtainFreshBeanFactory()方法的使用结构,以及与XmlBeanDefinitionReader类之间的关联定义。


0645_【理解】initMessageSource()初始化消息资源 MessageSource是Spring提供的消息读取接口标准,Spring容器在启动时会进行该资源接口的实例化处理,本课程为读者分析了initMessageSource()源代码与类实现结构。


0646_【理解】initApplicationEventMulticaster()初始化事件广播 Spring中的所有自定义事件都需要进行广播发布处理,所以在Spring容器初始化过程中也需要初始化事件广播器,本课程为读者分析了initApplicationEventMulticaster()方法的源代码定义,并对其关联结构类进行了说明。


0647_【理解】registerListeners()注册事件监听器 监听器在Spring中需要注册后才可以生效,本课程通过Spring上下文刷新中提供的registerListeners()方法,为读者分析了事件监听器的注册实现机制。


0648_【理解】finishBeanFactoryInitialization()初始化完成 Spring中需要通过配置文件进行属性内容的配置,所以在启动时必须为当前的容器提供ConversionService以及StringValueResolver接口实例,本课程对BeanFactory初始化的最后一步方法进行了源码解读。


0649_【理解】AnnotationConfigApplicationContext核心结构 注解扫描配置是当今Spring开发中主要采用的形式,本课程通过完整的继承结构,为读者分析了AnnotationConfigApplicationContext类的基本结构。


0650_【理解】ClassPathBeanDefinitionScanner扫描处理 AnnotationConfigApplicationContext在使用时可以通过scan()方法定义扫描包,而Spring为了便于扫描处理提供了ClassPathBeanDefinitionScanner类,本课程通过源代码分析了ClassPathBeanDefinitionScanner类之中doScan()方法的作用。


0651_【理解】AnnotatedBeanDefinitionReader配置类处理 Spring为了方便注解配置,可以由开发者根据需要手工进行配置类的定义,本课程分析了AnnotationConfigApplicationContext类中的register()方法执行流程。


0652_【理解】BeanDefinitionReaderUtils工具类 在AnnotationConfigApplicationContext类中提供的scan()与register()两个方法中,最终实现BeanDefintion注册的类均为BeanDefinitionReaderUtils,本课程通过该类的核心源代码为读者分析了该类中注册方法的实现。


0701_【理解】AOP产生动机 技术的产生与发展都需要存在有必要的条件,AOP技术的产生是基于代理结构实现的,而为了便于读者理解,本次课程将基于JDK原生代理模式进行实现问题分析。


0702_【理解】AOP简介 AOP是动态代理设计模式的一种实现,也是Spring的核心概念,本课程为读者分析了AOP编程开发之中的相关概念,并介绍了Spring中对AOP的两种实现方案。


0703_【掌握】AOP切入点表达式 AOP实现的核心是需要有一个代理的切入点机制,而在Spring之中使用了AspectJ表达式组件实现切入点配置,本课程为读者分析了表达式的核心操作语法结构。


0704_【掌握】AOP基础实现 AOP实现需要使用特定的程序包才可以启用,本课程为读者分析了相关依赖库的作用,同时基于XML配置文件的方式通过具体的案例实现了一个AOP应用。


0705_【掌握】AOP代理实现模式 代理设计模式在Java中有两种实现,而在Spring之中考虑到了项目应用环境的变化,同时支持有两种代理的支持,本课程为读者分析了proxy-target-class属性的作用。


0706_【掌握】通知参数接收 业务功能在进行代理处理时,不可能只是简单的进行内容的输出,还需要考虑到业务方法执行参数的接收问题,本课程基于切面表达式和处理方法实现了参数的配置。


0707_【掌握】后置通知 后置通知可以实现业务处理调用后的切面控制,在AOP编程中考虑到不同的场景,后置通知被分为三种类型,本课程通过实例为读者分析了这三种后置通知的使用。


0708_【掌握】环绕通知 环绕通知提供了与原始代理结构类似的处理模式,可以基于环绕通知实现所有的通知处理效果,本课程为读者分析了环绕通知的使用特点,以及具体实现。


0709_【掌握】基于Annotation实现AOP配置 基于XML方式实现的AOP定义,虽然可以实现切面编程,但是对于代码的维护较为困难,考虑到当今“零配置”的设计思想,可以基于Annotation来实现AOP的定义,本课程为读者讲解了AOP的常用注解,并通过具体案例进行了这一实现的说明。


0710_【掌握】AOP注解启用 除了使用XML配置的方式进行AOP启用之外,Spring也提供了注解启用的配置形式,为了便于读者更好的理解AOP的源码分析,本课程将对已有的代码进行修改,在应用程序和SpringTest中将基于注解类的形式实现AOP环境启用。


0711_【掌握】@EnableAspectJAutoProxy注解 @EnableAspectJAutoProxy注解是SpringAOP的配置核心,在该注解中定义了两个配置属性,本课程主要讲解了exposeProxy属性以及与AOPContext的操作关联。


0712_【理解】AspectJAutoProxyRegistrar AspectJAutoProxyRegistrar是AOP实现过程中最为重要的代理类实例的注册管理类,本课程基于EnableAspectJAutoProxy注解分析了其与AspectJAutoProxyRegistrar类之间的关联定义,并通过对该类的源代码与DEBUG调试形式,实现Spring内置代理创建类实例的创建流程分析。


0713_【理解】AnnotationAwareAspectJAutoProxyCreator AnnotationAwareAspectJAutoProxyCreator是AOP中代理对象的创建管理器,也是整个AOP实现的关键,本课程分析了BeanFactory中getBean()实现操作中的调用流程,以及AbstractAutoProxyCreator类创建代理对象的处理流程。


0714_【理解】createProxy()创建代理对象 AbstractAutoProxyCreator类之中提供了createProxy()代理对象的创建方法,而代理对象的创建也需要区分当前的AOP配置形式,本课程通过该方法的源代码对这一操作的执行流程进行分析。


0801_【理解】SpringJDBC简介 JDBC是Java提供的一项服务技术,但是传统的JDBC由于需要进行标准步骤的拆分处理,所以代码的编写并不灵活,本课程从宏观的角度分析了JDBC技术所存在的问题,同时为读者解释了ORMapping设计模式的含义,并简述了SpringJDBC技术。


0802_【理解】DriverManagerDataSource SpringJDBC实现数据开发管理过程中需要提供有效的数据库连接,而为了便于连接管理,在Spring中使用DriverManagerDataSource实现了封装,本课程为读者讲解了该类的定义结构以及相关操作方法的使用。


0803_【掌握】HikariCP数据库连接池 数据库连接池是一种较为常见的JDBC性能提升解决方案,现代的开发中可以使用HikariCP数据库连接池组件进行管理,同时Spring也可以无缝衔接此组件,本课程通过实际操作讲解了此连接池组件的配置与使用。


0804_【理解】JdbcTemplate操作模版 SpringJDBC中为了简化JDBC的操作,提供了JdbcTemplate模版支持类,该操作实现了对原始JDBC操作的轻量级包装,本课程将基于DataSource实例实现JdbcTemplate对象实例化以及SQL更新命令的执行。


0805_【掌握】JdbcTemplate数据更新操作 JdbcTemplate除了可以使用SQL命令更新之外,也可以基于占位符的方式进行更新预处理操作,本课程讲解了JdbcTemplate中的数据更新操作实现。


0806_【掌握】KeyHolder 自动增长列是一种较为常见的数据表的操作结构,在JdbcTemplate模版中提供了自动获取增加数据ID的支持,本课程将对这一功能的实现进行讲解。


0807_【掌握】数据批处理 批处理是项目开发中性能提升的有效解决方案,在SpringJDBC中也提供有与之匹配的功能,本课程讲解了批处理操作的实现以及相关处理方法的使用。


0808_【掌握】RowMapper 数据查询操作机制之中需要考虑返回值的处理问题,为此在SpringJDBC中提供了RowMapper转换接口,本课程讲解了此接口的作用,并通过具体案例进行了实现。


0809_【掌握】JDBC事务控制 事务是业务正确处理的唯一保证,同时在JDBC之中又提供了完整的事务处理操作方法,本课程针对于事务的传统做法以及存在的问题进行了分析。


0810_【掌握】Spring事务处理架构 考虑到事务处理的重要性,Spring对事务实现架构进行了新的实现,本次的课程中会为读者详细的展示事务处理相关的接口,并对接口的作用进行讲解。


0811_【掌握】编程式事务控制 为了帮助读者理解Spring事务的基本处理模型,本课程将基于原始硬编码的形式实现JdbcTemplate事务管理,通过此讲解可以快速理解Spring事务操作的基本模型。


0812_【掌握】TransactionStatus Spring每开启一个事务都会返回TransactionStatus事务状态对象实例,开发者可以基于此操作实现事务状态的判断以及SavePoint的配置,本课程通过具体的实例为读者讲解了TransactionStatus接口的相关使用分析。


0813_【掌握】事务隔离级别 一个数据库的操作业务处理过程之中,往往会牵扯到多条数据的操作,这样就有可能出现数据同步问题,在Spring中提供了事务隔离级别,本课程将为读者分析事务隔离级别的意义,并通过实际的程序讲解了其具体的使用。


0814_【掌握】事务传播属性 显示开发中由于需要考虑不同的业务场景,必然会出现不同事务操作之间的互相调用问题,为了解决此时的事务管理,Spring提供了事务传播机制,本课程为读者分析了事务传播机制的作用,并讲解了Spring中七种事务传播机制的作用。


0815_【掌握】只读事务控制 业务设计之中会存在有大量的查询需求,而为了可以更好的保护查询业务的安全,可以实现只读事务的控制,本课程为读者讲解了只读事务的作用与具体案例实现。


0816_【掌握】@Transactional注解 要想简化事务的硬编码实现,首先需要解决的就是事务相关规则的定义,这一操作可以通过Transactional注解来进行配置,本课程讲解了该注解的组成结构,并且依据具体的操作讲解了该注解的实际应用。


0817_【掌握】AOP切面事务管理 为了避免硬编码的事务结构,在Spring中提供了声明式事务管理,直接基于XML配置文件可以实现事务管理器、隔离级别以及传播机制的配置,本课程讲解了这种声明式编程事务的实现优势,并通过具体业务操作案例进行了这一概念的实现。


0818_【掌握】Bean事务切面配置 新的Spring提倡零配置的方式,所以对于AOP的事务管理,就可以采用Bean形式进行定义,本分析了tx命名空间所涉及到的配置类关联结构,并且依据该结构采用切面配置Bean的方式实现了事务管理定义。


0901_【掌握】JPA简介 JPA是JavaEE提供的数据层操作执行标准类库,利用此标准可以规范化Java数据库开发应用的实现,本课程为读者分析了JPA的产生背景,以及相关实现场景。


0902_【掌握】JPA编程起步 JPA主要基于数据层进行代码的开发编写,为了便于读者理解JPA的组成结构以及编程模型,本课程将通过一个具体的数据库增加操作实例,为读者进行JPA使用分析。


0903_【理解】JPA连接工厂 JPA开发中需要进行一系列的操作步骤才可以获取到EntityManager实例,为了进一步简化这一操作,可以基于ThreadLocal实现EntityManager的统一管理,为便于后续的课程讲解,本课程将对已有程序的结构进行重新设计,定义JPA连接工厂类。


0904_【理解】DDL自动更新 JPA考虑到了数据库移植性的数据表管理问题,提供了程序的DDL支持,开发者可以通过PO类的结构动态创建或更新已有的表结构,本课程为读者分析了这一操作存在的意义,并通过具体的代码进行了该操作的实现。


0905_【理解】JPA主键生成策略 主键是数据表中的核心列结构,JPA在设计时充分的考虑到了各种应用操作的可能性,提供了不同的主键策略,本课程为读者分析了这些策略的使用,并通过具体的实例分析了TABLE策略的应用。


0906_【掌握】EntityManager数据操作 JPA实现了数据层的开发支持,而数据层的处理操作主要以数据的CRUD为主,本课程通过实例为读者讲解了EntityManager接口所提供的数据操作方法的使用。


0907_【掌握】JPQL语句 为了便于开发者实现更加繁琐的数据查询处理,在JPA规范内部提供了JPQL语法支持,该语法类似于SQL语句的编写,本课程为读者讲解了JPQL的语法结构,并通过实例分析了JPQL的查询操作实现。


0908_【掌握】JPQL数据更新 为便于用户操作结构的扩展,在Query中提供了数据更新的操作,本课程为读者分析了EntityManager接口提供的数据更新处理所存在的性能问题,并且通过实例实现了数据的修改以及删除操作。


0909_【掌握】SQL原生操作 JPA支持SQL原生数据查询,可以直接针对于指定的数据库实现SQL处理以及PO转换操作,本课程为读者讲解了这种数据操作机制的实现。


0910_【掌握】Criteria数据查询 为了进一步规范面向对象的设计结构,在JPA中提供了Criteria的操作支持,本课程为读者分析了Criteria相关操作的实现结构,并通过案例讲解了如何基于Criteria操作模式实现数据的查询与更新操作。


0911_【掌握】JPA一级缓存 JPA内置了数据缓存处理,并且默认会开启一级缓存配置,本课程为通过内置的find()方法为读者演示了一级缓存的使用。


0912_【掌握】JPA对象状态 JPA的数据操作是以实体对象的形式展开的,所以在JPA内部定义了四种实体对象的状态,并提供了对象状态转换的处理方法,本课程为读者讲解了对象实体状态的作用以及转换操作,同时分析了JPA中的批处理操作存在的问题与解决之道。


0913_【掌握】JPA二级缓存 二级缓存可以实现多个操作线程之间的数据共享处理,在JPA中需要开发者手工配置,本课程为读者分析了二级缓存和一级缓存之间的差别,并且基于EHCache组件实现了本地磁盘二级缓存的启用。


0914_【掌握】JPA查询缓存 二级缓存的开启默认只是针对于EntityManager操作有效,而为了进一步扩大二级缓存的应用,还需要进行查询缓存的配置,本课程分析了默认情况下Query查询的使用问题,并通过persistence.xml的配置和HINT_CACHEABLE实现了查询缓存的使用。


0915_【掌握】CacheMode 为了可以进一步进行不同Session的缓存操作,JPA提供了CacheMode缓存类型配置,可以依据需要进行缓存读写的处理逻辑,本课程为读者讲解了JPA中的缓存模式分类与作用,并通过具体的程序进行了功能展示。


0916_【掌握】JPA数据锁 考虑到多线程并发的处理环境,在JPA中提供了锁机制,本课程为读者分析了数据锁的实现意义,并讲解了两种数据锁的主要特点。


0917_【掌握】JPA悲观锁 考虑到多线程并发的处理环境,在JPA中提供了锁机制,本课程为读者分析了数据锁的实现意义,并讲解了两种数据锁的主要特点。


0918_【掌握】JPA乐观锁 乐观锁是一种程序逻辑处理锁,基于版本号的方式进行并发更新保护,本课程为读者分析了乐观锁与悲观锁机制的区别,并通过具体的案例讲解了乐观锁的实现。


0919_【理解】一对一数据关联 考虑到数据库的处理性能以及数据分类管理,开发中可以将一张完整的数据表拆分为若干个组成部分,形成一对一结构的配置,本课程为读者分析了一对一设计的意义,并通过JPA实现了一对一数据的更新与查询操作。


0920_【理解】一对多数据关联 一对多关联是数据库设计中较为常见的一种结构,JPA提供了@OneToMany的注解用于该结构的实现,本课程通过实例讲解了该关联结构的使用与数据抓取问题分析。


0921_【理解】多对多数据关联 多对多是较为复杂的表关联设计,在设计中需要引入中间的关联存储表,而在JPA中会自动帮助用户进行该数据表的数据维护,本课程通过具体的实例讲解了多对多关联技术在实际开发中的作用,以及JPA中的配置实现。


0922_【掌握】SpringDataJPA简介 为了简化数据层开发的难度,Spring通过SpringDataJPA技术进行了操作封装,本课程为读者讲解了SpringDataJPA技术的主要特点以及项目开发结构,并完整的分析了SpringDataJPA中提供的LocalContainerEntityManagerFactoryBean类的作用。


0923_【掌握】SpringDataJPA编程起步 为了便于读者更好的理解SpringDataJPA技术的使用,在本课程中将通过一个完整的案例为读者讲解相关的配置实现,基于数据层的开发了数据增加与查询功能。


0924_【掌握】Repository接口 如果要想使用SpringDataJPA开发,那么就必须遵守其开发标准,所以提供了标准化数据操作接口Repository,本课程在已有项目的基础上对功能进一步完善,提供了完整的数据CRUD操作的实现。


0925_【掌握】Repository方法映射 为了进一步简化查询的开发操作,SpringDataJPA提供了Repository方法映射的处理支持,本课程为读者列举了方法映射关键字以及方法映射的操作实现。


0926_【掌握】CrudRepository数据接口 CRUD是业务设计开展的核心所在,为了减少重复的数据层方法定义,SpringDataJPA又提供了CrudRepository子接口,该接口内置了多种操作方法,本课程将进一步修改已有的DAO接口,使其基于CrudRepository接口实现数据操作功能。


0927_【掌握】PagingAndSortingRepository数据接口 为了便于数据分页查询的操作,SpringDataJPA提供了PagingAndSortingRepository子接口,本课程分析了该接口相关操作结构的组成,并实现了具体的分页查询。


0928_【掌握】JpaRepository数据接口 每一个内置的SpringDataJPA的接口都有各自的功能,所以为了解决接口继承繁琐的问题,Spring提供了JpaRepository综合接口,本课程基于此接口实现了数据层开发。


1001_【理解】Caffeine缓存概述 缓存是一种提升应用性能的技术手段,几乎所有的项目开发中都会使用到该技术,本课程为读者分析了缓存的作用以及与实际开发之间的设计联系。


1002_【掌握】手工缓存 Caffeine提供了构建器的操作模式,用于进行缓存对象的创建管理,本课程为读者讲解了Cache接口的作用,并对其的相关的继承结构进行了分析,并且通过具体的操作案例讲解了缓存数据的存储与获取操作。


1003_【掌握】缓存同步加载 考虑到缓存性能的影响,某些不经常访问的数据会自动失效,为了解决缓存数据不存在的重新配置问题,Caffeine提供了同步加载机制,本课程将通过实例进行实现讲解。


1004_【掌握】异步缓存 为了解决程序开发中同步加载所带来的阻塞问题,Caffeine提供了异步加载机制,并且提供了异步加载的专属接口,本课程为读者分析了异步加载机制的处理流程,并且通过具体的案例讲解了异步加载机制的实现。


1005_【掌握】缓存数据驱逐 缓存是需要进行内存空间划分的,同时为了保证整个JVM的运行性能,就需要对缓存的数据进行有效的驱逐,本课程为读者通过实例分析了缓存驱逐的相关操作。


1006_【掌握】缓存数据删除与监听 缓存中的数据一般都是允许被删除的,为了便于删除后的缓存项可以执行一些额外的处理操作,Caffeine也提供了删除监听的支持,本课程通过具体案例讲解此操作实现。


1007_【掌握】CacheStats Caffeine提供了缓存数据访问记录的支持,并且提供了记录的操作接口与统计结果接口,本课程为读者讲解了这些操作接口之间的关联以及缓存统计数据的获取。


1008_【掌握】缓存驱逐算法 缓存的实现一般都需要依据特定的算法完成,本课程为读者介绍了常见的缓存实现算法,并且重点分析了Caffeine中的W-TinyLFU算法的主要特点。


1009_【理解】Caffeine数据存储结构 缓存除了数据保存之外,最重要的就是进行数据查询与更新处理,本课程为读者分析了Caffeine之中核心的存储结构,并重点描述了节点与Map集合之间的关联。


1010_【理解】缓存数据存储源码分析 数据存储是缓存操作的核心功能,同时存储又具有数据的更新能力,本课程通过Cache接口的put()方法进行源代码的逐层剖解,并且分析了Caffenine类创建缓存中的结构配置以及与数据存储操作之间的关联。


1011_【理解】频次记录源码分析 为了尽可能创造公平的缓存结构,TinyLFU需要基于频次进行缓存驱逐的计算,本课程通过afterWrite()、afterRead()操作方法为读者分析了缓存频次的处理逻辑。


1012_【理解】缓存驱逐源码分析 缓存结构在实际开发中存在有不同的存储区域,这些区域的大小有着内置的定义,本课程为读者分析了不同缓存区的数据驱逐策略的源代码实现。


1013_【理解】TimerWheel 超时驱逐是缓存的核心策略,在Caffeine之中对于超时驱逐又提供了丰富的支持,本课程为读者分析了超时驱逐方法与具体清除策略的实现源代码。


1014_【掌握】SpringCache组件概述 现实开发中会存在有大量的缓存服务,每一种缓存都有各自不同的算法与实现结构,而Spring提供了SpringCache组件,可以实现这些组件的统一整合,本课程从宏观的角度为读者介绍了SpringCache的作用,并定义了基础的程序实现结构。


1015_【掌握】ConcurrentHashMap缓存管理 为便于缓存的管理,在SpringCache中提供了专属的缓存注解,本课程通过具体的实例操作讲解了Spring缓存的配置启用、CacheManager的作用以及@Cacheable注解的使用,并通过业务方法的调用与SQL日志进行了基础缓存作用的分析。


1016_【掌握】@Cacheable详解 @Cacheable是SpringCache的核心注解,在该注解之中提供有大量的配置属性,可以实现缓存的有关控制,本课程通过一系列的实例讲解了该注解中核心属性的作用。


1017_【掌握】Caffeine缓存管理 虽然SpringCache提供了默认的缓存实现,但是考虑到缓存性能,在开发中还是建议使用Caffeine组件,本课程在已有应用上进行了修改,实现了Caffeine组件整合。


1018_【理解】缓存更新策略 为了便于数据更新的维护,Spring提供了@CachePut数据更新注解,本次将结合业务层中的数据修改操作,实现缓存更新操作功能。


1019_【理解】缓存清除策略 缓存数据与实体数据分别处于不同的保存介质之中,为了避免业务处理由于数据不同步所造成的偏差,在Spring中提供了缓存清除支持,本课程为读者分析了缓存数据滞留存在的问题,并通过具体的操作实例进行了缓存清除功能的实现。


1020_【理解】多级缓存策略 考虑到不同业务实现的需要,Spring提供了@Caching多级缓存配置注解,该注解可以整合缓存更新、清除以及查询策略,本课程为读者讲解了该注解的具体使用。


1021_【理解】Memcached缓存概述 单机版缓存适合于快速简单的业务开发,然而在一些高并发的应用场景下,考虑到数据服务的公共性,就需要引入分布式的缓存组件,本课程为读者分析了单机缓存与分布式缓存的区别,并对Memcached进行了介绍。


1022_【理解】Memcached数据操作命令 为便于数据管理,在Memcached数据库内部也提供了一系列的操作命令,本课程通过具体的实例,为读者分析了常用命令的使用。


1023_【理解】Spring整合Memcached Memcached提供了方便的Java操作工具类,并且该类很容易与Spring整合在一起,本课程通过具体的操作实例为读者分析了Memcached客户端的使用。


1024_【理解】SpringCache整合Memcached缓存服务 SpringCache提供了统一的服务接入接口,本课程将对这些接口的实现关联以及具体作用进行说明,并基于提供的缓存接口实现了Memcached缓存服务的整合,将其应用于具体的业务数据缓存操作之中。


1101_【理解】AMQP协议简介 消息组件在开发中较为常见,基于消息组件开发的应用可以更好的实现解耦和设计,所以提出了AMQP协议,本课程为读者讲解了AMQP协议的基本概念,同时分析了AMQP协议的分层以及相关的核心应用概念。


1102_【掌握】配置wxWidgets组件库 wxWidgets是一款开源的图形组件,属于ErLang配置的核心组件库,在本课程中为读者介绍了该组件的作用,并且通过具体的步骤讲解了如何在Linux系统中进行该组件编译所需环境的配置,并具体演示了该组件编译与安装操作。


1103_【掌握】配置ErLang开发环境 ErLang是构建RabbitMQ运行服务的基础环境,同时也与RabbitMQ的版本紧密绑定,本课程为读者讲解了如何获取ErLang源代码程序包,并基于Linux环境实现了该程序源代码的编译处理。


1104_【掌握】RabbitMQ安装与配置 有了ErLang的环境支持,就可以进行RabbitMQ的服务部署操作,本课程通过具体的实现步骤,讲解了单机环境下的RabbitMQ服务搭建,并演示了基础的服务配置命令,以及WEB控制台的启动与访问。


1105_【掌握】RabbitMQ开发核心结构 RabbitMQ实现了AMQP协议之中有关的核心模型,这些模型结构统一在RabbitMQ控制台中有所定义,本课程通过RabbitMQ控制台的功能为读者分析了这些概念的实现,并配置了vhost,并对项目开发所需环境进行了配置。


1106_【掌握】创建消息生产者 消息服务之中消息数据的发送由生产者实现,本课程将为读者分析ampq-client提供的核心程序类的定义结构以及具体应用,并在消息发送完成后通过RabbitMQ控制台观察了当前的服务状态。


1107_【掌握】创建消息消费者 RabbitMQ组件中所保存的数据需要通过消费者应用才可以取出,而为了便于消息的及时获取,消费者往往始终处于打开状态,本课程分析了Consumer接口的作用,并通过实例创建了RabbitMQ消费者应用。


1108_【掌握】消息应答 由于消息系统的非实时性,为了保证消息的可靠传输,就可以基于应答机制进行防护,本课程为读者分析了应答机制的作用,同时基于RabbitMQ的消费端实现了自动应答处理与手工应答处理操作。


1109_【掌握】消息持久化 在网络服务的开发中,节点的故障是不可避免的,而为了保证消息数据的不丢失,就需要启用持久化消息存储,本课程通过实际的演示分析了非持久化存储的消息丢失,以及持久化消息队列的创建。


1110_【掌握】虚拟主机 为了可以区分不同的应用场景,在RabbitMQ之中提供了虚拟主机的配置,不同的虚拟主机可以分配不同的控制权限,本课程为读者分析了虚拟主机的创建,并且通过具体的代码演示了虚拟主机的具体应用。


1111_【掌握】fanout广播模式 广播是消息组件中的常见功能,RabbitMQ中的广播机制,实现主要依靠Exchange交换机的配置模式实现,本课程讲解了消息广播的特点,以及程序代码的实现。


1112_【掌握】direct直连模式 在多系统消息并行的环境之中,为了实现准确的消息投递,可以使用RoutingKey的配置模式,本课程通过实例讲解了RoutingKEY的具体应用。


1113_【掌握】topic主题模式 主题模式是直连模式的拓展应用,基于路由KEY的匹配模式,可以实现不同消息源的数据处理,本课程为读者分析了主题模式的特点,并通过具体案例进行了展示。


1114_【掌握】Spring整合RabbitMQ 虽然RabbitMQ提供了amqp-client的客户端依赖,考虑到代码的维护性,往往需要与Spring框架整合,同时Spring也提供了对AMQP组件的支持,本课程通过实例为读者分析了Spring整合AMQP组件的核心实现,并搭建了项目基础环境。


1115_【掌握】RabbitMQ消费端 Spring中对RabbitMQ的消费端进行了新的开发结构支持,可以基于监听的操作形式实现消息的消费处理,本课程将基于Bean配置的结构讲解RabbitMQ消费端的构建,并实现了消费端监听程序的启动。


1116_【掌握】RabbitMQ生产端 RabbitMQ生产端主要与Exchange有关联,在Spring中为了便于消息生产,提供了AmqpTemplate模版支持,在本课程中为了简化生产处理操作,将基于业务开发的方式进行消息数据的发送,实现与消费端之间的数据传输。


1117_【掌握】消费端注解配置 Spring为了便于消费监听的实现,提供了@RabbitListener配置注解,本课程为读者分析了该注解的组成,同时对已有的程序代码进行修改,实现了注解配置的启用。


1118_【掌握】对象消息传输 对象是Java中的核心组成结构,这样在进行数据传递时,就可以基于序列化的处理结构,实现对象数据的发送与对象数据的消费,本课程通过实例实现了这一机制。


1119_【掌握】消息批处理 对象是Java中的核心组成结构,这样在进行数据传递时,就可以基于序列化的处理结构,实现对象数据的发送与对象数据的消费,本课程通过实例实现了这一机制。


1120_【掌握】RabbitMQ集群架构 消息组件是整个项目架构中的核心组成,当消息服务出现问题后,有可能会引起整个业务流程的混乱,所以在实际的项目开发中就需要提供服务的集群支持,本课程介绍了RabbitMQ中的集群实现方案,并分析了镜像队列实现集群的特点。


1121_【掌握】搭建RabbitMQ镜像集群 RabbitMQ服务集群需要创建若干个服务节点,本课程基于虚拟机的方式进行了节点的配置,同时通过了具体的操作实现了集群服务的配置启用。


1122_【掌握】RabbitMQ集群镜像配置 RabbitMQ集群除了进行节点的关联配置之外,还需要在控制台进行vhost定义、更新策略的定义,本课程通过具体的步骤进行了这一操作的讲解。


1123_【掌握】RabbitMQ集群程序开发 在一个RabbitMQ服务中提供了多个服务节点,所以在程序开发的过程中,就需要对这些节点进行配置,本课程通过实例修改了生产者与消费者应用,实现了集群服务调用,并通过具体的操作演示了节点宕机时集群的高可用机制。





【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   53   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   109   0   0 Java
  8s1LUHPryisj   2024年05月17日   46   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
DzeAR5woCouH