- 博客(94)
- 资源 (2)
- 收藏
- 关注
原创 函数式编程(五)Stream副作用(Side Effects)
在Java 8的Stream中,副作用(Side Effects)是指对外部状态产生影响的操作。由于Stream的设计目标是支持函数式编程风格,强调无状态和不可变性,因此副作用是需要尽量避免的。总之,为了遵循函数式编程的原则,应尽量避免在Stream操作中引入副作用。通过使用纯函数、不可变对象和谨慎使用副作用操作,可以确保Stream的操作具有可预测性、可维护性和可测试性。
2023-09-01 10:50:02
397
原创 函数式编程(四)Stream流使用
在使用stream之前,先理解Optional。Optional是Java 8引入的一个容器类,用于处理可能为空的值。它提供了一种优雅的方式来处理可能存在或不存在的值,避免了空指针异常。OptionalOptional可以包含一个非空的值,也可以表示为空。避免空指针异常:通过使用Optional,可以避免在访问可能为空的值时出现空指针异常。显式判断:使用Optional需要显式地判断值是否存在,以便进行相应的处理。Optional提供了一系列的函数式操作方法,如map()filter()
2023-09-01 10:48:59
259
原创 函数式编程(三)Stream流处理器
Stream是Java 8引入的一个用于处理集合数据的API。它提供了一种流式操作的方式,可以对集合进行过滤、映射、排序、聚合等各种操作,使得代码更加简洁、易读和易维护。Stream提供了一种流式操作的方式,可以对集合中的元素进行连续的操作,而不需要使用传统的循环和条件语句。Stream使用惰性求值的方式,只有在终止操作时才会执行实际的计算。这样可以避免不必要的计算,提高程序的性能。Stream使用内部迭代的方式,隐藏了迭代的细节,使得代码更加简洁和易读。Stream。
2023-09-01 10:40:16
254
原创 函数式编程(二)Lambda表达式
Lambda表达式是Java 8引入的一种函数式编程特性,它可以用于替代匿名内部类或重复的代码块,使代码更加简洁和易读。LambdaLambda表达式的语法由箭头符号(->)分隔为两部分:左侧是参数列表,右侧是方法体。例如,是一个简单的Lambda表达式。Lambda表达式通常与函数接口()一起使用。函数接口是只有一个抽象方法的接口,可以用作Lambda表达式的目标类型。例如,RunnableComparator等都是函数接口。Lambda表达式的参数列表可以为空,也可以包含一个或多个参数。
2023-09-01 10:39:38
194
原创 函数式编程(一)函数接口
函数式接口(Functional Interface):函数式接口是一种只包含一个抽象方法的 Java 接口。必需是Java 接口。有且只有一个抽象方法(函数式方法),但不一定只有一个方法(可包含多个非抽象方法)是可选的,但加上该标注编译器会帮你检查接口是否符合函数接口规范。就像加入@Override标注会检查是否重载了函数一样。定义的函数式接口用于帮助实现 Lambda 函数。比较函数,用于对某些对象集合进行总排序。比较器可以传递给排序方法(如或),以便精确控制排序顺序。
2023-09-01 10:36:19
1126
原创 MySQL大表优化方案
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化:单表优化除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量:字段 尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED VAR
2020-10-29 17:54:24
212
原创 Spring 中的bean 是线程安全的吗?
Java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
2020-10-29 16:22:11
1282
1
原创 Redis缓存穿透、缓存击穿、缓存雪崩
在Redis缓存中有三个必须要知道概念:缓存穿透、缓存击穿和缓存雪崩。缓存穿透那什么是缓存穿透,它就是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。它拿不到数据时,是会一直查询数据库,这样会对数据库的访问造成很大的压力。如:用户查询一个 id = -1 的商品信息,一般数据库 id 值都是从 1 开始自增,很明显这条信息是不在数据库中,当没有信息返回时,会一直向数据库查询,给当前数据库的造成很大的访问压力。这时
2020-10-29 16:08:51
169
原创 springboot整合kafka
背景: 当业务在同一时间出现高并发的时候,这个时候我们不想无限的增加服务器,但是又想提高吞吐量。这时可以考虑使用消息异步处理,进行消峰填谷;同时还可以降低耦合度。常见的消息中间件有kafka,rabbitMQ,activeMQ,rocketMQ。其中性能最好的,吞吐量最高的是以kafka为代表,下面介绍kafka用法。kafka详细原理介绍,参考kafka系列:https://www.cnblogs.com/wangzhuxing/category/1351802.html。一、引入依赖&l
2020-07-02 15:57:05
593
原创 springboot整合redis
一、简介Redis 的数据库的整合在 java 里面提供的官方工具包:jedis,所以即便你现在使用的是 SpringBoot,那么也继续使用此开发包。回到顶部二、redidTemplate操作在 Spring 支持的 Redis 操作之中提供有一个 RedisTemplate 处理程序类,利用这个类可以非常方便的实现 Redis 的各种基本数 据操作。1、引入依赖<dependency> <groupId>org.springframework
2020-07-02 15:55:00
196
原创 springboot集成RestTemplate及常见用法
一、背景介绍 在微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端。我们可以使用JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client, Spring的RestTemplate。这里介绍的是RestTemplate。RestTemplate底层用还是HttpClient,对其做了封装,使用起来更简单。1、什么是RestTemplate?RestTemplate是Spring提供的用于访问R
2020-07-02 15:51:28
1240
1
原创 redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较
一、redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出这个类是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作,当然StringRedisTemplate跟RedisTemplate功能类似那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?其实他们两者之间的区别主要在于他们使用的序列化类。Redis
2020-07-02 15:45:35
1677
转载 @Configuration注解的类的加载(注意不是处理@Configuration注解处理)实现原理
概述这里主要分析@Configuration注解的类自身的加载的实现,即生成该类对应的BeanDefinition,注册到BeanFactory,此时该类就跟一个普通使用了如@Component注解的类一样,是在创建和初始化BeanFactory的过程中完成的。而@Configuration注解的处理是通过ConfigurationClassPostProcessor来完成的,ConfigurationClassPostProcessor是一个BeanFactoryPostProcessor接口实现类。
2020-07-02 15:08:27
1556
转载 Spring基于@Configuration的类配置的内部源码实现
概述 Spring容器启动时,即ApplicationContext接口实现类的对象实例执行refresh方法时,主要是通过执行ConfigurationClassPostProcessor这个BeanFactoryPostProcessor,来开启整个@Configuration注解的系列类的加载的,即开启基于@Configuration的类配置代替beans标签的容器配置的相关bean的加载。 而ConfigurationClassPostProcessor注册到Spring容器的Bea
2020-07-02 14:49:43
170
转载 Spring基于@Configuration的类配置的用法
使用@Configuration来注解类,在类里面包含多个@Bean注解的方法。这些使用@Bean注解的方法,会被加载为BeanFactory里面的BeanDefinition,其中beanName默认为方法名,并且默认会创建对应的bean对象实例,其中bean默认的热加载和单例的。其实@Configuration注解的类,就相当于一个xml配置文件的beans标签。 使@Configuration注解的类生效方式,即被spring容器ApplicationContext感知并加载。 使用Annota.
2020-07-02 14:43:50
859
原创 MySQL百万级数据量分页查询方法及其优化
方法1: 直接使用数据库提供的SQL语句语句样式:MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N 适应场景:适用于数据量较少的情况(元组百/千级) 原因/缺点:全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是从结果集的M位置处取出N条输出,其余抛弃.方法2: 建立主键或唯一索引, 利用索引(假设每页10条)语句样式:MySQL中,可用如下方法: SELEC...
2020-07-02 14:33:13
225
转载 Spring AOP源码分析(三):基于JDK动态代理和CGLIB创建代理对象的实现原理
IOC容器的bean对象创建在之前的文章中已经分析过IOC容器的bean对象的创建过程,具体在:Spring IOC源码分析(七):IOC容器的设计实现与bean对象的创建流程,其中核心方法为AbstractAutowireCapableBeanFactory的createBean:首先检查是否创建了bean的代理对象,如果创建了bean的代理对象则直接返回;否则进入正常bean对象的创建流程,具体在doCreateBean方法定义。 // 代理bean对象创建try { // Give Be
2020-07-01 15:57:05
249
转载 Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现
AOP配置在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP。 AOP配置的核心元素为:pointcut,advisor,aspect,pointcut用于定义需要该辅助功能的类或方法集合;advisor则是将advice和pointcut结合起来,在spring的IOC容器启动时,为pointcut匹配的类生成代理对象,使用拦截器拦截对应的方法的执行,将辅助功能advice添加进去;aspect表示一个完整切面,即在aspec
2020-07-01 15:49:38
276
转载 Spring AOP源码分析(一):AOP与基础接口设计
一、概述SpringAOP设计的主要目的是将多个方法中的公用逻辑抽离出来,封装在一个Interctor拦截器中,然后使用该拦截器对这些方法的调用Invocation进行拦截,从而将这些公用逻辑添加回去,完成一次完整的方法调用。从而实现公用逻辑的复用,避免同一个公用功能的代码重复定义、实现,造成代码冗余。 从应用程序编码到应用程序执行的完整过程来看: 首先在应用代码的方法中定义业务逻辑,然后在xml文件中使用AOP相关的标签描述这个方法或者在这个方法中添加AOP相关的注解,此时应用程序编码层面的.
2020-07-01 15:42:59
155
转载 基于注解@EnableWebMvc启用SpringMvc的用法与实现原理
用法与最佳实践 在@Configuration注解的配置类中添加,用于为该应用添加SpringMVC的功能,即添加之后可以在项目中,可以使用@RequestMapping,@Controller等注解来定义请求处理与请求uri的映射和其他SpringMvc提供的功能。使用方法如下: @Configuration@EnableWebMvc@ComponentScan(basePackageClasses = MyConfiguration.class)public class MyConfi
2020-07-01 15:36:44
485
转载 Spring的构造函数注入的循环依赖问题
一、循环依赖spring的循环依赖主要是指两个类相互之间通过@Autowired自动依赖注入对方,即类A包含一个类B的对象引用并需要自动注入,类B包含一个类A的对象引用也需要自动注入。 对于循环依赖问题,spring根据注入方式的不同,采取不同的处理策略,对于双方都是使用属性值注入或者setter方法注入,则spring可以自动解决循环依赖注入问题,应用程序可以成功启动;对于双方都是使用构造函数注入对方或者主bean对象(Spring在启动过程中,先加载的bean对象)使用构造函数注入,则spri
2020-07-01 15:31:13
2488
转载 Spring的三种依赖注入方式的使用和源码实现分析
一、自动依赖注入的方式注解类型 spring提供了基于注解的属性自动注入特性,其中可以可用的注解包括spring自身提供的@Autowired和@Value,其中@Autowired是我们在项目中最常用来注入对象属性的,@Value注解通常用于注入属性文件properties的值,除此之外还可以使用JSR-330提供的注解@Inject,类型为javax.inject.Inject。如下: @Componentpublic class NettyServer { @Autowire
2020-07-01 15:15:18
278
转载 Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理
注入实现方式@Autowired是spring框架提供的实现依赖注入的注解,主要支持在set方法,field,构造函数中完成bean注入,注入方式为通过类型查找bean,即byType的,如果存在多个同一类型的bean,则使用@Qualifier来指定注入哪个beanName的bean。 与JDK的@Resource的区别:@Resource是基于bean的名字,即beanName,来从spring的IOC容器查找bean注入的,而@Autowried是基于类型byType来查找bean注入的。 与
2020-07-01 15:01:54
329
转载 Spring Bean对象初始化和销毁相关回调的用法和源码实现
一、概述构造后置处理:在spring容器启动,加载并创建bean对象实例的时候调用,通常为在构造bean对象实例,将相关属性赋值好了调用。 销毁前置处理:在spring容器关闭,在销毁其所创建并管理的bean对象实例之前,执行销毁前置处理,通常可以用来释放外部资源等。二、使用方法1. JDK注解方式构造后置处理:使用@PostConstruct注解对应的方法 销毁前置处理:使用@PreDestroy注解对应的方法。可以应用在一个或多个方法上面,但是推荐使用一个方法。方法的可见性没有严格要
2020-07-01 14:58:47
432
转载 Spring源码分析:applicationContext.xml文件解析与NamespaceHandler
applicationContext.xml文件解析Spring容器启动,在创建BeanFactory时,需要加载和解析当前ApplicationContext对应的配置文件applicationContext.xml,从而获取bean相关的配置信息。 在内部实现的调用关系为:ApplicationContext通过XmlBeanDefinitionReader来完成从applicationContext.xml获取应用配置的bean信息,并注册到关联的BeanFactory中。XmlBeanDefi
2020-07-01 14:49:24
303
转载 Spring IOC源码分析(七):IOC容器的对象存储体系与bean对象的加载流程
一、IOC容器的对象存储体系1. 获取bean对象 spring主要通过BeanFactory接口的getBean方法来从IOC容器,即BeanFactory的实现类中获取某个bean对象实例,如下为BeanFactory的getBean方法定义: public interface BeanFactory { ... /** * Return an instance, which may be shared or independent, of the specif
2020-07-01 14:40:31
401
转载 Spring IOC源码分析(六):BeanFactory体系结构与IOC容器的核心组件分析
一. 概述Spring容器通常指的是ApplicationContext的体系结构设计,即整个Spring框架的IOC功能,是通过ApplicationContext接口实现类来提供给应用程序使用的。应用程序通过ApplicationContext提供方法来间接与内部Bean工厂交互,如获取Bean对象实例等。 在Spring框架内部设计当中,ApplicationContext是Spring容器所管理、维护的beans对象的一个运行环境,即ApplicationContext包含一些功能组件:保存外
2020-06-29 15:28:19
227
转载 Spring IOC源码分析(五):IOC的容器上下文ApplicationContext的自顶向下分析
一、spring-context包:IOC的容器上下文1. ApplicationContext接口public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver最顶层接口,通过继承BeanFactory
2020-06-29 10:25:20
161
转载 Spring MVC源码分析(四):请求处理器体系结构设计与实现
一、概述在我的上一篇文章:Spring源码分析(三):DispatcherServlet的设计与实现中提到,DispatcherServlet在接收到客户端请求时,会遍历DispatcherServlet自身维护的一个HandlerMapping集合,来查找该请求对应的请求处理器,然后由该请求处理器来执行请求处理。 在SpringMVC中,DispatcherServlet通过HandlerMapping接口来定义请求和请求处理器之间的映射关系,通过HandlerAdapter接口来提供一个模板实现,
2020-06-28 18:28:02
190
转载 Spring MVC源码分析(三):请求分发器DispatcherServlet的设计与实现
一、概述DispatcherServlet是SpringMVC的一个前端控制器,是MVC架构中的C,即controller的实现,用于拦截这个web应用的所有请求,具体为在web.xml中配置这个servlet,对应的url-pattern设置为“/”,或者使用servlet3.0之后的WebApplicationInitializer来配置,在web容器启动这个应用时,会创建和初始化这个DispatcherServlet对象实例。 DispatcherServlet在接收到请求之后,会根据请求的ur
2020-06-28 18:12:27
828
转载 Spring MVC源码分析(二):Spring容器的加载
一、Tomcat引导Spring容器的加载:ContextLoaderListener 在我的上一篇文章:Spring源码分析(一):从哪里开始看spring源码,分析过在web容器,如tomcat,启动web应用时,会通过监听器的方式,通知ServletContextListener,web容器开始启动web应用了,ServletContextListener可以自定义初始化逻辑。ContextLoaderListener就是ServletContextListener接口的一个实现类,主要负责加载
2020-06-28 18:06:06
145
转载 Spring源码分析(一):从哪里开始看spring源码
一、概述对于大多数第一次看spring源码的人来说,都会感觉不知从哪开始看起,因为spring项目源码由多个子项目组成,如spring-beans,spring-context,spring-core,spring-aop,spring-web,spring-webmvc等,整个项目结构如图: 可能有人会觉得,既然spring是一个IOC容器或者说是一个bean的容器,那么应该从spring-beans看起,先了解spring是如何从xml文件配置获取需要创建的bean的信息,但是这里有个问题就是
2020-06-11 15:37:33
624
转载 如何自定义一个 SpringBoot 的 starter 包
starter 包与自动配置的概念我们知道 SpringBoot 通过 starter 包引入对应的第三方 jar 包,然后通过自动配置机制来自动创建该第三方 jar 包对应的功能的 bean 对象。如通过引入 spring-boot-starter-data-redis 这个 starter 包并且在 application.properties 属性配置文件配置 Redis 服务器的域名和端口号,则可以直接注入 RedisTemplate 对应的 bean 对象来使用。步骤如下: 1...
2020-06-11 14:45:32
355
转载 SpringBoot学习(五):自动配置的源码实现(三)@Conditional条件化加载机制
概述由上篇文章:SpringBoot学习(五):自动配置的源码实现(二)Spring容器对自动配置的加载 的分析可知,通过在应用主类中添加@SpringBootApplication或者@EnableAutoConfiguration注解,可以激活SpringBoot的自动配置机制,为应用提供一系列默认的功能组件,在应用中可以直接使用如@Autowired注解注入即可,而不需要在应用中显式配置。 在SpringBoot内部实现中,每个自动配置的功能组件都对应一个使用@Configuration注解.
2020-06-11 11:12:54
531
转载 SpringBoot学习(五):自动配置的源码实现(二)Spring容器对自动配置的加载
概述在第一篇文章:SpringBoot学习(五):自动配置的源码实现(一)@EnableAutoConfiguration详解中已经介绍过@EnableAutoConfiguration注解的设计,而Spring容器对自动化配置的加载是基于@EnableAutoConfiguration注解的这个设计来实现的,接下来具体分析该过程1. 应用程序添加@EnableAutoConfiguration注解 在应用程序主类(即SpringApplication.run方法被调用的main方法所在的类)添
2020-06-11 10:53:47
426
转载 SpringBoot学习(五):自动配置的源码实现(一)@EnableAutoConfiguration详解
@EnableAutoConfiguration注解 @EnableAutoConfiguration为@SpringBootApplication注解的其中一个注解,作用是激活SpringBoot的自动配置功能。注解的定义如下:可以看到包含@AutoConfigurationPackage注解,通过@Import注解导入AutoConfigurationImportSelector。其中@AutoConfigurationPackage自身会导入AutoConfigurationPackages.R
2020-06-11 10:37:49
291
转载 SpringBoot学习(五):自动配置的源码实现
概述我们知道SpringBoot的一个很重要的特性就是,在pom.xml中添加相关start包配置,如spring-boot-starter-data-redis,则SpringBoot框架可以自动为应用配置对应的默认功能组件bean,如redisTemplate等,使得在应用代码直接使用即可,如直接使用@Autowired注入即可,而不需要跟之前的Spring项目一样,需要在XML文件或者在应用代码使用@Configuration注解配置类,使用@Bean注解方法来显示配置。 如果应用需要自定.
2020-06-11 10:33:49
161
转载 SpringBoot学习(四):内嵌Servlet引擎(Tomcat,Jetty等)的实现原理
概述SpringBoot使用main方法启动的一个重要特性是,不需要打包成war部署到Tomcat这种Servlet容器中,而是只需打包成jar,然后通过java或mvn等命令运行这个jar包,然后应用就可以在指定的端口监听客户端的连接请求了。 在SpringBoot内部主要是引用了embedded的Tomcat或Jetty等作为Servlet引擎,由该Servlet引擎负责接收Web请求并交给应用处理和生成响应,从而可以将应用打包成jar,直接在命令行启动,以独立进程的方式运行,无需依赖Tom.
2020-06-11 10:24:44
463
转载 SpringBoot学习(三):Filter过滤器等的配置方法和SpringBoot源码实现原理
Servlet,Filter,Listener的注册在SpringBoot应用来说,由于是自身启动了一个Servlet引擎,并且需要创建一个与应用关联ServletContext对象绑定到Servlet引擎,从而使得Servlet引擎接收到请求可以分发到该应用来处理。 ServletContext内部通常会包含Servlet规范中的Servlet,Filter,Listener等组件,而将这些组件注册到ServletContext,在SpringBoot中主要通过三步来完成,分别是: 在应用代码定义
2020-06-11 10:07:11
579
转载 SpringBoot学习(二):为什么main方法启动类SpringApplication需要在项目根目录
一、概述使用SpringBoot的应用是需要将应用代码编译打包成jar包,然后基于main方法的方式来独立启动这个应用,使得该应用作为一个独立进程运行。这是跟传统的将项目打包成war包,然后部署到tomcat服务器去运行的一个区别。 而在应用当中,这个包含main方法的启动类需要放在项目的根目录,与所有包平级,一般在main方法内部通过执行SpringApplication.run方法来启动应用。启动类自身是一个基于注解的配置类,一般使用@SpringBootApplication注解,而这个注解由三
2020-06-11 09:53:08
621
REDIS的RDB和AOF流程图.eddx
2020-05-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人