- 博客(131)
- 收藏
- 关注
原创 java 批量数据校验
最近有个场景就是,要对一批数据进行修改, 然后有一些key组成条件后是一对一的,要先从数据库中查出一个项目的全部数据,再根据那些条件 一一比较,我觉得不是很好,就给优化了一下.
2022-08-04 14:47:55
1423
原创 手撸mybatis07: SQL执行器的定义和实现
先是简单的实现了selectOne,把数据源连接查询什么的都写在里面了,那就没办法复用了,所以这一章就把那些可重复利用的代码择出来.
2022-08-03 15:41:05
604
原创 手撸spring05: 解析数据源 加入事务管理 封装连接数据库 并解析返回结果集代理映射
之前只是简单的走了一波代理还有sql打印,不过实际应用中还是要去封装JDBC来连接数据库,进行增删查改还有事务管理.
2022-07-26 16:46:35
387
原创 手撸mybatis03: xml配置的解析与注册
在使用mybatis时,都是直接将sql写在xml中,由mybatis去解析后,映射执行,再通过代理模式实现IDao
2022-06-27 13:39:03
300
原创 手撸mybatis02: 实现映射器的自动注册及获取使用
上回书只是说到单体的mapper代理, 但我们在平时的业务开发中肯定是一对的mapper类啊. 上回书的代理工厂,只是用来生成单个对象的工厂,而不是用于管理
2022-06-17 14:40:16
423
原创 手撸Mybatis01: 创建简单映射器代理工厂
抛开mybatis-plus不说了, 正常情况下都是写个mapper接口类,然后绑定一下映射文件mapper.xml, mybatis就自动帮我们映射好了. 不然一般接口类都是去实现类的.而这里就是通过代理工厂, 帮我们代理了这个接口的实现类.所谓代理,一般就是......
2022-06-17 10:00:42
223
原创 手撸spring15: @Autowired自动注入bean 以及@Value自动注入属性
上回书我们就说到要用@Value来取代spring配置, 顺便手撸一下@Autowired 其实很简单,撸完加深了对注解开发的理解
2022-06-15 14:14:45
653
原创 手撸spring14: component注解扫描 自动注册bean, 以及属性注入
之前主要都是通过配置文件定义spring的一些bean,以及一些属性文件, 不过后面spring升级成springboot后,很多都开始用注解开发来取代配置文件了.所以我们也开始慢慢升级了
2022-06-13 12:57:56
1017
原创 手撸spring13: aop动态代理插手bean的生命周期
aop动态代理可以在对象操作执行时,补充一些骚操作, 而且因为是通过方法名进行匹配的, 对象自己不用额外操作,可以说是无感的! 比较场景的场景就是 接口调用时间的记录了.
2022-06-10 13:08:30
245
原创 手撸spring12: 基于JDK、Cglib 实现AOP切面 动态代理生成对象
分别用jdk 和cglib代理生成对象, 并通过aop切面拦截方法做操作
2022-06-02 13:24:18
320
原创 nacos 一直访问本地地址
今天碰到一个比较特别的情况, 场景是从A项目copy过来 生成新项目B因为B项目只是拿nacos当配置中心而已而项目A则是拿nacos读配置外, 还进行了服务注册所以就有一个很坑爹的问题.我把项目B的配置文件里有关nacos的服务发现的配置干掉了!然后启动项目的时候就一直访问本地的地址, 一开始以为是配置读不到.后面把配置同步了以后发现, 配了服务发现就没问题了!后面想了一下,把pom里面的依赖干掉了就可以了!就是nacos 你一旦引入了服务依赖那它就认为你会去用它, 默认就把你去读默认配置
2022-05-26 18:18:07
2112
原创 手撸spring11: 基于观察者模式 实现事件监听器解耦代码
观察者模式可以理解为, 订阅某种行为后, 当执行该行为时, 会向订阅者发布事件, 接收该事件的订阅者,就会各自去做自己需要做的事, 以此完成系统的解耦.如用户注册会员后, 可能需要发送短信通知, 发送优惠券等一些常见的操作.如果把这些业务处理都写在一块就容易造成代码的耦合, 并且还会影响主流程的进行.例如我注册会员后, 你因为发送优惠券的问题导致会员注册失败, 这不就扯淡嘛!所以流程上来说, 应该是 我注册会员就只注册会员, 我跟需要配合的业务通知一下,这个人注册好了!你们爱怎么样就怎么样, 出问题
2022-05-26 16:19:06
203
原创 手撸Spring10: 通过Bean作用域管理对象, FactoryBean的实现及使用
交给Spring 管理的 Bean对象,获取的就是一定是单例模式吗? 有没有可能是原型模式呢?其实我们在配置参数时默认走的就是单例模式, 但特殊情况下需要原型模式也是可以调整的嘛!BeanDefinition既然要调整Bean的信息,那肯定要先改造bean定义类咯!package com.linnine.spring.beans.factory.config;import com.linnine.spring.beans.PropertyValues;import lombok.Data;
2022-05-25 10:17:08
241
原创 手撸Spring09: 通过继承感知类 获取Spring容器提供的一些资源
Srping是有提供一些资源供我们外部获取的, 比如Spring上下文,bean工厂等等, 我们要去获取资源进行扩展时, 并不需要进行注入,而是通过一些感知类来获取资源即可.首先是定义 标记接口Aware说起来你可能不信,但是他的源码就是这么简单 package com.linnine.spring.beans.factory;/** * 定义一个感知接口 * 用来归纳 */public interface Aware {}然后是定义一些感知类容器感知类用于感知bean工厂p
2022-05-24 13:38:20
429
原创 手撸spring08: 将初始化和销毁方法交给Spring管理 取代static静态代码块更优雅
上一章中是在Bean注册后实行属性的填充,和初始化过程中的前置处理和后置处理.今天撸的这块代码,缺胳膊少腿的, 所以我决定一边跟着撸 一边解决问题,把那些缺的胳膊和腿补上!两种形式可以实现这一章的需求, 一是通过实现Spring的默认类,重写方法,然后spring在执行时调用.另一种则是写在配置文件中的属性,通过init-method和destroy-method来手动注册定义初始化和销毁方法的接口InitializingBean初始化方法,言简意赅的方法名,在初始化后执行package com
2022-05-23 12:34:03
690
原创 封装elementUI 网页上传文件至七牛云
首先是上传模板singleUpload.vue目录: src/components/upload/singleUpload.vue有两个需要改的直接搜List itemqiniu.region.z1 -> 改成自己七牛云配置的regionqiniu.region.z0: 代表华东区域qiniu.region.z1: 代表华北区域qiniu.region.z2: 代表华南区域qiniu.region.na0: 代表北美区域qiniu.region.as0: 代表新加坡区域<
2022-05-18 16:10:23
370
原创 手撸spring07: 实现应用上下文ApplicationContext 自动加载配置文件 扩展机制
上回书说到加载配置文件中的配置信息自动注册到bean工厂里,这次我们再将他整合起来,一步到位,顺便扩展一下功能.添加两个后处理器BeanPostProcessorpackage com.linnine.spring.beans.factory.config;import com.linnine.spring.beans.BeansException; /** * bean后处理器 */public interface BeanPostProcessor { /** *
2022-05-12 10:53:17
412
2
原创 java 返回给前端的json数据 字符串为null时返回空字符串
在与客户端对接时, 他们一般不喜欢接收null的数据, 更喜欢接收"" 所以我们需要再序列化的时候将这个字段转换为空字符串首先写个序列化类@Configurationpublic class JacksonStringNotNullSerializer extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator jsonGenerator, Ser
2022-05-11 16:03:21
5433
3
原创 java 定时清理 逻辑删除 数据
我们现在大部分数据在执行删除操作时,大部分都是走的逻辑数据,也可以在适当的时候进行数据恢复.但是有些逻辑删除太久的数据就可以去清掉了, 今天就整理了一套简单的定时清理过期数据.首先是Mapper/** * <p> * 清理数据 Mapper 接口 * </p> * * @author linnine09 * @since 2021-11-29 */public interface CleanDeletedMapper extends BaseMapper {
2022-05-10 15:40:06
4209
原创 Process finished with exit code 1
我们在idea启动springboot项目时有时候会报这个问题,但是有什么异常都不说,这上哪找问题去啊!看别人的解决办法是去检查配置文件,pom文件,什么的,得检查到什么时候啊!今天一个简单粗暴的解决方法,直接定位问题所在!@SpringBootApplicationpublic class ApiApplication { public static void main(String[] args) { try { SpringApplication
2022-05-09 18:17:30
395
原创 手撸Spring06: 通过三种资源加载器读取配置文件
上回书说到, 我们每次要注册bean都是代码现场注册去插入,很不方便, 所以我们要开始搞从配置文件里面读出来自动注册,让用户一句话搞定.BeanDefinitionReader首先定义一个接口,因为可以有多种方式去读取配置文件/** * 读取 bean定义的接口 */public interface BeanDefinitionReader { BeanDefinitionRegistry getRegistry(); ResourceLoader getResourceLo
2022-05-05 10:32:52
1025
原创 spring手撸05: Bean属性注入 Bean依赖注入基本原理
前面说的只是根据有参构造方法的Bean创建, 今天则是来进行属性注入和依赖注入.比如常见的@Vale属性注入和@Resource依赖注入,不过我们还没那么快跳到注解,而是先讲一下基本的注入.之前就曾说过, BeanDefinition 没有那么简单,上次改成了Class,这次加入属性.主要是用于记录Bean需要的属性名,和属性值.PropertyValue所以建立一个PropertyValue对象.@Datapublic class PropertyValue { private f
2022-04-27 14:19:52
785
原创 Spring手撸04:使用Cglib实现含有构造函数的类实现策略
上回书说到Spring 实现Bean定义/注册/创建的一个流程,但在创建的时候其实埋了个坑,今天这回书,就把这个坑填掉!主要就是在实例化这个过程,只是草率的使用class.newInstance();但其实这个方法已经被废弃掉了,因为这个方法必须要有无参构造方法,所以很不灵活.所以今天就来重写一下获取实例化的方法.BeanFactory首先因为每个Bean的构造函数是不固定的,所以可以用这个方式来扩展一下getBean()public interface BeanFactory { O
2022-04-26 16:58:29
562
原创 Spring手撸03: 使用设计模式 实现Bean的定义/注册/获取
撸了一遍明白为什么用封装一个ApplicationContext了, 里面很多的方法继承下来, 要去调用都一脸懵逼.所以哦豁,又顿悟了一下为什么很多抽象类的那些实现好的方法要包保护了, 只给自己的子类去用, 外部是直接调用不到的.就需要ApplicationContext去封装,把这些实现的方法开放出去.先看一下整个流程之间类的关系, 这个也叫 类图补充一下这些符号的说明List item-: private+: public~: default#: protecte
2022-04-25 17:10:58
513
原创 关于springboot 整合 redis时 遇到的问题
最近在整合redis时老是遇到一些奇奇怪怪的问题,今天记录一下,避免以后再遇到,首先是配置文件@Componentpublic class RedisConfig { public static final Duration DEFAULT_ENTRY_TTL = Duration.ofMinutes(10); @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate&l
2022-04-24 11:16:41
1123
原创 手撸spring01: 创建简单Bean容器
spring是怎么去管理bean的呢?学习一下手撸spring.第一步先来简单的实现一个Bean容器的注册与获取所谓容器就是能够存储元素的结构就是容器, 例如List, Set 和Map在Spring Bean容器的场景下, 需要存放名称为索引的数据结构, HashMap就是个合适的选择, 工厂模式一般也都是这么搞的.先画个图那个Bean没有那么重要,第一步先来创建BeanDefinition,因为是简单版,一开始就只有一个bean,后续会慢慢加入其他的属性/** * 定义一个bean
2022-04-20 17:38:08
616
原创 Spring03: bean的生命周期; bean后处理器介入的骚操作; 模板方法设计模式
bean的生命周期是一道很常见的面试题, 用代码具象化一下,很容易就理解了.@Slf4j@Componentpublic class LifeCycleBean { public LifeCycleBean(){ log.info("构造方法,实例化"); } @Autowired public void autowired(@Value("${spring.application.name}") String name){ log.in
2022-04-10 16:03:06
408
原创 java list 根据对象的字段进行排序
java list常见的几种排序方法, 里面的方法放回的是这个 方便套Comparator comparator按照List中对象的id属性升序list.sort(Comparator.comparing(Stu::getId))按照List中对象的id属性降序list.sort(Comparator.comparing(Stu::getId).reversed());多条件升序list.sort(Comparator.comparing(Stu::getId).thenComparing(
2022-04-08 14:16:57
3558
原创 Spring源码02: BeanFactory实现
BeanFactory默认是由DefaultListableBeanFactory实现的直接上代码加注释public class TestFactory { public static void main(String[] args) { //刚创建是空的 DefaultListableBeanFactory beanFactory =new DefaultListableBeanFactory(); //需要去定义bean 类型 单例/多例 初始
2022-04-04 14:59:16
677
原创 如何给swagger加请求头的三种方法 @ApiImplicitParam @Header 单方法和全局
场景是这样的,我们自己封装了一个工具类去获取请求头里的东西, 但是在swagger没有自动给一个请求头,所以就得另外配, 不是配在@ApiOperation中.单方法添加请求头@ApiImplicitParamswagger提供的注解, 手动配置,就在controller某个接口方法上,类似@ApiOperation的位置,上下都可以@GetMapping("page")@ApiOperation(value = "分页搜索")@ApiImplicitParam(name = "Authoriz
2022-04-02 13:09:56
6509
原创 Spring源码01: BeanFactory与ApplicationContext
在Springboot的启动类中,常常都是这么一块代码@SpringBootApplicationpublic class JavaBaseApplication { public static void main(String[] args) { SpringApplication.run(JavaBaseApplication.class, args); }}但其实这个run方法是有返回值的,返回的是ConfigurableApplicationContext
2022-04-01 22:07:43
465
原创 synchronized详情 锁属性 锁方法 锁类 ,可重入不公平锁 锁优化
最近复习一下基础,查缺补漏,输出倒逼一下输入. 以后忘了再来翻翻,看看自己输出的怎么样,反复卤煮好吧!首先是几个基本特性:一把锁只能被一个线程获取, 一旦被获取后, 其他的线程只能等待,锁释放后才可重新获取.每个实例对象都有各自的锁, 不同实例对象互补影响,除非两种特殊情况,一种是直接锁在类上(*.class),或者是用synchronized修饰的static静态方法,这时的对象就是共用一把锁synchronized修饰的方法, 不管是正常流程结束,还是抛异常,都会释放锁.然后是
2022-04-01 18:17:51
596
原创 @PostConstruct 与 ApplicationContextAware实现类冲突问题解决
一般@PostConstruct 是可以在bean注册时执行的方法.而我们经常会需要用到spring上下文的一些参数,就可以用一个工具类如SpringContextUtilpublic class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplica
2022-04-01 14:18:18
2070
1
原创 filebeat收集nginx日志打到logstash处理收入到es elk
大概的一个流程图nginx配置主要是将日志转成json格式方便解析 , 一般配在 http{ }里 log_format access_json '{"@timestamp":"$time_iso8601",' '"host":"$server_addr",' '"clientip":"$remote_addr",' '"size":$body_bytes_sent,' '"responsetime":$request_time,' '"upstreamtim
2022-03-31 13:35:43
5243
原创 nginx 代理转发 传递真实IP配置
当服务部署在服务器上时,一般都是通过nginx做代理转发,但是在common中的aop日志打印时, ip获取到的就变成本地的了,所以本文主要是通过修改nginx的代理配置, 以及后端的工具类解析, 打印真实ip.nginx配置只需配置在监听的对应端口下就可以全部生效server { listen 8000; server_name localhost; proxy_set_header Host $host; proxy_s
2022-03-31 13:30:12
16290
原创 请求日志打印包
最近借到一个需求,是真的难搞!要造一个工具包,自动收集请求日志,然后做分析.卧槽,如果只是在项目中的logback.xml中配置分分钟根据类分个配置早搞定了,但是为了以后的方便,要集成到一个随时拔插的jar包里!经过几番尝试,踩了不少坑,总算搞出来了!一些依赖<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId>
2022-03-30 16:06:39
588
原创 springboot 拦截器模板 Interceptor
配置文件中添加拦截器要拦截和要放过interceptor: #拦截所有以api开头的请求 多个就用逗号隔开 path-patterns: /api/**,/user/** #放过这个请求 exclude-path-patterns: /api/page/m然后写一个拦截器类 ,主要重写第一个方法,做一下判断/** * 内部调用接口拦截 * * @author linnine */@Slf4j@Componentpublic class ApiInterceptor i
2022-03-30 11:24:18
404
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人