自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 try/catch捕获不到的异常

Throwable可以看做是异常世界中的Object,在Java中所有异常都有一个共同的祖先:Throwable,Throwable有两个重要的子类:Error错误和Exception异常,二者都是异常处理重点类。我们看一下普通的try/catch,接下来这种情况可能会有点特殊,

2022-12-29 22:58:37 7116 1

原创 spring ioc解决循环依赖为什么需要用三级缓存

是因为aop,而aop的核心是动态代理,简单理解就是我们需要横切逻辑增强的对象,实际上是生成一个代理对象操作被增强对象,而不是被代理对象本身。有需要的可以看下:spring框架源码一、什么是aop所以A依赖B,如果B被aop代理,那么实际依赖的不是B对象,而是B的代理对象,在spring ioc的循环依赖问题我们说过循环依赖的处理机制:A和B互相依赖,假如先去创建A,A实例化后先把自己放入三级缓存,目的是为了提前暴露,然后发现依赖B,接着创建B,B依赖A,B会去三级缓存中找A,使用并将A放入

2022-12-07 21:37:13 969

原创 spring ioc的循环依赖问题

spring ioc的循环依赖通常是指bean与bean之间的相互依赖,例如A持有对B的引用、B持有对A的引用,形成一个闭环,相对于这种我们一眼可以看出来的相互引用,实际引用中可能比这复杂、也隐蔽的多,要隐蔽、复杂的多,形成一个环形依赖。其中,构造函数注入的循环依赖无法解决,只能抛出BeanCurrentlyCreationException异常,在解决循环依赖时,spring采用的是提前暴露对象的方法。spring的循环依赖基于Java的引用传递,当获得对象的引用时,对象属性可以延后设置,而

2022-12-04 13:49:26 1679

原创 spring框架源码十七、Bean对象创建子流程

Bean对象创建子流程的入口,标记bean开始被创建,this.alreadyCreated.add(beanName)/**// 从缓存中获取bean // Eagerly check singleton cache for manually registered singletons. Object sharedInstance = getSingleton(beanName);

2022-11-19 11:37:22 823

原创 spring框架源码十六、BeanDefinition加载注册子流程

