springboot多个对象传值通过对象自动注入值参数类型不匹配

目前在做springboot多个对象传值项目的shiro session redis共享功能但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常

通过debug看到他们的类信息是一样的

难道只是看起来一样么?峩来判断一下

那么我们知道JVM判断两个类对象是否相同的依据:一是类全称;一个是类加载器

既然他俩的类全称一样那么问题肯定就出在了类加载器上了

我们可以Debug看一下他俩的类加载器

果然不出所料,他俩的类加载器是不同的!

那么是什么原因导致他的类加载器不一样呢

  夶家都知道虚拟机的默认类加载机制是通过双亲委派实现的。springboot多个对象传值为了实现程序动态性(比如:代码热替换、模块热部署等白話讲就是类文件修改后容器不重启),“破坏或牺牲” 了双亲委派模型springboot多个对象传值通过强行干预-- “截获”了用户自定义类的加载(由jvm嘚加载器AppClassLoader变为springboot多个对象传值自定义的加载器RestartClassLoader,一旦发现类路径下有文件的修改springboot多个对象传值中的spring-boot-devtools模块会立马丢弃原来的类文件及类加载器,重新生成新的类加载器来加载新的类文件从而实现热部署。比较流行的OSGI也能实现热部署)

既然源头因热部署而起,所以只要想办法关掉springboot多个对象传值的热部署即可

读者也可以在application.properties设置禁用属性,但它的作用域只发生在当前模块如果你的项目牵扯到多个模块,最好通过上面的方式在整个运行系统的级别禁用以免出现多个模块之间实现类文件调用时类加载器不一致的问题。

我要回帖

更多关于 springboot多个对象传值 的文章

 

随机推荐