加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

IDEA 2022.2版本新特性

IDEA 2022.2 引入远程开发模式,将后端服务部署在服务器上,前端 thin client 通过 SSH 进行轻量交互,提升本地体验;完整支持 Spring 6 与 Spring Boot 3,包括新注解;新增键盘快捷键全局调节编辑器字号;JSON、YAML、properties 中的 URL 可直接点击打开或生成 HTTP 请求;实验性加入 GraalVM 原生调试器(需开发版 GraalVM 与插件);改进 Bean Validation 注解的引用与折叠;还包括 Groovy 集成查询、升级 Kubernetes/Docker、运行单文件、导入受信任 SSL 证书、HTTP 客户端优化、从 JBR11 升至 JBR17、代码检查与补全等多项功能提升。

解决SpringBoot打成jar包无法加载resources下文件的问题

文章介绍了SpringBoot 打成 jar 包后在 Linux 环境下无法直接读取 resources 目录中文件(如 application.yml、ip2region.db)的问题,并给出了解决方案。核心思路是使用 Spring 提供的 PathMatchingResourcePatternResolver 通过通配符获取资源对象,然后把资源的输入流复制到本地文件系统,确保文件在运行时可以被正常访问。示例代码展示了如何获取 ip2region.db 资源、读取其 InputStream 并使用 Apache Commons IO 的 FileUtils.copyInputStreamToFile 写入本地文件。文中还列出了所需的 Spring 核心包和 commons‑io 包的导入声明。此方法可解决 jar 包内部资源加载失败的常见场景。

StringUtils部分API的用法与区别

本文通过示例代码演示了 Apache Commons‑Lang3 中 `StringUtils` 常用 API 的用法与区别,重点比较了 `isEmpty/isBlank`(仅判断空值 vs 包含空格)、`isAnyEmpty/isNoneEmpty`(任意为空 与 全部非空的相反关系)、`isAnyBlank/isNoneBlank`(任意空白 与 全部非空白的相反关系),并给出对应的输出结果。文末列出 `StringUtils` 其它常用方法(如 trim、equals、startsWith、substring、split、replace、pad、case 转换等)及其中文含义,并提供官方文档链接供进一步查阅。

过多赠予,无所适从

本文以 Spring @Autowired 常见的 “required a single bean, but 2 were found” 错误为例,先展示在学生管理系统中因新增 CassandraDataService 实现而导致的启动异常。随后深入剖析 @Autowired 的注入流程,说明 Spring 在解析依赖时会在所有同类型 Bean 中寻找唯一候选,决定依据包括 @Primary、@Priority 以及 Bean 名称的严格匹配,若无可比优先级且属性不可接受多 Bean(如非集合、数组),便抛出冲突异常。针对该问题,提供三类解决思路:①在需要的实现上加 @Primary;②使用 @Qualifier 或属性名与 Bean 名称相同实现显式匹配;③将依赖改为集合、Map 等可接受多 Bean 的类型。文章强调应根据业务需求选择合适方式,以避免盲目注入导致的错误。

原型 Bean 被固定

本文分析了在 Spring 中将原型(prototype)Bean 通过 `@Autowired` 注入单例 Controller 时,实例会在容器创建时被固定,导致原型作用失效并抛异常。通过源码可知,属性注入只执行一次,随后始终使用同一实例。为实现每次调用都获取新实例,提供了两种方案:① 注入 `ApplicationContext`,在方法中调用 `getBean`;② 在获取方法上使用 `@Lookup`,让 Spring 通过 CGLIB 在运行时替换实现并每次返回新 Bean。文章还简要说明了 `@Lookup` 的实现机制,强调掌握 Spring 的潜规则和源码细节有助于避免类似问题。

定义的 Bean 缺少隐式依赖

