项目打包没问题但是启动报ClassNotFoundException 因此,如果A应用需要使用C应用中的类,而B应用将C应用的依赖范围设置为了provided,那么在A应用的运行环境中,如果没有手动提供C应用的JAR文件,A应用就会因为找不到C应用中的类而抛出ClassNotFoundException。即使B应用将C应用的依赖范围设为provided,A应用也可以在其POM中显式添加C应用的依赖,这样可以确保C应用的依赖在A应用的构建过程中被正确包含。
踩坑系列——mysql数据库字段类型为tinyint输入字符串条件查询无效 mysql数据库字段类型为tinyint输入字符串条件查询无效,MySQL会尝试将这个字符串转换为整数来进行比较,结果可能非预期
如何保证数据库的数据和Redis的数据一致性 实际项目中有可能会使用Redis缓存数据,那么在更新数据的时候如何保证数据库中的数据和Redis缓存的数据一致,缓存同步策略的选择是一个很重要的问题。网上有各种说法,大概总结有以下几种,看看每种方案是否可行以及存在的问题和适用场景。
Spring中的全局异常处理 2、@ExceptionHandler(Throwable.class),因为Throwable是所有异常的父类,这里配置Throwable来拦截所有的异常,也可以指定其他异常类型,如@ExceptionHandler(IllegalArgumentException.class),则此方法处理IllegalArgumentException 类型的异常,如果参数为空,默认方法参数列表中列出的任何异常。1、@ControllerAdvice,没有配置具体的拦截规则,默认拦截处理所有的controller。
通过WEB页面上传文件并调用第三方feign接口处理上传实现 在A应用里面提供web接口给前端接收上传的文件,然后A应用再通过feign接口调用B应用,将文件进行传输,B应用真正处理文件上传到服务器,同时上传文件时除了文件参数还有其他额外的参数。(1)feign接口多个参数必须加上consumes = MediaType.MULTIPART_FORM_DATA_VALUE,而且对应的file要用@RequestPart。(2)@RequestPart(“file”),这里的“file”定义接口调用方和提供方必须一致。(3)feign实现文件上传还需要引入依赖。
Class.forName和ClassLoader.loadClass的区别 在Java中,类加载器把一个类装入Java虚拟机中,要经过三步来完成:加载、连接和初始化,其中连接又分为验证、准备和解析三个阶段。加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段可以在初始化阶段之后发生,也称为动态绑定或晚期绑定。加载:查找和导入类或接口的二进制数据;连接:又可以分成校验、准备和解析三步,其中解析步骤是可以选择的;验证:检查导入类或接口的二进制数据的正确性;准备:给类的静态变量分配并初始化存储空间;解析:将符号引用转成直接引用;
在Spring项目启动时处理事情的几种实现方式 在Spring里面有一套完整的事件处理机制,容器启动过程中各节点会有对应的事件,如果要在初始化时做一些事情,可以实现ApplicationListener接口接收相应的事件,实现onApplicationEvent方法,在容器将所有的 Bean 都初始化完成之后,就会执行该方法。stop(Runnable):容器关闭后,spring 容器发现当前对象实现了 SmartLifecycle,就调用 stop(Runnable), 如果只是实现了 Lifecycle,就调用 stop()。
JDK动态代理和CGLIB动态代理 在SpringAOP中基于动态代理实现功能的增强,也就是动态的生成代理类,在代理类中织入增强的逻辑然后调用目标对象的方法。动态代理中用的比较多的两种:JDK动态代理、CGLIB动态代理。JDK动态代理使用JDK的java.lang.reflect.Proxy类的newProxyInstance方法实现的代理。用一个测试接口看下具体实现:public interface JdkProxyDemoService { void queryTrs();}@Servicepublic