- 博客(97)
- 收藏
- 关注
原创 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关注的人