Java
文章平均质量分 70
Java开发日常记录
byx2000
这个作者很懒,什么都没留下…
展开
-
Spring Boot应用启动时自动建表和插入测试数据
Spring Boot应用启动时自动建表和插入测试数据原创 2023-03-12 17:20:43 · 663 阅读 · 0 评论 -
Java中将标准输入和输出重定向到字节流
在Java程序中,可以通过给System.in和System.out重新赋值来重定向标准输入和输出。在单元测试的时候,为了对涉及到标准输入和输出的程序进行测试,常用的做法是将标准输入和输出重定向到文件,这样就可以用程序实现自动化的比对。但是这样做会有文件读取的开销,可能会降低单元测试的运行效率。所以,更优的做法是将标准输入和输出重定向到字节流,这样就能避免文件读取的开销。为了实现以上的效果,可以封装一个叫做getOutput的工具函数,它以字符串的形式传递标准输入内容,并以字符串的形式返回标准输出的内原创 2022-05-03 10:21:44 · 685 阅读 · 0 评论 -
加速Java异常类的创建
大家都知道,Java在创建异常对象时会生成调用栈信息,这样当异常抛出时,开发者就能从报错信息中看到异常抛出的路径,非常有利于定位问题。但是,调用栈信息的生成是一件非常耗时的工作。在某些特殊情况下,我们需要用异常来实现控制流跳转(比如从多层递归中跳出),此时不需要生成调用栈信息。在这种情况下,关闭异常的调用栈信息生成将会极大地提升程序的运行效率。public class FastException extends RuntimeException { public FastException()原创 2022-04-26 21:30:14 · 415 阅读 · 0 评论 -
Java8 Stream的简易实现
前言Java8新增的Stream API是一个强大的特性,它可以简化集合中的常用操作,包括过滤、映射、分组等。下面就来实现一个简易版的Stream。从表面上看,流似乎和列表很接近,但实际上它们有着本质的区别。列表是多个元素的容器,当列表被创建出来时,它里面的每个元素也已经被创建出来了。流是一种计算结构,它封装了内部元素如何产生的计算过程,但是并没有包含实际的元素数据。换句话说,当一个流被创建出来时,它内部的元素并没有被创建,但是我们可以通过调用流的方法来按顺序生成每个元素。所以,流具有原创 2022-03-19 15:58:03 · 762 阅读 · 0 评论 -
基于ParserCombinator的正则表达式引擎
这篇文章介绍如何用Parser Combinator实现一个简单的正则表达式引擎。CursorCursor封装了字符串的状态,表示一个光标位置。光标位置只能向后移动,可以方便地获取光标指向的字符,以及判断是否到达字符串末尾。public class Cursor { private final String input; private final int index; public Cursor(String input, int index) { this原创 2021-10-20 19:56:18 · 262 阅读 · 0 评论 -
Spring源码分析——Configuration配置类解析流程
示例工程引入Maven依赖:<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.5</version> </dependency></dep原创 2021-07-01 09:48:54 · 266 阅读 · 0 评论 -
在SpringBoot中优雅地实现策略模式
首先定义一个Strategy接口来表示一个策略:public interface Strategy { String flag(); void process();}其中flag方法返回当前策略的唯一标识,process则是该策略的具体执行逻辑。下面是Strategy接口的两个实现类:public class StrategyImpl1 implements Strategy { @Override public String flag() { r原创 2021-06-10 21:25:39 · 603 阅读 · 0 评论 -
ByxOrm——模仿MyBatis的轻量级ORM框架
ByxOrm是一个模仿MyBatis设计的轻量级ORM框架,支持以下特性:使用动态代理生成Dao接口的实现类使用注解配置Dao方法对应的SQL语句使用注解配置实体类字段与数据库列名的对应关系动态查询和动态更新项目地址:https://github.com/byx2000/byx-ormMaven引入<repositories> <repository> <id>byx-maven-repo</id> &原创 2021-05-13 21:09:07 · 198 阅读 · 0 评论 -
ByxContainerAnnotation——基于注解的轻量级IOC容器
ByxContainerAnnotation是一个模仿Spring IOC基于注解的轻量级IOC容器,支持构造函数注入和字段注入,支持循环依赖处理和检测,具有高可扩展的插件系统。项目地址:https://github.com/byx2000/byx-container-annotationMaven引入<repositories> <repository> <id>byx-maven-repo</id> <n原创 2021-05-13 14:19:36 · 267 阅读 · 0 评论 -
如何自定义一个spring-boot-starter
开发byx-spring-boot-starter项目首先创建一个Maven项目,名为byx-spring-boot-starter:<groupId>byx.spring</groupId><artifactId>byx-spring-boot-starter</artifactId><version>1.0.0</version>引入如下依赖:<dependency> <groupId>原创 2021-04-17 20:49:47 · 219 阅读 · 0 评论 -
Java反射中与自动装箱有关的坑及其解决方案
Java反射中与自动装箱有关的坑最近在写一个项目,里面需要频繁使用反射操作。由于Java的反射API使用起来比较复杂,所以我决定把常用的反射操作封装成一个工具类:ReflectUtils。在ReflectUtils中,有这么一个call方法:public static <T> T call(Object obj, String methodName, Object... params);这个方法利用反射调用某个实例对象的某个方法,obj是对象实例,methodName是方法名,para原创 2021-02-25 12:57:20 · 149 阅读 · 2 评论 -
ByxAOP——简易AOP框架
ByxAOP是一个基于JDK动态代理的简易AOP框架,具有以下功能特性:对目标对象的特定方法进行拦截和增强支持灵活的拦截规则和自定义拦截规则动态实现接口和批量实现接口方法灵活的对象代理机制项目地址:github 码云使用示例首先来通过一个简单例子快速了解ByxAOP。假设我们有一个UserDao接口:public interface UserDao{ int listAll(); int listById(int id); void deleteByNam原创 2021-02-24 11:21:23 · 176 阅读 · 0 评论 -
解决构造函数导致的循环依赖
本篇文章介绍如何解决由构造函数导致的循环依赖问题原创 2021-02-16 17:04:33 · 542 阅读 · 0 评论 -
自制IOC容器(4)
本系列文章介绍ByxContainer的实现思路。ByxContainer是一个简单的轻量级IOC容器,具有以下特性:使用JSON格式的配置文件支持构造函数注入、静态工厂注入、实例工厂注入、属性注入、setter注入、条件注入组件的延迟加载和单例组件根据id注册、获取容器中的组件ByxContainer的设计借鉴了ajoo大神的博客。项目地址:github 码云本篇文章介绍ByxContainer中的条件组件。需求假设现在有一个MyDao接口,以及它的两个实现类:public in原创 2021-02-15 11:59:35 · 73 阅读 · 0 评论 -
自制IOC容器(3)
本系列文章介绍ByxContainer的实现思路。ByxContainer是一个简单的轻量级IOC容器,具有以下特性:使用JSON格式的配置文件支持构造函数注入、静态工厂注入、实例工厂注入、属性注入、setter注入、条件注入组件的延迟加载和单例组件根据id注册、获取容器中的组件ByxContainer的设计借鉴了ajoo大神的博客。项目地址:github 码云本篇文章介绍ByxContainer中与对象初始化有关的设计。回顾在上一篇文章中,我们解决了对象创建的问题,但是在实际开发中原创 2021-02-13 11:46:34 · 90 阅读 · 1 评论 -
ByxContainer——轻量级IOC容器
ByxContainer是一个用Java编写的轻量级IOC容器,具有以下特性:* 使用JSON格式的配置文件* 支持构造函数注入、静态工厂注入、实例工厂注入、属性注入、setter注入、条件注入* 组件的延迟加载和单例组件* 根据id注册、获取容器中的组件原创 2021-02-10 17:39:16 · 350 阅读 · 0 评论 -
自制IOC容器(2)
本系列文章介绍ByxContainer的实现思路。ByxContainer是一个简单的轻量级IOC容器,具有以下特性:* 使用JSON格式的配置文件* 支持构造函数注入、静态工厂注入、实例工厂注入、属性注入、setter注入、条件注入* 组件的延迟加载和单例组件* 根据id注册、获取容器中的组件原创 2021-02-09 21:13:04 · 71 阅读 · 0 评论 -
自制IOC容器(1)
本系列文章介绍ByxContainer的实现思路。ByxContainer是一个简单的轻量级IOC容器,具有以下特性:* 使用JSON格式的配置文件* 支持构造函数注入、静态工厂注入、实例工厂注入、属性注入、setter注入、条件注入* 组件的延迟加载和单例组件* 根据id注册、获取容器中的组件原创 2021-02-08 19:57:44 · 88 阅读 · 0 评论 -
在Java中使用泛型消除强制类型转换
在Java中使用泛型消除强制类型转换假设类X有一个getObject方法,返回一个Object类型的数据:public class X{ public Object getObject(...) { ... return obj; }}使用X的代码如下:X x = ...;A a = (A) x.getObject(...);B b = (B) x.getObject(...);C c = (C) x.getObject(...);原创 2021-02-08 10:16:02 · 2345 阅读 · 1 评论 -
什么是IOC容器?为什么需要IOC容器?
什么是IOC容器?为什么需要IOC容器?假设我们现在正在使用三层架构开发一个项目,其中有一个用户模块,包含登录、注册等功能。现在已经写好了User实体类和UserDao数据访问层:public class User{ private Integer id; private String username; private String password; // 以下是getter和setter方法}public interface UserDao{ /原创 2021-02-02 19:58:25 · 4866 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(6)
JDBC工具类——JdbcUtils(6)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtils更新操作的封装下面是更新操作的代码:Connection conn = null;PreparedStatement stmt = null;try{ // 获取连接 conn = JdbcUtils.getConnection原创 2021-01-27 08:50:30 · 179 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(5)
JDBC工具类——JdbcUtils(5)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtils回顾到目前为止,JDBC的查询操作已经封装得差不多了,结果集转换器和行转换器这两个抽象让查询操作使用起来非常方便,用户不仅可以直接使用预定义的转换器,还可以自定义转换器,基本能实现各种常见的查询需求。但是还是存在一些不完美的地方。ResultSet暴露原创 2021-01-27 08:49:26 · 123 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(4)
JDBC工具类——JdbcUtils(4)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtils回顾在上一篇文章中,我们实现了下面两个RowMapper:public class UserRowMapper implements RowMapper<User>{ @Override public User map(R原创 2021-01-27 08:48:24 · 134 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(3)
JDBC工具类——JdbcUtils(3)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtils回顾在上一篇文章中,我们抽象出了一个ResultSetMapper<T>接口,用于封装用户对结果集的处理。假如用户想把结果集转换成一个User列表,则需要写如下实现类:public class UserListResultSetMappe原创 2021-01-26 11:47:58 · 127 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(2)
JDBC工具类——JdbcUtils(2)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtils回顾在上一篇文章中,我们已经通过提取公共方法将获取连接、语句创建、释放资源这些重复操作抽象成了工具类中的方法。但是,在客户代码中还存在着一些结构上的重复。这些重复,可以通过模板方法模式来进一步封装。由于查询操作比较常用,因此我们先考虑对查询操作进行封装原创 2021-01-26 11:46:59 · 173 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(1)
JDBC工具类——JdbcUtils(1)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtils分离数据库配置根据上一篇文章的分析,我们知道,不应该把数据库配置信息硬编码在Java代码中,因为这会导致维护困难。为了解决这个问题,可以把数据库的配置信息单独放在一个外部的配置文件中,然后工具类通过读取配置文件来获取数据库配置。数据库的配置信息主要包括原创 2021-01-26 11:44:59 · 356 阅读 · 0 评论 -
JDBC工具类——JdbcUtils(0)
JDBC工具类——JdbcUtils(0)前言本系列文章介绍JDBC工具类——JdbcUtils的封装,部分实现参考了Spring框架的JdbcTemplate。完整项目地址:https://github.com/byx2000/JdbcUtilsJDBC使用示例在JDBC中,一共有查询和更新两种操作。下面是一段查询操作的代码:Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;try{原创 2021-01-26 11:42:54 · 175 阅读 · 0 评论