自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(97)
  • 收藏
  • 关注

原创 zookeeper(八)顺序一致性

zookeeper顺序一致性

2021-12-06 08:41:59 457 1

原创 zookeeper(七)客户端通信

zookeeper客户端通信

2021-12-06 08:41:32 462

原创 zookeeper(六)请求处理链

zookeeper请求处理链

2021-12-06 08:41:08 511

原创 zookeeper(五)ZookeeperServer

zookeeper组件ZookeeperServer

2021-12-06 08:40:42 555

原创 zookeeper(四)持久化

zookeeper持久化

2021-12-06 08:39:40 1104

原创 zookeeper(三)角色初始化

zookeeper角色初始化

2021-12-06 08:39:20 406

原创 ZooKeeper介绍

zookeeper介绍

2021-12-06 08:38:51 84

原创 zookeeper(二)领导者选举

zookeeper领导者选举

2021-12-06 08:38:29 425

原创 zookeeper(一)服务端启动

zookeeper服务端启动

2021-12-06 08:38:06 479

原创 zookeeper源码阅读环境搭建

zookeeper源码环境搭建

2021-12-06 08:37:39 577

原创 spring boot源码分析(四):spring aop(一)

Spring AOP源码分析例子创建需要增强的对象public class Handler { public int handle() { return 1; }}创建切面@Aspect@Component@Slf4jpublic class LogAspect { @Pointcut("execution(public int com.example.demo.handler.Handler.*(..))") public void po

2021-11-09 20:13:43 263

原创 Spring Mail踩坑记录

Spring Mail踩坑附件文件名变为***.bin现象描述通过spring mail发送带有附件的邮箱时,当发送给qq邮箱,附件文件名正常,当发送给163邮箱时,附件名变为ATT00002.bin解决方法在应用启动的过程中,设置如下两个系统变量@Configurationpublic class MailConfiguration { @PostConstruct private void init() { System.setProperty("mail.mime.splitlo

2021-11-04 20:05:26 455

原创 Netty源码(六)ChannelPipeline

ChannelPipeline首先看下ChannelPipeline的继承结构可以看到主要实现了Iterable,ChannelInboundInvoker,ChannelOutboundInvoker所以ChannelPipeline具有如下四个部分接口Iterable因为ChannelPipeline是一个ChannelHandler的有序链表,因此可以遍历包含的ChannelHandlerChannelInboundInvoker继承此接口,因此具有触发各种Channel生命周期事件

2021-09-04 17:31:17 87

原创 Netty源码(五)NioEventLoop对其他任务的处理

Nio对其他任务的处理run首先回到NioEventLoop的run方法if (ioRatio == 100) { // 没有指定处理io事件占所有执行时间的比例 try { processSelectedKeys(); } finally { // Ensure we always run tasks. runAllTasks(); }} else { // 指定了处理io事件占所有执行时间的比例 final lo

2021-09-04 17:31:05 117

原创 Netty源码(四)NioEventLoop对IO事件的处理

NioEventLoop的运行wakeupprotected void wakeup(boolean inEventLoop) { // 因为wakeup操作代价较高,避免频繁地调用wakeup,使用cas来减少调用次数 // inEventLoop代表当前是否在eventloop中,如果为true,代表eventloop正在运行,所以不需要wakeup // wakeUp有延迟生效的特点,如果在调用wakeup的时候,selector并没有因为执行select方法而阻塞,那么这次wakeup会直

2021-09-04 17:30:33 160

原创 Netty源码(三)ServerBootstrap

ServerBootstrapServerBootstrap的作用是用来启动Netty服务端类继承结构AbstractBootstrap重要属性// 主EventLoopGroup,当协议是面向连接时,主要用来接收连接volatile EventLoopGroup group;@SuppressWarnings("deprecation")// 用来生成channelprivate volatile ChannelFactory<? extends C> channelFac

2021-09-04 17:30:18 163

原创 Netty源码(二)EventLoop的创建

EventLoop因为最常用的就是NioEventLoop,所以主要看下NioEventLoop的实现类继承结构AbstractEventExecutorEventExecutor的作用主要分为两个部分:一部分来自AbstractExecutorService,因此具有提交任务,运行任务的能力另一部分的能力是自己定义的,用来判断一个线程是否在EventLoop中AbstractEventExecutor是一个抽象类,实现了部分方法...

2021-09-04 17:29:59 189

原创 Netty源码(一)EventLoopGroup

EventLoopGroup用过Netty的都知道,EventLoopGroup包含多个EventLoop,而一个EventLoop和一个线程绑定,一个Channel绑定到一个EventLoop上,一个EventLoop可以管理多个ChannelEventLoop用来处理Channel的io事件类继承结构EventExecutorGroupEventExecutorGroup主要提供next方法来提供EventExecutor,除此之外可以用来管理EventExecutor的生命周期以及关闭它们

2021-09-04 17:29:33 157

原创 Netty知识汇总

Netty知识汇总历史阻塞io使用方法try { // 监听本地的8000端口 ServerSocket serverSocket = new ServerSocket(8000); // 阻塞等待连接 Socket clientSocket = serverSocket.accept(); BufferedReader inputStream = new BufferedReader(new InputStreamReader(clientSocket.getIn

2021-08-08 11:28:48 147

原创 spring boot源码分析(三):配置文件的处理

配置文件的处理我们都知道,通过配置application.yml或者application.properties,我们可以在bean中通过@Value注解来使用这些配置项那么spring boot是如何解析这些配置文件的呢在2.4.0之前的版本这部分逻辑是在ConfigFileApplicationListener这个ApplicationListener中的在2.4.0之后的版本这部分集中在ConfigDataEnvironmentPostProcessor这个EnvironmentPostPro

2021-07-24 23:06:29 459 2

原创 spring boot源码分析(二):@ComponentScan

@ComponentScan在上篇介绍SpringApplication启动流程中,其中有一步是创建ApplicationContext的protected ConfigurableApplicationContext createApplicationContext() { return this.applicationContextFactory.create(this.webApplicationType);}ApplicationContextFactory DEFAULT = (web

2021-07-23 09:56:51 285

原创 spring boot源码分析(一):启动流程

启动流程我们一般都会使用如下的方式来启动spring boot@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}下面具体分析下SpringApplication.run方法,可以看到主要将请求交给run方法来处理public sta

2021-07-23 09:03:46 195 1

原创 spring(五)类型转换

类型转换之前在介绍bean的创建过程中,其中有一步是调用populateBean,来将BeanDefinition中的PropertyValue来设置到bean中因为在xml中标签中指定的值都为字符串类型,所以需要进行类型转换,将字符串类型的值转换为bean对应属性的类型在populateBean中最后会调用applyPropertyValues来将PropertyValue中的属性值设置到创建的bean实例中// AbstractAutowireCapableBeanFactoryprotect

2021-07-17 14:52:08 388 2

原创 spring(四)初始化Bean

初始化Bean在AbstractBeanFactory的getBean方法中,当执行完bean的实例化,属性注入之后,接下来就会初始化bean,其主要逻辑都封装在initializeBean方法中,下面详细看下这个方法// AbstractAutowireCapableBeanFactoryprotected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) { if (Syst

2021-07-13 09:39:53 85

原创 spring(二)注入

注入修改BeanDefinition在上一篇介绍bean的创建流程中,其中在调用doCreateBean来实际创建一个bean的时候,会执行下面一段代码// AbstractAutowireCapableBeanFactoryprotected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { //

2021-07-11 18:11:53 103 1

原创 spring(三)ConstructorResolver

ConstructorResolverinstantiateUsingFactoryMethod这个方法比较长,所以分为多个部分看确定工厂对象// ConstructorResolverBeanWrapperImpl bw = new BeanWrapperImpl();this.beanFactory.initBeanWrapper(bw);Object factoryBean;Class<?> factoryClass;boolean isStatic;String

2021-07-10 15:47:37 726

原创 spring(一):Bean的创建

循环依赖用过spring的开发同学都知道,spring是能够解决如下通过setter注入依赖造成的循环依赖的@Service("aService")public class AService { @Resource(name = "bService") private BService bService;}@Service("bService")public class BService { @Resource(name = "aService") private

2021-06-24 14:09:41 164

原创 spring boot DispatcherServlet(三)handler执行

handler 执行之前的文章介绍到,当根据请求找到对应的handler之后,会根据这个handler找到对应的HandlerAdapter,解析来会调用handle方法来处理请求// DispatcherServlet.javamv = ha.handle(processedRequest, response, mappedHandler.getHandler());handle接下来看下HandlerAdapter是如何执行的当调用handle时,主要会调用handleInternal方法

2021-06-21 09:42:29 574 1

原创 spring boot DispatcherServlet(二)handler查找

DispatcherServlet的请求处理既然要分析请求处理过程,肯定需要看service方法,但是DispatcherServlet并没有直接实现service方法,而是由父类FrameworkServlet实现的service方法serviceprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获

2021-05-30 21:50:00 394 2

原创 spring boot整合mybatis源码分析

spring boot整合mybaits源码分析既然是分析spring boot整合mybatis,那么肯定需要看mybatis相关的autoConfiguration类–MybatisAutoConfigurationMybatisAutoConfiguration首先看下MybatisAutoConfiguration这个类上都使用了哪些注解a...

2021-05-10 09:13:32 221 1

原创 spring boot DispatcherServlet(一)初始化和注册

DispatcherServletWeb容器的创建我们知道在spring boot 应用启动过程中,会刷新容器,调用生成的ApplicationContext的refresh方法如果是Servlet应用,创建的ApplicationContext是ServletWebServerApplicationContext类型的这里看下ServletWebServerApplicationContext的refresh方法public final void refresh() throws BeansEx

2021-04-24 21:09:16 1567

原创 spring boot 内置容器

spring boot web容器spring boot 可以通过java -jar的形式来启动web容器并且启动应用,其背后也使用到了自动配置TomcatServletWebServerFactory用来产生TomcatServletWebServerTomcatServletWebServer则用来管来tomcat容器的启停ServletWebServerFactoryAutoConfigurationServletWebServerFactoryAutoConfiguration就是用来进行

2021-04-21 08:32:48 527

原创 spring boot web应用的自动配置

web应用自动配置在之前的文章中分析过,@SpringBootApplication会使用到@Import注解来引入AutoConfigurationImportSelectorAutoConfigurationImportSelector则会通过spi机制来返回需要加载的自动配置类其中就包括DispatcherServletAutoConfiguration这个类用来进行servlet相关的自动配置化工作DispatcherServletAutoConfiguration首先看下这个类都使用了

2021-04-10 12:17:34 252

原创 mybatis源码分析(九):Executor及缓存

Executor及缓存mybatis提供了缓存查询结果的功能,缓存功能主要由Executor来提供,所以下面首先看下Executor接口Executor// 执行update delete等操作int update(MappedStatement ms, Object parameter) throws SQLException;// 执行select<E> List<E> query(MappedStatement ms, Object parameter, RowB

2021-03-16 22:58:02 157

原创 mybatis源码分析(八):拦截器

拦截器拦截器的作用就是在执行sql的过程中插入一些执行逻辑,比如记录当前执行的sql、分页等使用@Intercepts({@Signature( type= Executor.class, method = "update", args = {MappedStatement.class,Object.class})})public class ExamplePlugin implements Interceptor { public Object intercept(Invocati

2021-03-15 09:16:20 470

原创 mybatis源码分析(七):查询结果转换ResultSetHandler

ResultSetHandler在上一篇介绍Mybatis执行流程的时候,我们了解到,当从数据库获得查询数据之后,会使用ResultSetHandler对查询结果进行处理,下面看下ResultSetHandler的接口定义public interface ResultSetHandler { // 这里对结果集进行处理,返回的是集合 <E> List<E> handleResultSets(Statement stmt) throws SQLException; /

2021-03-15 08:38:11 1172 1

原创 mybatis源码分析(六):执行流程

Mapper方法执行流程在不结合spring的时候,一般都会通过类似如下的方式来执行Mapper的指定方法try (Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/collectionparameters/mybatis-config.xml")) { sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSessi

2021-03-15 08:38:00 123

原创 mybatis源码分析(一)初始化

初始化首先看下mybatis初始化的代码// 指定配置文件Reader reader = Resources .getResourceAsReader("org/apache/ibatis/submitted/annotion_many_one_add_columnprefix/SqlMapConfig.xml"));SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

2021-03-07 18:07:50 334

原创 mybatis源码分析(五):SqlSource&SqlSourceBuilder

SqlSourceBuilderSqlSourceBuilder的作用主要就是将sqlNode解析之后的sql进一步解析/** * 主要是将sqlNode解析之后的sql进一步解析,将其中的#{}使用?进行替代,并且建立对应的ParameterMappings * @param originalSql sqlNode解析之后的结果 * @param parameterType 标签上指定的parameterType属性 * @param additionalParameters

2021-03-07 17:09:39 442 1

原创 mybatis源码分析(四):SqlNode

SqlNodeSqlNode代表我们写的动态sql里的每个节点,那么什么叫动态sql呢?动态sql就是会根据我们的入参,来动态生成最终的sql,比如下面这个例子<select id="findPost" resultType="org.apache.ibatis.domain.blog.Post"> SELECT * FROM POST P <where> <choose> <when test="id != null"

2021-03-07 16:36:47 281

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除