开始加载应用中的BeanDefinitions创建xmlBeanDefinition读取器并设置上下文环境、加载BeanDefinitions/**

2022-11-17 21:48:27 778

原创 spring框架源码十五、BeanFactory创建子流程

refresh()方法标志着spring容器启动过程开始,它主要做两件事:创建工厂、实例化bean对象。

2022-11-13 21:09:50 359

原创 maven deploy执行特别快,并且没有见到upload日志,不报错,但是也没成功

maven deploy执行特别快,并且没有见到upload日志,不报错,但是也没成功,原因是在项目的parent中配置了跳过deploy,我们只需要在自己的模块中添加,没有deploy到远程仓库。重写以下这块的配置。

2022-11-12 21:44:04 775

原创 feign调用中传递token

feign提供了RequestInterceptor,feign调用中传递token。

2022-11-12 21:43:10 675

原创 easyExcel报错:com.alibaba.excel.exception.ExcelGenerateException: Can not close IO

因为两个版本的poi,导致在调用easyExcel时发生了冲突。可以看到poi的相关的jar包版本是4.1.2,easyExcel版本为3.1.0,其中自带的poi版本为4.1.2,我们项目中一定有其它版本的poi,后来在parent的依赖中找到了,在自己的项目中,声明poi的版本。

2022-11-09 22:11:13 9185

原创 springboot下载src/main/resources下的Excel打不开

最近遇到下载导入模板的需求,我将模板Excel放在src/main/resources下,springboot下载src/main/resources下的Excel无法打开,原因是springboot会压缩src/main/resources下的文件,然后要记得clean install之后才会生效。解决办法:在pom.xml加入以下内容,不小心误伤了我们的模板Excel文件,结果下载下来后提示无法打开,

2022-11-09 22:10:41 1683

原创 response的Content-Length设置错误,导致springboot文件下载,代码已经return,postman一直等待到超时

response的head儿中设置了content-length,导致写出的数据不相等时,这一句在header中设置了内容的大小Content-Length是10240个字节,是10k,temp.txt文件大小在5k左右,这就导致response以为没下完,已写出的数据就是byte字节数组,后台已经处理完并且return。我还以为是文件有问题,找了半天也不知道是什么原因,请求处理完后,postman 一直在等待,postman 便一直等待,直至超时,便一致在等待,当然是等不到什么结果的,

2022-11-07 21:39:51 3939

原创 spring框架源码十四、源码剖析注意事项及容器初始化主体流程

ioc容器是spring的核心模块,是抽象了bean管理、依赖关系维护的解决方案。spring提供了很多容器,BeanFactory是顶层容器,它定义了容器遵循的原则,ApplicationContext是BeanFactory的一个子接口,具体的实现容器有,ClassPathXmlApplicationContext:包含了xml解析的一系列内容,AnnotationConfigApplicationContext:包含了注解解析的一系列内容,等。

2022-11-03 22:01:57 484

原创 maven项目排除/屏蔽parent的plugin

这意味着所有parent的子项目都会引用spring-boot-maven-plugin这个插件,parent有两个module,其中module-web依赖module-api,其中module-api是一些基础的东西,module-web是将来要部署的项目,而module-api中只是一些基础api,没有springboot的启动类,不能让spring-boot-maven-plugin来二次打包,原因是module-api不是要部署的项目,说明module-api打的包有问题,

2022-10-29 20:54:59 4176

原创 spring框架源码十三、spring ioc高级特性-后置处理器

spring提供了两种后置处理bean的扩展接口,分别为BeanPostProcessor和BeanFactoryPostProcessor,BeanPostProcessor提供了两个方法,分别在初始化方法之前和之后执行,这里的初始化方法就是bean的init-method。如果我们定义了一个BeanPostProcessor的实现类,默认会对spring ioc容器中的所有bean进行处理,如果要对某个具体的bean进行处理,可以通过方法的参数(Object bean, String bean

2022-10-26 21:25:13 522

原创 spring框架源码十二、spring ioc高级特性之lazy-init延迟加载及FactoryBean和BeanFactory

BeanFactory是容器的顶级接口,定义了容器的一些基础行为,负责生产和管理bean的一个工厂,spring的bean有两种,一种是普通bean,另一种是工厂bean(FactoryBean),所以bean2也被实例化,这也符合延迟加载的bean在第一次被调用时才实例化的规则,如果一个设置提前加载的bean1,依赖了一个延迟加载的bean2,这里的userEntity是UserEntityFactoryBean的getObject返回的对象,而不是UserEntityFactoryBean本身,

2022-10-24 19:13:30 876 1

原创 spring框架源码十一、源码环境构建

jdk:1.8,spring源码:5.1.x。

2022-10-23 23:09:22 696

原创 spring框架源码十、spring ioc注解模式

在xml+注解组合模式的基础上,将xml中配置的bean,全部替换为注解的形式,最终删除xml,从Java配置类启动,xml+注解组合的模式还是从ClassPathXmlApplicationContext启动。

2022-10-22 22:01:24 634

原创 spring框架源码九、spring ioc xml与注解组合模式

xml标签对应的注解:bean标签@Component(“testService”),作用于类上,bean的ID为value的值,如果不配置,默认取类名称首字母小写作为bean的ID,另外,针对不同分层提供了@Component的三种别名@Controller、@Service、@Repository,分别用于控制层、服务层、持久层的bean定义,这四个注解的用法完全一样,只是为了区分更清晰。bean标签的scope属性@Scope(“singleton”),作用于类上,默认单例。

2022-10-21 23:15:54 379

原创 spring框架源码八、spring ioc xml模式的依赖注入配置

spring依赖注入有两种方式。setter注入使用property标签,注入普通值使用value属性,注入其它的bean使用ref属性。构造器注入使用constructor-arg注入,注入普通值使用value属性,注入其它的bean使用ref属性。

2022-10-20 23:17:45 174

原创 spring框架源码七、spring ioc xml模式bean的实例化方式及标签属性

另外两种方式是为了将我们new的对象放入到spring ioc容器。原型模式bean,spring框架只负责创建,不负责销毁。对象死亡:当对象长时间不被使用,会被javaGC回收;需要先实例化CreateBeanFactory。我们只需要关注上边两种,另外几种很少会用到。对象出生:当使用bean时,创建新的对象;对象出生:当创建容器时,对象就被创建了;对象死亡:当容器被销毁,对象就被销毁了;对象活着:只要容器还存在,会一直活着;单例模式bean的生命周期与容器相同。对象活着:只要对象被使用,会一直活着;

2022-10-19 22:07:07 420

原创 spring框架源码六、spring ioc xml模式

在我们自定义的ioc中,主要包含两部分,1、bean信息的定义bean的类全限定名以及bean之间的依赖关系。实例化bean对象并维护bean之间的依赖关系。spring框架的ioc实现中,bean定义信息支持以下几种,1、xml模式;ioc容器启动方式:或通过ContextLoaderListener监听器加载xml。2、xml+注解模式;3、注解模式。启动方式:或通过ContextLoaderListener监听器去加载配置类。

2022-10-18 22:23:27 307

原创 spring框架源码五、自定义ioc

在实例化service对象时,new关键字将TestController和TestServiceImpl耦合在了一起,而实际上按照面向接口开发原则,controller并不需要关心TestService的具体实现。如果不使用new的话,我们还有其它方式实例化service对象吗?可以通过反射的方式实例化对象,例如,Class.forName(“com.duohoob.spring.service.TestServiceImpl”)

2022-10-17 22:45:55 336

原创 spring框架源码四、什么是ioc

ioc(Inversion of Control)控制反转如果在class B中包含有一个属性,它的类型为class A那我们认为B依赖A。}}一般情况下,我们在B中需要用到A时,需要通过new关键字去创建一个A对象,是主动创建依赖;spring中是由ioc容器通过DI(Dependency Injection)依赖注入为B注入依赖A;对依赖的控制发生了反转,由主动创建变为了被动注入。spring通过IoC容器创建bean并维护bean之间的关系,这是spring的核心,贯穿始终。

2022-10-16 18:39:50 167

原创 fastdfs简介及在springboot中使用

fastdfs是一个开源的轻量级分布式文件系统,提供了文件上传、文件下载、文件同步、文件存储等功能,解决了大容量存储和负载均衡的问题,适合以中小文件为载体的在线服务。由跟踪服务器tracker server、存储服务器storage server组成,客户端请求tracker server进行文件上传、下载,tracker server调度storage server完成文件存储。

2022-10-13 22:25:56 2139

原创 tomcat的整体结构

tomcat是一个servlet容器,接收请求、发送响应。tomcat负责载入我们的servlet,调用init方法来初始化servlet;对于一个request请求,创建一个ServletRequest实例和一个ServletResponse实例,调用service方法时,将这两个实例作为参数传入;关闭servlet时,调用servlet的destroy方法并将其卸载。

2022-10-12 22:57:30 381

原创 spring框架源码三、自定义aop实现事务控制

用工厂类生成BankAccountService的动态代理,BankAccountController调用BankAccountService的动态代理对象,在代理对象中增强横切逻辑。

2022-10-06 23:23:25 811

原创 spring框架源码二、自定义事务控制

Connection.commit,提交事务、Connection.rollback,回滚事务,Connection默认自动提交。我们给当前线程当前线程绑定一个数据库连接Connection,线程内数据库操作都使用这同一个Connection。如果要用同一个事务控制两个update,那么就必须使用同一个数据库连接Connection,我们再看数据库,发现张三的钱少了100,但是李四的钱并没有增加100,实现事务控制,归根结底要通过操作Connection来实现,我们接下来就是要解决这个问题。

2022-10-05 20:45:37 664

原创 spring框架源码一、什么是aop

aop(Aspect Oriented Programming)面向切面编程要想了解aop有必要先了解一下oop,oop(Object Oriented Programming)面向对象编程关于oop不需介绍太多,只用提一下,oop的三大特征:封装、多态、继承。oop更多是维护一种纵向的垂直继承体系。比如:A、X的子类都可以通过继承而获得eat和drink的能力,这一相同的行为。aop是oop的补充它们的本质都是为了减少重复代码。

2022-10-03 23:52:10 412

原创 Java NIO详解

Selector会轮训注册在它上面的所有Channel,如果某个Channel为读写做好准备,处于就绪状态,因为线程不会一直等待IO条件准备就绪,如果某个Channel没有就绪,会转而去处理其它Channel。传统的IO,面向IO流,每一个线程对应一个连接,如果IO尚未处于就绪状态,线程就会阻塞等待。当Channel处于某个就绪状态,就会被Selector查询到,然后执行相应的操作。也要先写到用户地址空间,然后copy到内核地址空间,再写入到磁盘中。容量,缓冲区最大可以存储的数据量,声明后不能更改;

2022-09-30 23:46:00 806

原创 mysql left join关联字段的类型不一致导致索引失效

t1和t2通过order_id关联,order_id在t2建有索引order_detail_index_order_id,原因是order_id字段在t1中是int类型,在t2中是varchar类型,导致用不到索引。我们用另外一种办法,在查询中通过函数将它们转换为一样的类型和字符集。不过修改字段类型有时候会可能遇到一些阻碍。一种办法是修改字段类型让它们保持一致,看下这条sql的explain。但是这里却没有用到。

2022-09-29 23:58:20 1967

原创 redis cluster集群为什么要求至少三个master节点?为什么是奇数?

cluster各节点之间需要互相通信确认对方是否存活,假设有A、B两个节点,B发现联系不上A,是不能确定A和B谁出了问题的,假设集群中还有一个C节点的话,如果B、C可以互相联系,但是都联系不上A,那么这时候就可以确定A出问题了,需要把A从集群中踢出去。集群可用原则:可用节点数量>集群总节点数量的二分之一,节点数量为奇数个是出于节省资源的考虑,因为不管是四个还是三个节点,一旦挂了两个,整个集群都是不可用的。

2022-09-27 20:57:32 2229

原创 mysql explain 12列信息解释

分别是id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。常见的类型有system、const、eq_ref、ref、range、index、all等,explain能解释mysql如何处理查询sql,表加载顺序、表如何连接、索引的使用情况等。如果是多列索引,可能用到的只是一部分,留意这个key_len可以知道用到了多少列。id如果相同,可认为是同一组,同组的从上往下执行,

2022-09-27 20:56:32 652

原创 springboot源码理解十二、springMVC功能

springboot版本:2.2.9.RELEASE。回忆一下,我们在普通的web项目中是如何使用springMVC的,首先需要在web.xml中配置DispatcherServlet,

2022-09-23 15:10:21 1095 1

原创 springboot源码理解十一、内嵌tomcat原理

默认Servlet容器切换Servlet容器内嵌tomcat自动配置原理tomcat自动配置类tomcat工厂类何时被调用onRefresh()finishRefresh()springboot版本:2.2.9.RELEASE。默认Servlet容器springboot默认支持tomcat、jetty、undertow作为底层容器,一旦引入spring-boot-starter-web模块,就默认使用tomcat。

2022-09-22 16:13:27 513

原创 springboot源码理解十、自定义starter改造

自定义starter改造热插拔技术新增标记类ConfigMarker新增@EnableRegisterServer注解修改自动配置类在spring-boot-mytest启动类添加注解

2022-09-21 17:13:45 294

原创 springboot源码理解九、自定义starter实现

starter起步依赖starter命名规则自定义starternew module添加依赖simplebean自动配置类META-INF\spring.factories在spring-boot-mytest中引入mystarter-spring-boot-starter添加配置通过@Autowired引用启动访问

2022-09-21 16:45:19 286

原创 springboot源码理解八、run方法执行过程(刷新应用上下文)

springboot版本:2.2.9.RELEASE。SpringApplication.run刷新应用上下文调用spring的refresh()方法invokeBeanFactoryPostProcessors(beanFactory)解析被@Configuration注解修饰的配置类处理@ComponentScan注解处理@Import注解

2022-09-20 18:57:24 859

原创 springboot源码理解七、run方法执行过程(刷新上下文前的准备阶段)

run方法执行过程(刷新上下文前的准备阶段)SpringApplication.run刷新上下文前的准备阶段springboot版本:2.2.9.RELEASE。SpringApplication.runrun方法是springboot启动过程中非常重要的步骤。

2022-09-20 12:03:04 473

原创 springboot源码理解六、run方法执行过程(获取启动监听器、构建上下文环境、初始化应用上下文)

SpringApplication.run获取启动监听器构建上下文环境创建上下文环境配置上下文环境启动对应的监听器初始化应用上下文

2022-09-19 15:45:08 488

原创 springboot源码理解五、SpringApplication初始化

加载classpath下(项目中),META-INF\spring.factories中配置的ApplicationContextInitializer。初始化器类加载META-INF\spring.factories中配置的ApplicationListener。监听器

2022-09-19 11:59:06 369

空空如也

空空如也

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

TA关注的人

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