自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hello world

道阻且长 不忘初心

  • 博客(21)
  • 资源 (1)
  • 收藏
  • 关注

原创 多实现类下注入指定的对象

当使用@Autowired的时候,如果注入的对象是一个接口的有多个实现,会报错,找不到对应的bean 。 因为它没法区分是哪个。报错因为MQConsumer有多个实现原因是@Autowired 的注入方式是 byType 注入, 当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的那么在同一类型拥有多个实现类的时候,如何注入呢?这种场景下,只能通过 byName ...

2019-06-25 10:09:21 981

原创 case when将值更新为null,踩的坑

<update id="updateItemImportMonth"> update t_item_import_record set item_unique= <foreach collection="item" item="item" index="index" separator=" " open="case " close="end"> ...

2019-06-24 09:23:40 2942 1

原创 Test的rollback用法

@Test @Transactional @Rollback(value = true) public void TestRollback() { ItemImportRecord record = new ItemImportRecord(); record.setId(298586); record.setGmtCreat...

2019-06-18 10:45:54 7302

原创 BigDecimal不可变对象导致的bug

BigDecimal对象是不可变对象,这里想要实现累加的效果uncheckdMoney.add(xxx);是不可能的,要想实现的话得是uncheckdMoney= uncheckdMoney.add(xxx);所以要千万注意这种不可变对象的赋值情况,也是自己粗心大意 记录一下 引以为戒...

2019-06-14 16:55:31 1595

原创 外观模式(门面模式)

外观模式(facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。其实就是对内部诸多接口进行一个封装,提供一个简单的接口给外部调用。比如说某个系统中,完成一件事要依次调用接口A,接口B,接口C等等,步骤非常繁杂。那么可以定义一个新的接口,将这些步骤都封装到内部。 外部系统直接调这个新的接口就行了。新增一个facade接口,可...

2019-06-12 09:45:04 645

原创 记录一次大表count

某个200万数据的表,进行分页查询的时候进行count统计总条数执行一下 耗时42秒即使 不加其他的连接, 就单纯的统计一下这个表的条数 就要7秒但是业务sql执行却很快,都是同样的连接关系和条件解决方案建个辅助索引专门用来count不要count(1) count一个短小的列 这个列上建个索引能优化到可以接受的范围内。另一个方案就是在第一次统计之后,将总条数返回...

2019-06-11 23:30:19 391

原创 模版方法模式

模版方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以不改变一个算法的结果即可重定义该算法的某些特定步骤。比如说:要输入一个excel文件, 然后需要对该文件内容进行校验,校验完成之后 插入数据库。算法的步骤就是: 校验->落库但是不同的文件,里面的数据不同,比如说订单的线下数据excel, 款项的线下的数据excel 等等,这样的话 校验的逻辑不...

2019-06-11 23:24:12 226

原创 原型模式(深拷贝以及浅拷贝)

原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。通俗的来说,就是对象自身提供clone方法,用于克隆一份对象给其他方使用。好处就是,如果构造函数和初始化过程 非常的复杂的时候,创建对象代价非常大的时候,使用这种模式 可以很方便。一般在初始化信息不发生变化的情况下,克隆是最好的办法隐藏...

2019-06-11 22:56:23 963

原创 工厂方法模式

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。 工厂方法使一个类的实例化延迟到其子类。工厂方法模式是简单工厂模式的进一步抽象和推广,封装了对象的创建过程,使得更换对象时,不需要做大的改动即可实现,降低了客户程序与产品对象的耦合。产品public interface Product { void operator();}工厂public inte...

2019-06-11 09:58:58 188

原创 代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理模式的应用:1.远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。比如说dubbo的服务提供者代理,在消费者去远程调用服务提供者的时候,实际上是调用的提供者在本地的代理,由代理再去访问远程服务。2.虚拟代理,性能优化的一种方式,比如说某个对象的创建需要花很长时间,这样的对...

2019-06-11 08:45:25 176 1

原创 主线程创建子线程,如果子线程不结束,主线程会结束吗?

如果执行到了main end 这里,main方法就结束了,如果此时还有继续打印我是子线程,说明子线程还在继续跑主线程创建子线程,如果子线程不结束,主线程会结束吗?答案是: 子线程不结束,主线程该结束的时候还是会结束,除非主线程是守护线程。a线程创建b线程, 如果a线程不是守护线程,那么实际上a 和b两个线程没有必然联系。...

2019-06-10 23:54:59 5586

原创 sleep和wait的区别

sleep不会释放锁,告诉cpu多少时间内不需要为这个线程分配时间片,wait是会释放锁,进行阻塞队列,等待唤醒,即使唤醒之后,也需要参与竞争锁。sleep是thread的方法,wait和notify是obejct的方法wait和notify 必须在synchronize{ }的范围内使用。wait是非静态方法,sleep是静态方法。还有suspend ,也是不释放锁,但是这个已经不推荐用...

2019-06-10 22:23:43 166

原创 查一次left join没有走索引以及原因

线上有个查询sql,原来是inner join 查询没有问题,后来应业务要求改成left join之后, 查询时间就暴涨了 需要长达24s通过explain分析,发现订单表没有走索引 ,分析之后解决了,记录下来。为了简洁起见,这里就将无关的查询字段都用*具体sql如下SELECT * from t_item_detail a left join t_order_detail d ...

2019-06-10 22:15:06 43367 12

原创 装饰者模式

装饰者模式: 动态的给对象添加一些额外的职责,就增加功能来说,装饰者模式比生成子类更灵活。比如说,在不使用装饰者模式的情况下,我要给人添加装扮。定义一个Person类,一个Wear类, Person类里面定义一个Wear属性,然后Wear类里面定义上衣,裤子,鞋子等属性。但是这样写的话,将来要新增腰带,帽子等衣服的时候,就要去改原来的Wear类,会影响到其他已经被创建了类和对象,违背了开闭原...

2019-06-10 17:45:41 220

原创 单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则

1.单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责太多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。 比如业务操作和日志记录类进行分开,界面和逻辑分开等等。职责分离,单一职责,更有利于维护和拓展。2.开放-封闭原则:类,模块,函数等等,应该可以拓展,但是不可以修改。也就是:对于拓展是开放的,对于更改是封闭...

2019-06-09 20:53:47 612

原创 内存溢出之后线程消亡会释放堆内存吗?

通过之前的验证,已经知道,如果一个线程内部发生了内存溢出,会导致这个线程中断且消亡。比如说:设置最大堆为20M然后开启两个线程,一个线程里面不断的读数据 直到内存溢出。...

2019-06-09 19:23:34 2017

原创 策略模式详解以及在spring中策略模式的两种简化应用

策略模式,同样可以消除掉繁杂的if else ,那么它和简单工厂模式的区别在哪?简单工厂模式是根据传入的参数返回不同的产品,不同的产品内部封装了不同的逻辑。策略模式类似,但是策略模式内部是封装了算法,也就是封装了某一种策略。举个例子,超市活动打折优惠,1.普通计费。 2.满300减20 3.满400减80 4.满500打八折如果用简单工厂模式,那么需要定义四个产品子类,如果将来又新增了...

2019-06-09 19:06:42 7380

原创 简单工厂模式

这种模式可以极大的消除掉if else比如说 我们要设计一个计算器 ,需要支持+ - x 三种运算 ,但是后续要考虑拓展除法运算如果直接常规写法 if('+'){...} if('-'){...} if('x'){...} 每一个类型后面跟一段代码,如果后续有了新的要拓展的,就继续往里面加。等这个计算器功能越来越强大,代码也会堆积的越来越多。使用简单工厂模式,实际上是利用面向对...

2019-06-06 23:36:23 241

原创 两个线程分别打印26个字母的元音(a,e,i,o,u) 和辅音(其他),要求按字母序输出

使用conditionnpublic static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCond...

2019-06-06 16:45:42 1390 4

原创 一个有N个格子组成的直线道路,每次可以前进1格或者2格,一种有多少种方式可以走到终点?

用递归或者递推f(n)=f(n-1) +f(n-2) n>=2当只有1个格子的时候 只有1种方式 f(1)=1当有2个格子的时候 有2种方式 f(2)=2递归条件结束就是 0<=n<=2时候 f(n)=npublic int f(int n){if(n<=2){return n;}else{return f(n-1)+f(n-2);}}这...

2019-06-06 14:40:05 2369

原创 函数式接口和java8以及lambda的关系

函数式接口 ,就是一个接口,只有一个抽象方法比如说package com.inteface;public interface demo<T> { T get();}(接口里面默认方法都是抽象公共的)或者我们常见的runable为什么要这样写? 是为了更好的支持函数式编程,以及lambda表达式的应用。比如说 将runable当成参数的时候,就可以用匿名函...

2019-06-03 10:38:55 467

可以解析大文件的easyexcel版本

1.1.2版本在堆内存400mb的时候解析10mb的excel 堆内存溢出。 但是1.0.1版本支持,因此将1.0.1里面的部分代码和1.1.2版本进行了整合 打了新包. 新增了getbigredear方法,对原有方法不做任何改动

2019-04-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除