
Spring
文章平均质量分 90
Spring系列文章
Zong_0915
学无止境~
展开
-
Java - Spring中HttpServletResponse的注入原理
我们在每次接口调用的时候,其实都可以通过注入一个或者对象实例来获得当前的请求/返回。本文主要来讲解Spring中是如何将这两个对象注入并且获取的。主要围绕着来讲,其中也会穿插的细节部分。首先是我们每次请求,都会被拦截器拦截。主要就是将当前的和存储在中。并初始化。初始化操作就是将则存储在中。这样就保证请求和当前线程的绑定。Spring容器在启动的时候,有个后处理过程会将注册到依赖源中。完成了、的注入。又实现了接口,因此获取实例的时候,调用的是对应的getObject函数。原创 2022-10-09 16:29:45 · 3522 阅读 · 0 评论 -
Mybatis - 系列文章导航
Mybatis系列文章导航专栏原创 2022-10-09 10:56:05 · 208 阅读 · 0 评论 -
Spring - 全局异常处理器的使用
然后我们可以自定义一个枚举异常类,定义了对应的异常原因和code。原创 2022-09-09 17:15:00 · 563 阅读 · 0 评论 -
Spring常见问题解决 - @WebFilter 过滤器使用@Order控制执行顺序失效了?
根据上述的的描述,我们知道,过滤器链中的顺序的加载依赖:第一步骤:项目启动,会执行函数。此时会加载类型的Bean。第二步骤:此时会触发这个类的构造函数执行。构造函数中首先通过函数,按照顺序处理类型的Bean。是的一个子类。因此第二步中加载的实际上是。而最终又实现了Ordered接口。相关属性存在于其父类中。即order属性。构造函数将会对第二步中收集到的进行排序。先看排序对象是否实现了Ordered接口,若有,则调用getOrder()获取值。否则调用获取@Order注解属性值。我们通过。原创 2022-09-07 20:14:22 · 5090 阅读 · 2 评论 -
Spring常见问题解决 - @WebFilter注解装配的过滤器无法被@Autowired自动注入?
封装的这一个环节,可想而知是发生在类的实例化阶段。我们可以在自定义的过滤器中加一个构造函数,然后打个断点,首先,我们从上面的调试流程来看,我们知道,我们项目中的。4.此时访问一下接口,结果如下:可见这个过滤器是正常运行的。在启动的过程中,是否对这个注解做出了一定的处理。首先,我们从上文的案例结果可以看出,此时我们自定义的。注解的作用是吻合的。这两者是有关联的,在下文会说。也就是说,我们执行这段代码,想要注册我们通过。从这个静态代码块,我们可以发现跟上文中讲到的。注解修饰的过滤器的时候,这个过滤器的类型是。原创 2022-09-06 16:57:23 · 1561 阅读 · 0 评论 -
Spring常见问题解决 - 对象参数校验失效
进行参数校验的时候,请在Controller参数入口处,增加@Validted注解。倘若有级联属性,类里面嵌套类。需要在对应的属性上增加@Valid注解来表示支持级联校验。原创 2022-09-02 14:34:52 · 3483 阅读 · 6 评论 -
Spring常见问题解决 - Required request body is missing
可以看下Spring常见问题解决 - @EnableWebMvc 导致自定义序列化器失效。自定义一个适配器来代替我们的过滤器工作。目的就是希望读取一下请求体。} }这里拿到的body是Object类型的Java对象,不再是流。因此可以避免请求体以的形式被读取两次。导致的异常。...原创 2022-08-31 22:01:35 · 8629 阅读 · 0 评论 -
Spring常见问题解决 - @EnableWebMvc 导致自定义序列化器失效
这篇文章是在Spring常见问题解决 - Body返回体中对应值为null的不输出?的基础上讲的。我们有时候,可能需要自定义一个序列化器来满足自己的需要,但是如果项目中不正确使用了注解,可能会导致这个自定义的序列化器失效。首先我们应该看下这个注解是拿来干啥的吧。项目中,如果我们希望自定义一些MVC的功能,我们只需要实现接口即可。无需添加注解。添加注解,会导致SpringBoot对MVC的自动装配失效。因为Spring对于类型的Bean只允许存在一个(包括其子类)。此时以序列化器为例,使用。......原创 2022-08-31 18:50:39 · 1766 阅读 · 1 评论 -
Spring常见问题解决 - Body返回体中对应值为null的不输出?
这篇文章主要针对于Spring开发中关于Web返回请求体的相关问题。SpringBoot默认情况下,使用jackson来作为消息转换器。同时默认禁用了功能。因此null值会被输出。我们可以添加对应的pom依赖,增加消息转换器。例如fastjson。但是fastjson默认情况下,不会输出null值。不同的编解码器的实现可能有一些细节上的不同,例如本文的jackson和fastjson。所以要注意当依赖一个新的依赖时,是否会引起默认编解码器的改变,从而影响到一些局部行为的改变。例如null是否会输出。....原创 2022-08-31 15:41:54 · 2714 阅读 · 0 评论 -
Spring常见问题解决 - @RequestParam和@PathVariable的区别以及400报错问题
如果希望从URL路径上获取参数,请使用。如果希望从URL上携带的参数上获取参数,请使用。使用的时候,请注意对应的参数是否是必传的,如果不是,请加上,或者其他方式来避免报400错误(缺少属性值)。...原创 2022-08-26 16:32:31 · 3091 阅读 · 0 评论 -
Spring常见问题解决 - @PathVariable 解析带 / 的参数值报404
可见,程序自动识别到了我们的name变量,并将其值赋值给了对应的变量,然后输出到页面中。但是,假如我们对这个变量添加一个特殊字符,看看效果会怎么样。当然,最好的解决方案就是在使用URL上进行动态传承的同时,避免参数值带有。已经在待匹配的候选列表中了。那么具体是如何匹配的呢?,因此根据代码逻辑,需要在进行一次模糊匹配过程。然后在进行匹配,如果能匹配上,在最终返回。来进行的,那么我们可以使用。的值依旧包含了相同的前缀)。当然,还会匹配这个请求的。时就隐式自动上一个加。首先明确的是,我们的。到这里我们可以看到,.原创 2022-08-26 15:37:05 · 6195 阅读 · 3 评论 -
Spring常见问题解决 - 自定义ApplicationEnvironmentPreparedEvent监听器失效了?
我们先来看下Spring事件(Event):用于区分和定义不同的事件。事件广播器():负责发布事件。事件监听器(Listener):负责监听和处理广播器发出的事件。我们调用这个函数,我们可以分为两个步骤。一个是的构造。一个是run()函数的调用。构造的过程中,会去目录下寻找类型的监听器。在run()执行过程中。会通过去找到一个类型的监听器。同样是去目录下寻找。唯一实现为。它主要负责在启动过程的不同阶段发布对应的事件。中有个广播器,将第二步中获得的所有监听器都注册进来。......原创 2022-08-25 19:48:29 · 4271 阅读 · 0 评论 -
Spring常见问题解决 - AOP调用被拦截类的属性报NPE
如果一个类没有实现某个接口,那么它在被AOP进行代理的时候,是通过Cglib的方式来创建一个代理对象的。Cglib创建代理实例的情况下,默认情况下,会优先采用objenesis来创建实例对象,再去通过普通的反射来完成。objenesis创建实例对象的最底层,则是通过来完成实例化的。而这个方法创建出来的对象是不会初始化类成员变量的。因此被代理类对象中的成员变量是null(有个例,但针对于本文是null)。因此我们可以通过给成员变量添加get方法,在代码编写的时候,避免直接通过被代理对象.成员变量。原创 2022-08-23 16:01:20 · 610 阅读 · 0 评论 -
Spring常见问题解决 - this指针造成AOP失效
首先,不要在使用AOP的过程中,在增强方法的内部或者是业务代码上调用增强方法上,使用this指针。一旦有this.增强方法()代码的出现,你就要注意了,因为这会导致AOP功能失效。因为AOP的本质就是创建代理对象,而代理对象里面存储了原始对象的引用。被代理对象只负责执行那些新加入的逻辑(增强方法),而原函数的调用则是通过原始对象来执行的。因此在执行AOP过程中,执行原函数的时候,this指针指的是原始对象,而非被代理对象。故相当于原始对象.method()。原创 2022-08-22 20:38:34 · 1392 阅读 · 0 评论 -
Spring常见问题解决 - 为啥shutdown()函数在程序关闭时候被自动调用?
如果使用默认的@Bean()引入某个类,注意,这里没有写什么参数。那么如果这个类中有和同名的函数。在程序关闭的时候会被自动执行。其他通过等方式注入的类,一般不会有这样的情况。如果希望实现同等效果,可以实现Closeable接口,完成close()方法的具体实现。因为程序关闭的时候,判断是否有销毁函数,是根据这个Bean的类型来的。。除此之外,就看这个Bean的是否为。}原创 2022-08-20 16:57:48 · 830 阅读 · 0 评论 -
Spring常见错误 - Bean构造注入报空指针异常
推荐大家先看下Spring源码系列:Bean的加载。那么本文的案例就很容易懂其原理了。如果某个Bean中的某个字段A,通过@Autowired注解进行自动装配。同时在该Bean中还显式声明了构造函数,并调用这个A对象的某个方法。那么这种情况会出现NPE。终极原因是因为,Spring中一个Bean的创建,其属性注入阶段(字段A的赋值)在实例构造阶段(Bean的构造函数调用)之后。要想避免这种错误。可以通过构造注入的方式来完成。也可以通过注解修饰对应的初始化逻辑。或者是实现接口,在函数中完成对应逻辑。原创 2022-08-20 15:34:07 · 6634 阅读 · 0 评论 -
Spring常见错误 - 集合收集装配和直接装配的共存问题
如果项目中对于集合类型的Bean,同时存在两种注入方式:收集装配和直接装配。那么后者会失效。原因是因为Spring本质上就是从整个Spring容器中去寻找和集合元素类型相同的Bean。然后返回。倘若能够匹配到结果,就会直接返回。不会再根据类型进行自动装配。因此直接装配的方式会失效。另外,我们还注意到,1.1节案例中,对于收集装配方式,结果输出的是:这里原因是因为Spring加载Bean是根据自然顺序来的。我们声明BeanUserOne在前,UserTwo在后。倘若希望UserTwo先被加载,可以通过。原创 2022-08-19 13:53:51 · 327 阅读 · 0 评论 -
Spring常见问题解决 - @Value注解注入的值出错了?
对于${}这样的占位符,值的注入本质上就是字符串的替换操作。对于#{}这样的占位符。值的注入本质上就是SpEL表达式的计算。对于${}的原理。先看这个字段上是否有@Value注解,如果有拿到它的占位符。如果这个占位符是字符串,就会进行对应的解析。去掉${},拿中间的部分,例如本案例中的username。根据username去整个系统的数据源中寻找有相同名称的键值对。返回第一个找到的值。由于系统环境变量数据源,遍历顺序优先于这类外部数据源配置。而系统变量数据源恰好有username。原创 2022-08-19 11:36:44 · 4811 阅读 · 0 评论 -
Spring常见问题解决 - 同一个类型的单例Bean找到了两个?
其实这个问题,在我上一篇文章Spring - 常见编程错误之Bean的定义就有说过了。但是我在做这一块内容的时候,我还是觉得做成一个问题对应一篇文章的方式比较好,这样更具有针对性。我个人也希望自己能够在源码角度能够将自身学过的知识串联起来。因此从源码角度会分析的更多一点。我们知道@Autowired@Autowired注解修饰的属性M,会被后置处理器做对应地操作。具体的实现逻辑在于类中。类主要做两件事:1.收集M的相关元数据信息。2.将这些元数据封装成类。如果某个类A中通过@Autowired。...原创 2022-08-16 15:21:33 · 3185 阅读 · 1 评论 -
Spring - 常见编程错误之Bean的定义
Springboot中的启动类,切记要放到项目架构的最外层。因为默认会根据你启动类所在的包路径去扫描。项目中没有事不要在声明Bean的时候害带有参构造,如果用了请注意传参问题。否则就会报错。另外,如果有多个有参构造,Spring会默认使用无参构造。它并不知道你使用的究竟是哪一个。使用@Autowired引入的bean是个单例,哪怕你对其设置了原型prototype也没有用。因为它做了后处理操作,通过反射机制来进行赋值,这个过程只执行一次,因此使用@Autowired引入的bean是固定不变的。...原创 2022-08-15 21:08:53 · 774 阅读 · 0 评论 -
Spring源码系列:MyBatis整合和原理
Spring源码系列:MyBatis整合和原理前言一. Mybatis的使用二. 源码分析2.1 SqlSessionFactoryBean的初始化2.2 MapperFactoryBean的创建2.3 MapperScannerConfigurer配置2.3.1 processPropertyPlaceHolders属性的作用2.3.2 过滤器生成2.3.3 Java文件的扫描三. 总结(带流程图)前言Mybatis是啥?Mybatis是一个支持普通SQL查询、存储过程以及映射的一个持久层半ORM框架原创 2022-04-12 15:00:52 · 568 阅读 · 0 评论 -
Spring原理系列:事务番外篇- 事务的失效
Spring原理:事务番外篇- 事务的失效前言一.事务失效的几种常见情形1.1 public修饰符1.2 MVC/Spring相关1.3 异常类型1.4 动态代理相关1.5 数据库相关1.6 事务传播特性前言首先希望读者阅读下我这篇文章:Spring源码系列:事务原理。在看了源码的基础上,相信会对下面事务失效的场景和原因有更好的理解。一.事务失效的几种常见情形1.1 public修饰符首先,非public的方法事务不生效,事务只在public修饰的方法上起作用,原因见源码:if (allowPu原创 2022-04-08 17:09:03 · 493 阅读 · 2 评论 -
Spring源码系列:事务原理
Spring源码系列:事务原理前言一. 事务案例1.1 项目结构和表结构1.2 代码编写部分1.3 配置文件1.4 运行结果二. 事务自定义标签2.1 注册InfrastructureAdvisorAutoProxyCreator类2.2 事务标签的提取2.3 小总结前言事务是干什么用的?事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。 也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。在了解事务的原理之前,我们先来看下一个简原创 2022-04-08 16:43:46 · 1549 阅读 · 0 评论 -
Spring源码系列: AOP实现
Spring源码系列: AOP实现前言一. AOP的使用二. AOP的实现2.1 创建AnnotationAwareAspectJAutoProxyCreator2.1.1 注册或升级AnnotationAwareAspectJAutoProxyCreator2.1.2 处理 proxy-target-class 以及 expose-proxy 属性2.2 AnnotationAwareAspectJAutoProxyCreator的作用2.3 获取增强器2.3.1 获取增强器findCandidateAd原创 2022-03-29 18:16:25 · 1853 阅读 · 0 评论 -
Spring源码系列 - ApplicationContext容器的功能扩展
Spring源码系列 - ApplicationContext容器的功能扩展前言一. ApplicationContext容器1.1 拓展功能前言在我Spring源码系列的前几篇文章中,看过的读者可能会发现,对于Spring的容器,我一直用的是BeanFactory。而本文将讲解Spring的另一个常用的容器ApplicationContext。ApplicationContext拥有BeanFactory的全部功能,同时扩展类许多的功能。两种都是用来加载Bean的一种容器。例如,BeanFactor原创 2022-03-19 15:02:45 · 1152 阅读 · 1 评论 -
Spring源码系列:Bean的加载
Spring源码系列:Bean的加载前言一. Bean的加载前言在我们前面两章,我们讲完了Spring如何加载、解析资源文件以及如何将其转化为BeanDefinition的(标签的解析)流程。那么接下来我们来看下Bean的一个加载过程。我们来从这段代码为切入口:public static void main(String[] args) { ClassPathResource resource = new ClassPathResource("test.xml"); DefaultListable原创 2022-03-11 20:00:41 · 1876 阅读 · 4 评论 -
Spring源码系列
Spring源码系列Spring源码系列:容器的基本实现Spring源码系列:标签的解析原理原创 2022-03-05 15:37:45 · 796 阅读 · 1 评论 -
Spring源码系列:标签的解析原理
Spring源码系列:标签的解析原理原创 2022-03-05 15:35:43 · 1029 阅读 · 1 评论 -
Spring源码系列:容器的基本实现
Spring源码系列:容器的基本实现原创 2022-02-26 18:02:32 · 1323 阅读 · 1 评论 -
深入理解springmvc-IOC原理
前言首先,ioc:springmvc里面的的控制反转,就是将对象的控制权转移给容器。而这里springmvc又有两种容器:1.BeanFactory2.ApplicationContext这里先简单介绍下这两个容器:1.Factory是一个接口:这个接口中定义了一系列管理Bean的方法,如:而真正充当Bean注册管理的角色是BeanDefinitionRegistry,而不是Bean...原创 2020-04-10 19:15:12 · 1073 阅读 · 0 评论