- 博客(60)
- 收藏
- 关注
原创 Spring Aop 动态获取参数值替换注解值
Service@MyAnnotation(key = "'param id is ' + #id")//添加自定义aop注解 #id为el表达式,需要和被替换的参数名称相同System.out.println("方法执行中");//切面类必须由容器管理@Component//定义为切面类@Aspect//定义切入点//获取方法签名//获取切入方法的对象//获取方法上的Aop注解。
2023-03-24 11:05:11
939
原创 多数据源切换方案
方案2 :基础的配置方案:https://blog.youkuaiyun.com/xue_xiaofei/article/details/109779714?方案1:需要注意的坑,关于多数据源事务回滚的:https://baijiahao.baidu.com/s?方案3:参考:https://www.cnblogs.com/daikainan/p/14431534.html。
2023-03-22 15:35:49
268
原创 通过ssh下载项目
1.查看是否有ssh keyls -al ~/.sshdrwxr-xr-x 1 zhangzhiwen 197121 0 9月 18 15:11 ./drwxr-xr-x 1 zhangzhiwen 197121 0 11月 20 22:59 ../-rw-r--r-- 1 zhangzhiwen 197121 1823 2月 26 2019 id_rsa-rw-r--r-- 1 zhangzhiwen 197121 401 2月 26 2019 id_rsa.pub-r
2022-02-25 14:52:16
764
原创 DDD(领域驱动设计)
1. 设计思想复用(复用通过封装变化点实现)封装变化点(个人理解,将一些业务逻辑抽离出来,又封装了一层,这样子只要整体大的业务逻辑不变,代码不变。利于快速迭代)2. 名词解释贫血模型:就是pojo,只有get和set方法,里面只有属性充血模型:学生pojo除了get,set,还有selectClass()选课等其他功能领:商品领域,用户领域,原则上一个域不要被另一个域的变化所影响(一块相对独立的业务空间)领域服务:但是商品和用户肯定有业务逻辑交流(用户购物等业务逻辑),就用领域服务来支持
2022-02-25 14:47:56
529
原创 配置:跨域配置
@Slf4j@Configurationpublic class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { //log.info(this.allowedOrigin); //1.添加CORS配置信息 CorsConfiguration config = new CorsConfiguration(); //1) 允许的域,不要写*,否则cookie就
2021-12-28 21:51:58
700
原创 Swagger配置
1.在pom.xml添加依赖<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency><!-- 导入swag
2021-12-22 17:25:06
184
原创 面试篇:nginx做负载均衡
配置反向服务代理器:什么是反向服务呢? 首先说下正向服务, 例如爬虫程序, 我们主动出击去获取资源. 而反向服务我们是等待用户来访问. 区别在于主动和被动.配置文件Nginx/conf/nginx.conf配置Nginx转发条件重启好Nginx后, 我们再来访问192.168.200.129 这台机器, 我么可以发现其实访问的是129.168.200.130这台机器.负债均衡的配置, 配置转发的权重: (另一台CentOS02 依然按照CentOS01的配置)我们在这里配置了两台转发机.
2021-08-27 09:33:19
370
原创 获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求)
详情
2021-08-26 14:37:09
3436
5
原创 MySql:锁
1. 意向锁(Intention Locks)InnoDB支持多粒度锁(multiple granularity locking),它允许行级锁与表级锁共存,实际应用中,InnoDB使用的是意向锁。意向锁是指: 未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向。意向锁有这样一些特点:(1)首先,意向锁,是一个表级别的锁(table-level locking);(2)意向锁分为:意向共享锁(intention shared lock, IS),它预示着,事务有意向对表中的某些行.
2021-08-24 15:55:31
177
原创 面试篇:Spring的@Autowired 与@Resource
@Autowired按byType自动注入,@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。@Autowired@Aut.
2021-08-24 14:08:36
144
原创 MySql篇:性能
1. 大表数据查询,怎么优化优化shema、sql语句+索引;第二加缓存,memcached, redis;主从复制,读写分离;垂直拆分,根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key, 为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;2. 超大分页怎么处理?数据库层
2021-08-23 16:20:11
164
原创 代码技巧:Pattern.compile函数提取字符串中指定的字符(正则使用)
最近有个需求是要提取一段字符串中特定范围内的内容,查找资料后,使用的是Java中的Pattern.compile函数来实现对指定字符串的截取。记录下来查找的知识和应用,方便以后的查看。Pattern.compile函数语法// Pattern.compile函数语法Pattern Pattern.compile(String regex, int flag)知识学习Pattern.compile函数中两个参数regex 表示定义的规则flag 表示设置的参数类型,主要包含以下几种情况:(
2021-08-18 10:45:04
5898
原创 @JsonFormat与@DateTimeFormat注解的使用
1.注解@JsonFormat <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.8</version> </dependency>
2021-08-16 17:07:12
379
原创 项目:mongoDB时区晚8小时
1. 产生原因MongoDB默认的是UTC时间(协调世界时间),刚好比当前区时晚了8个小时;在mongoDB数据库中,时间的保存是ISODate类型,orm关系映射为java.util.Date类型,其保存的时间与我们会有8小时的区别(保存的时间比我们早了8个小时)查询语句按我们的相差时间查询,返回的数据确实是我们需要的,即使数据库中我们看到的iso date相差8个小时。其实java 驱动帮我们做了转换。2. 解决方法@JsonFormat(pattern = "yyyy-MM-dd", t
2021-08-16 17:01:18
1864
原创 算法篇:全排列
class Solution { List<List<Integer>> res=new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { List<Integer> arr=new ArrayList<Integer>(); back(nums,arr); return res;
2021-08-13 16:06:08
90
原创 算法篇:二叉树的前中后续迭代
中序遍历public List<Integer> inorderTraversal(TreeNode root) { List<Integer> res=new ArrayList<>(); Stack<TreeNode> stack=new Stack<>(); TreeNode node=root; while(!stack.isEmpty()||node!=null){ while(node!=null
2021-08-12 14:59:07
110
原创 面试篇:redis为什么单线程
1. 为什么需要多线程首先,现在的CPU一般都是由多个核心组成,每个核心可以认为是一个独立的处理器,它们能够并行地处理任务。所以,如果我们的CPU是多核的,但是程序是单线程的,那么执行程序时,这个线程在某一个时刻只能在一个核心上运行,而其它的核心却是空闲的(如果没有其他程序的话)。所以,为了提高CPU的使用率,我们可以创建多个线程,每个线程处理任务的一部分(每个部分互不依赖),而每个核心执行一个线程,此时CPU的使用率将提高,程序的运行速度自然也就加快了。除此之外,假设我们的程序有A、B、C三个
2021-08-09 16:56:45
1194
原创 面试篇:String
底层原理分析在上篇文章《面试题系列第1篇:说说==和equals的区别?你的回答可能是错误的》中我们已经提到,String的两种初始化形式是有本质区别的。String str1 = "abc"; // 在常量池中 String str2 = new String("abc"); // 在堆上当直接赋值时,字符串“abc”会被存储在常量池中,只有1份,此时的赋值操作等于是创建0个或1个对象。如果常量池中已经存在了“abc”,那么不会再创建对象,直接将引用赋值给str1;如果常量池中没有“abc”
2021-08-05 10:51:34
90
原创 MySql篇:sql技巧
1. SQL的执行顺序from ->on -> join -> where ->group by -> select -> having ->order by -> distinct ->limit on: 笛卡儿积前的筛选join:表链接,遵循的算法是笛卡儿积where:形成临时表group by:临时表切分成若干临时表select:(1)当没有GROUP BY时,SELECT 会根据后面的字段名称对内存中的一张临时表整列读取。(2
2021-08-05 10:22:25
156
原创 mongodb查询非空数组的几种方法
一、$elemMatch和$nedb.Collection.find({array:{$elemMatch:{$ne:null}}})二、$wheredb.Collection.find({$where:"this.array.length>0"})三、$not和$sizedb.Collection.find({array: {$not: {$size: 0}}})四、'.'路径和$existsdb.Collection.find({{'array.0': {$exists
2021-08-03 09:57:11
1101
原创 线程间通讯
核心观点:CountdownLatch阻塞主线程,等所有子线程完结了再继续下去。Syslicbarrier阻塞一组线程,直至某个状态之后再全部同时执行,并且所有线程都被释放后,还能通过reset来重用。CountDownLatchCyclicBarrier减计数方式加计数方式计算为0时释放所有等待的线程计数达到指定值时释放所有等待线程计算为 0 时,无法重置计数达到指定值时,计数置为0重新开始调用 countDown() 方法计数减一,调用 await(
2021-07-29 23:26:37
110
原创 实战篇-ThreadLocal
ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。ThreadLocal实现原理其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap 的静态内部类。.
2021-07-29 16:06:12
281
原创 源码篇-AQS
AQS 总结AQS 在内部为此了一个变量 state,用于记录锁状态,线程通过 CAS 修改 state即是加锁解锁过程。AQS 内存维护了一条双向链表,即同步队列,等待锁的线程被封装为 Node 节点连成链表,通过 LockSuppor 工具类的 park()和 unpark()方法切换等待状态。AQS 提供了独占和非独占两种锁实现方式,分别提供了 acquire()/release()和acquireShared()/releaseShared()两套加锁解锁方式; 同时,基于 sta
2021-07-29 11:05:53
107
原创 java基础篇-序列化
1. 为什么要有序列化在分布式环境下,无论是何种数据,都会以二进制序列的形式在网络上传输。序列化是一种将对象以一连串的字节描述的过程,2. 序列化概念序列化可以将对象的状态写在流里进行网络传输,或保存在文件、数据库里,并在需要时把该流读取出来重新构造一个相同的对象。(Java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象序列化是对象持久化的一种实现方法)3. 反序列化通俗的讲,就是将流转为对象。4. 为什么需要自定义序列号这个序列化ID起着关键的作用
2021-07-29 10:50:18
166
原创 @responseBody+response.getOutputStream()+response.getWriter()
1. @responseBody注解@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML(在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中)在springmvc中当返回值是String时,如果不加@ResponseBody的话,返回的字符串就会找这个String对应的页面,如果找不到会报404错误。如果加上@ResponseBody注解的话,返回的就
2021-07-28 18:16:33
2833
原创 面试篇-Spring的bean的生命周期
Spring对Bean进行实例化(相当于程序中的new Xx())Spring将值和Bean的引用注入进Bean对应的属性中如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并..
2021-07-25 15:53:41
198
原创 技术篇-接收前端参数
一: 获取参数SpringBoot提供的获取参数注解包括:@PathVariable,@RequestParam,@RequestBody,三者的区别如下表:二:后端接口加@RequestParamPOST请求@RequestParam:① 用来处理(前端)Content-Type: 为 application/x-www-form-urlencoded或者form-data编码的内容② 该注解有两个属性: value、required; value用来指定要传入值的id名称,required
2021-07-20 14:41:22
1582
原创 技术篇-分页查询
1. boot的分页查询使用PageHelper的starter在pom.xml中引入依赖<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version></dependency&
2021-07-19 16:23:01
142
原创 提取字符串中的数字并加一
public static String custIdIncr(String custID){ String abc = custID.replaceAll("[^(a-zA-Z)]", "");//取出字母 String num = custID.replaceAll("[^(0-9)]", "");//取出数字 int length = num.length(); StringBuffer lengthNum = new StringBuf
2021-07-12 12:43:57
552
原创 mysql篇-事务的隔离级别
什么是事务的隔离性?两个人同时在一个画本上画画,过程中你一笔我一笔,那么最后最后画出来的一定是一个四不像,多个事务同时操作一个数据也会和上面的情况类似,所以为了让不同的事务之间相互不存在干扰,就需要对事务的操作进行隔离,事务的隔离性也就是将操作同一个数据的事务相互分离,让操作之间分开有序的执行。如果不对事务进行隔离会有哪些问题?. 在数据库中,如果多个事务可以同时操作一个数据,那么就会产生脏读、重复读、幻读的问题。脏读出现原因:一个事务在对一条数据进行修改的过程中,其它的事务可以对数据进
2021-07-12 09:46:23
153
原创 面试篇SQL-分页查询之延迟关联
优化前:select * from t_trade_orderwhere create_time between '2019-10-17' and '2019-10-25'limit 1000000, 10;(create_time建表时被设置为普通索引)在create_time索引树上找到create_time=‘2019-10-17’的记录,取得其id。再到主索引树查到对于id的记录如数量小于10,更新时间,循环步骤1、2在create_time索引树取下一个值cre.
2021-07-08 17:00:26
536
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人