- 博客(22)
- 收藏
- 关注
原创 TiDB 是一个分布式 NewSQL 数据库
数据库发展至今已经有3代了:SQL,传统关系型数据库,例如 MySQLnoSQL,例如 MongoDB,RedisnewSQL。
2025-02-21 11:28:31
844
原创 SpringAI项目之Ollama本地部署(qwen/deepseek)模型
下载:https://ollama.com/download。写一个简单的index.html访问后端接口。自己创建项目,这是我自己完整的pom文件。这是我的controller的接口方法。
2024-12-23 11:17:09
417
原创 Java为什么需要保留基本数据类型
综上所述,虽然现代 Java 中提供了自动装箱拆箱机制,使得使用包装类更加方便,但在追求高性能的场景下,基本数据类型仍然是不可或缺的。特别是在数值密集型计算、嵌入式系统开发、游戏开发等领域,基本数据类型的高效性是非常重要的。对象则需要更多的内存来存储指向实际数据的引用以及对象头信息,这通常比存储值本身需要更多的空间。对于大量数值计算的应用程序,使用基本数据类型可以显著减少内存访问的时间,从而提高性能。这样可以在需要对象的地方使用基本数据类型,同时保持代码的简洁性。
2024-08-21 14:44:19
203
原创 4 种线程池
Java 里面线程池的顶级接口是 Executor,但是严格意义上讲 Executor 并不是一个线程池,而 只是一个执行线程的工具。真正的线程池接口是 ExecutorService。
2024-08-16 15:22:08
386
1
原创 SkyWalking 的 Agent
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsEnhancePluginDefine.MethodInterceptor: 这个接口定义了拦截器的基本方法,如 beforeMethod, afterMethod, throwing。org.apache.skywalking.apm.agent.core.boot.ServiceDiscoveryBootStrap: 负责服务发现的初始化。
2024-05-23 14:45:54
545
1
原创 阿里云的Arthas(阿尔萨斯)
监控变量或表达式的变化,例如 watch com.example.YourClass setYourVariable 'System.out.println("YourVariable updated to: " + $1)'。: 跟踪方法的调用,例如 trace com.example.YourClass YourMethod 'print("Method called with args: " + Arrays.toString(args))'。: 输出线程堆栈信息,例如 tdump。
2024-05-14 16:23:08
1937
原创 Spring AOP还涉及以下方面
Spring AOP支持缓存注解,如@Cacheable、@CacheEvict和@CachePut,这些注解的处理由CacheInterceptor实现。目标源表示代理的目标对象,可以是静态的(如单例bean)或动态的(如AOP代理的类)。Spring AOP也支持异步方法执行,通过@Async注解实现。ProxyFactoryBean和AdvisedSupport是创建代理对象的工厂,它们提供了配置和管理代理的接口。代理对象与被代理的目标对象具有相同的生命周期,由Spring容器管理。
2024-05-10 15:27:50
361
原创 Spring AOP(面向切面编程)
这里,getTransactionAttribute()获取事务属性,txMgr.getTransaction()开始事务,mi.proceed()执行目标方法,根据结果或异常决定提交或回滚事务。切点匹配是通过AspectJExpressionPointcut的matches()方法实现的,该方法使用AspectJ的编译时编织(CTW)和运行时编织(RTW)的API。proceed()方法调用JoinPoint的proceed(),如果抛出异常,afterThrowing()会被调用。
2024-05-10 15:20:52
696
原创 spring源码中使用了哪些设计模式?
Spring的Resource接口和它的实现类(如ClassPathResource,FileSystemResource)展示了桥接模式,将资源的抽象与资源的实现分离。例如,PlatformTransactionManager接口和它的实现类如DataSourceTransactionManager,根据事务的不同状态来执行相应的操作。Spring MVC的HandlerAdapter接口和它的实现类,如RequestMappingHandlerAdapter,封装了控制器处理请求的具体逻辑。
2024-05-07 14:40:51
1452
原创 Spring的IoC容器初始化及Bean创建的关键步骤
考虑一个简单的Bean创建过程,以ApplicationContext的初始化和一个Bean的实例化为例,源码层面的逻辑涉及很多类和层次,但核心思想是通过反射、工厂模式和策略模式等设计模式,实现高度可配置和灵活的Bean管理机制。深入解析Spring源码涉及众多细节,这里我将按照一个简化流程,基于Spring的IoC容器初始化及Bean创建的关键步骤进行解析,主要关注ApplicationContext的初始化过程和Bean的实例化逻辑。:通过getBean()方法触发Bean的实例化。
2024-04-30 15:10:09
1193
原创 在Spring框架中,解决循环依赖问题主要依赖于以下几种策略
通过这些缓存,Spring能够在Bean实例化和初始化的不同阶段,妥善处理循环依赖,确保所有Bean都能正确初始化。这样,在初始化一个Bean时,如果遇到循环依赖,Spring可以先用一个代理对象占位,待依赖链中的其他Bean完成初始化后再填充实际的Bean实例。它允许Spring先实例化Bean,然后逐步注入依赖,即使依赖尚未完全初始化。构造器注入:如果循环依赖是通过构造器注入产生的,Spring无法解决这种依赖,因为构造器必须在对象实例化时完成,此时Bean还未完全创建,无法注入到对方中。
2024-04-30 14:48:00
289
原创 在Spring框架中,三级缓存是用于解决单例bean的循环依赖问题的一种机制
通过这三级缓存的配合,Spring能够在处理复杂的依赖关系图时,有效地解决单例bean之间的循环依赖问题,保证每个bean都能被正确地创建和初始化。当Spring容器初始化单例bean时,会使用以下三个级别的缓存来管理bean的创建过程,以确保即使存在循环依赖,也能正确实例化并注入bean。: 存储完全初始化好的单例bean实例,即完成了实例化、属性填充、初始化方法调用等所有初始化步骤的bean。: 这是最直接的缓存,一旦bean准备就绪,就会放入此缓存中,后续对该bean的请求直接从此缓存中获取实例。
2024-04-30 14:45:32
280
原创 spring中的依赖注入和依赖发现啥区别?
依赖注入是Spring推荐的主要依赖管理方式,因为它促进了松耦合、易于测试和维护的代码结构。而依赖发现虽然提供了运行时的灵活性,但通常不建议常规使用,因为它违背了IoC的基本原则,即组件不应该负责查找它们的依赖。1、定义:依赖注入是一种设计模式,它允许我们去除硬编码的依赖关系,并让外部实体(如Spring容器)来负责创建对象的依赖关系并注入到需要它们的对象中。灵活性:在某些动态场景下,可能需要在运行时决定依赖,这时依赖发现提供了灵活性。主动性:与依赖注入的被动接收不同,依赖发现要求组件主动查找依赖。
2024-04-30 14:35:54
479
3
原创 spring 源码包含哪些内容
org.springframework.beans:提供了Bean工厂,如BeanFactory和ApplicationContext,以及Bean的生命周期和类型转换支持。org.springframework.aop.framework:AOP代理实现,如JDK动态代理和CGLIB代理。org.springframework.web.servlet:Spring MVC框架,处理HTTP请求。org.springframework.web.reactive:用于响应式Web应用的WebFlux框架。
2024-04-30 14:29:14
292
1
原创 @EnableDiscoveryClient注解
使用@EnableDiscoveryClient的好处在于,它具有一定的抽象性,可以与多种服务发现实现兼容,比如Eureka、Consul、Zookeeper等。当你在Spring Boot应用的主配置类上使用这个注解时,Spring Cloud会自动配置一个客户端,这个客户端能够与服务注册中心通信,获取服务实例的信息。在这个例子中,MyApplication 类启用了服务发现功能,使得应用能够参与到微服务架构中的服务发现流程中。3、通过服务名而不是硬编码的IP地址和端口来引用其他服务,提高服务间的解耦。
2024-04-30 14:24:54
4147
原创 @EnableScheduling 注解
当在Spring的配置类上使用这个注解时,它会自动注册一个后台任务调度器(TaskScheduler),从而允许该应用根据配置的计划(比如使用@Scheduled注解的方法)执行定时任务。1、启用调度器:通过@EnableScheduling,Spring会自动配置一个调度器,负责管理所有带有@Scheduled注解的方法。2、任务调度:被@Scheduled注解的方法会按照指定的时间规则(如cron表达式、固定延迟、固定速率等)执行。4、时区支持:还可以配置时区以确保任务按照预期的时区时间执行。
2024-04-30 14:22:35
1109
原创 在 mapper 中如何传递多个参数?
对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二 参数,更多参数一致往后加即可。2、第二种: 使用 @param 注解。3、第三种:多个参数封装成 map。1、第一种:在DAO层的函数。
2024-04-30 10:36:04
358
原创 Vue 中清空 el-select 选项的方法
这样,当用户点击“清空”按钮时,el-select的选中项就会被清空。请注意,以上示例是基于Vue.js框架的,如果你的项目环境有所不同,请根据实际情况调整。3、触发清空操作:通过按钮或其他交互元素调用clearSelection方法来清空el-select的选中项。2、定义方法清空绑定的值:在Vue实例的methods中定义一个方法来清空这个绑定的值。1、绑定值:首先确保你的el- <template>
2024-04-29 14:45:29
4306
2
原创 在 Java 中 CycliBarriar 和 CountdownLatch 有什么区别?
CountDownLatch 的一个非常典型的应用场景是:有一个任务想要往下执行,但 必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续 往下执行的任务调用一个 CountDownLatch 对象的 await()方法,其他的任务执 行完自己的任务后调用同一个 CountDownLatch 对象上的 countDown()方法, 这个调用 await()方法的任务将一直阻塞等待,直到这个 CountDownLatch 对象 的计数值减到 0 为止。
2024-04-29 11:29:47
126
原创 idea 安装通义灵码后登录 提示“本地服务启动失败”
第五步:找到填写的路径,单击右键选择属性,找到安全将下面的安全控制勾选上,再点击确定。第四部:把本地存储路径改成其他盘的路径。第七步:重新登录就成功了!第一步:卸载TONGYI。第二步:重启Idea。第六步:重启Idea。
2024-04-29 10:11:48
2241
2
原创 AttributeError: module ‘numpy‘ has no attribute ‘int‘.
第二步执行:python -m pip install numpy==1.22。第一步执行:python -m pip uninstall numpy。
2024-04-20 17:40:46
208
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人