Spring 将标记为 @Service 的类注册为 Bean 时,会依据其构造函数的参数从容器中查找对应的依赖并通过反射实例化。如果构造函数需要的类型(如 String)在容器中不存在,Spring 在创建 Bean 时就会抛出 “required a bean of type … could not be found” 的错误。源码显示,Spring 通过 resolveDependency 在 BeanFactory 中寻找匹配的 Bean,并将其组装为构造参数。解决办法是显式在配置中提供所需的 Bean(如 `@Bean public String serviceName(){ return "MyServiceName"; }`),或避免多个可选构造函数导致歧义。文章提醒开发者不要用普通 new 方式思考 Bean 的创建,必须遵循 Spring 的隐式依赖装配规则。

隐式扫描不到 Bean 的定义

Spring Boot 启动类使用 @SpringBootApplication 时,内部的 @ComponentScan 默认只扫描启动类所在包及其子包。因此把 Controller 移到别的包后,未被扫描到,导致 Bean 不存在、接口失效。解决办法是显式配置扫描路径,如在启动类上添加 @ComponentScan("com.zou.controller"),或使用 @ComponentScans 指定多个包。注意显式指定后默认包会被覆盖,需要自行包含所有需要的包。

Java8新特性之Stream流

Stream是Java8处理集合的核心抽象,具惰性求值、无状态/有状态、短路等特性。文章介绍了流的创建方式(collection、array、of、iterate、generate、Reader、Pattern),常用中间操作(filter、map/flatMap、sorted、peek),以及终止操作(match、find、count、max/min、reduce、collect),并示例并行流与Collector的用法,帮助快速上手Stream API。

全面拥抱Java17!

Java 17是自Java 11后的又一 LTS 版本,本文重点梳理其语法层面的九大新增特性:文本块让多行字符串更直观;switch 表达式支持返回值、箭头写法及 yield;record 简化不可变数据类的声明;sealed class 通过 permits 限定子类继承范围;instanceof 模式匹配合并类型检查与变量绑定;Helpful NullPointerExceptions 在空指针异常中直接指出导致 NPE 的具体表达式;以及日期周期的格式化、紧凑数字格式化和 Stream.toList() 等实用改进,配合代码示例帮助读者快速上手 Java 17。

基于SpringBoot的在线招聘网站

本文介绍了基于SpringBoot的在线招聘系统的整体架构与功能实现,采用SpringBoot、MyBatisPlus、Layui、MySQL、Redis、Shiro、WebSocket、Thymeleaf等技术。系统分为游客、求职者、HR和管理员四类角色:游客可浏览首页;求职者可注册、条件筛选职位、查看详情、在线聊天、生成并分享简历链接、修改个人信息;HR可编辑个人资料、发布/管理岗位、管理员工、查看公司简介并进行在线沟通;管理员提供用户统计、聊天记录管理、用户封禁、简历、公司、岗位的统一管理以及数据字典等后台功能。整个项目实现了登录验证码、敏感词过滤、链接复制等细节,形成完整的招聘平台流程。

面试现场【Spring篇】

文章概述Spring面试要点:涉及常用设计模式及模块;阐释IOC/DI、BeanFactory 与 ApplicationContext、FactoryBean、@Autowired/@Resource 区别;介绍AOP 原理、JDK 与 CGLIB 代理、Spring AOP 与 AspectJ 差异及通知类型;说明 Bean 生命周期、三级缓存解决循环依赖;列举事务隔离级别、传播行为;简述 SpringBoot 自动装配原理。

遍历HashMap的几种方式及效率对比

本文通过两套含100万条数据的HashMap(键分别为连续整数和等差数列),比较了六种遍历方式在遍历key、value、key+value 时的执行时间。实验结果表明:①键值越简单(连续整数)查找速度越快;②大数据量下遍历key+value 时,entrySet(尤其 for‑each 形式)明显快于仅用keySet 再调用 get;③仅需value 时直接遍历 map.values 的效率最高。综上,推荐在需要同时获取键值时使用 entrySet,在仅取值时使用 values。