- 博客(35)
- 资源 (3)
- 收藏
- 关注
原创 Mybatis源码分析(三) - Mybatis配置(mybatis-config.xml)
mybatis-config.xml 配置序号 属性名 说明 备注 1 properties 定义配置,配置的属性可以在整个配置文件中其他位置进行引用 重要,优先使用property配置文件解耦 2 settings 设置,用于指定MyBatis的一些全局配置属性,这些属性非常重要, 它们会改变MyBatis的运行时行为 ...
2019-05-23 10:55:33 242
原创 Mybatis源码分析(二) - Mybatis快速入门
1. 加入mybatis的依赖<dependencies> <!-- 单元测试相关依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</v...
2019-05-22 18:36:12 182
原创 Mybatis源码分析(一) - mybatis基本概述
为什么需要ORM框架?先来看一段JDBC的代码!static final String DB_URL = "jdbc:mysql://localhost:3308/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true"; // Database credentials static...
2019-05-22 18:15:09 144
转载 char和VARCHAR主要的区别是什么?
首先明确的是,char的长度是不可变的,而varchar的长度是可变的, 定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的, char的存取数度还是...
2019-05-22 17:14:39 197
原创 Spring源码分析(十) - 注解@Autowired @Resource @Qualifier @Primary @Inject自动装配
注解@Autowired自动装配自动装配:spring利用依赖注入(DI), 完成对IOC容器中的各个组件的依赖关系赋值1,新建TestController.java TestService.java TestDao; 分别建在指定的包内,可看步骤2.这些所有JAVA 类的对象扫描后都是保存在IOC容器中管理的; 2,新建配置类Cap9MainConfig.jav...
2019-05-19 22:55:32 301
转载 Spring源码分析(九) - 注解@Value赋值
注解@Value赋值的作用是给IOC容器中的bean赋值用的。1, 新建Bird.java类2,新建Cap8MainConfig.java配置类3,新建测试用例Cap8Test.java, 从容器获取bean并打印打印结果如下: 主要是没设值4,以前使用bean.xml配置文件进行赋值5,使用@Value赋值如何赋值呢?见下6,从配置文件[pro...
2019-05-19 22:45:21 1302 5
原创 Spring源码分析(八) - Spring底层对BeanPostProcessor的使用
Spring底层对BeanPostProcessor的使用1,ApplicationContextAwareProcessor实现分析:此类帮我们组建IOC容器,跟进ApplicationContextAwareProcessor我们发现, 这个后置处理器其实就是判断我们的bean有没有实现ApplicationContextAware接口,并处理相应的逻辑,其实所有的后置处理器原...
2019-05-19 22:35:13 700
原创 Spring源码分析(七) - bean的生命周期
bean的生命周期:指 bean创建-----初始化----销毁 的过程bean的生命周期是由容器进行管理的我们可以自定义 bean初始化和销毁 方法: 容器在bean进行到当前生命周期的时候, 来调用自定义的初始化和销毁方法如何定义和销毁(4种方式):1)指定初始化和销毁方法 <之前在beanx.xml, 可以指定init-method和destory-mot...
2019-05-19 22:25:06 383
原创 Spring源码分析(六)-注解Import注册bean
一般来说,向容器中注册组件有下面几种方式1.包扫描和组件标注注解(@Controller @Service @Repository @Component),一般针对我们自己写的类2.@Bean【导入第三方和包的组件,比如前面的person类,需要在IOC容器中使用】3.使用@Import【快速给容器导入一个组件】注:bean有点简单,构造一个无参或有参的bean a,@Imp...
2019-05-19 22:07:07 333
原创 Spring源码分析(五)-注解@Conditional条件注册bean
Conditional条件注册bean假设有这么一个场景,需要根据操作系统加载不同的实例将IOC容器注册bean时, 当操作系统为WINDOWS时,注册caojiulu实例; 当操作系统为LINUX时, 注册hujinxiao实例,此时要用得@Conditional注解进行定制化条件选择注册bean新建Cap5MainConfig.javapackage com.caojiulu...
2019-05-14 16:22:31 163
原创 Spring源码分析(四)-注解lazy懒加载
lazy 懒加载,主要针对单实例bean,容器启动时候不创建对象,仅当第一次使用的bean才创建新建Cap4MainConfig.javapackage com.caojiulu.cap4;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation....
2019-05-14 16:00:06 767 1
原创 Spring源码分析(三)-注解scope
scope用来表示bean在ioc容器中的作用范围新建Cap3MainConfig.javapackage com.caojiulu.cap3.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;i...
2019-05-14 15:47:19 283
原创 Spring源码分析(二)-注解ComponentScan
ComponentScan的作用:指定要扫描的包直接用代码说话吧!操作:新建cap2文件夹,新建Cap2MainConfig.java配置类1,@ComponentScan(value="com.caojiulu.cap2")表示扫描此目录下的包测试:新建Cap2MainConfig2配置类新建dao, service,controller在Cap2MainCo...
2019-05-14 15:16:09 146
原创 Spring源码分析(一)-spring的基本认识以及xml 注解基本使用
Spring是什么?Spring是一种开源轻量级框架,是为了解决企业应用程序开发复杂性而创建的,Spring致力于解决JavaEE的各层解决方案,而不仅仅于某一层的方案。Spring发展历程2003年2月Spring框架正式称为一道开源项目,Spring致力于J2EE应用的各种解决方案,而不仅仅专注于某一层解决方案。可以说Spring是企业应用开发的“一站式”选择, Spring贯穿于...
2019-05-14 15:08:01 196
原创 springboot集成druid(数据库密码加密)
首先我们来看下 druid加密的过程通过命令:找到druid-1.1.13.jar所在的目录 java -cp druid-1.1.13.jar com.alibaba.druid.filter.config.ConfigTools 你的password解密:package com.bamboocloud.framework.config;impo...
2019-05-10 21:05:23 2364
原创 java并发编程(二十四)-并发安全之活锁,线程饥饿
什么是活锁?多线程环境下,线程在尝试拿锁的机制中,发生多个线程之间互相谦让,不断发生拿锁,释放锁的过程。模拟银行转账的业务:实体类:package com.caojiulu;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** *@autho...
2019-05-09 17:32:26 151
原创 java并发编程(二十三)-并发安全之死锁
死锁资源一定是多于1个,同时小于等于竞争的线程数,资源只有一个,只会产生激烈的竞争。死锁的根本成因:获取锁的顺序不一致导致。死锁的一般情况:package com.caojiulu;import com.caojiulu.SleepTools;/** *@author caojiulu * *类说明:演示普通的死锁和解决 */public class No...
2019-05-09 17:07:15 124
原创 java并发编程(二十二)-并发安全的基本概念
类的线程安全定义如果多线程下使用这个类,不过多线程如何使用和调度这个类,这个类总是表示出正确的行为,这个类就是线程安全的。类的线程安全表现为:操作的原子性 内存的可见性不做正确的同步,在多个线程之间共享状态的时候,就会出现线程不安全。怎么才能做到类的线程安全?栈封闭所有的变量都是在方法内部声明的,这些变量都处于栈封闭状态。无状态没有任何成员变量的类,就叫无状...
2019-05-06 10:44:21 121
原创 java并发编程(二十一)-线程池CompletionService的使用(获取线程处理结果)
在我们日常使用线程池的时候,经常会有需要获得线程处理结果的时候。此时我们通常有两种做法。《Java并发编程实践》一书6.3.5节CompletionService:Executor和BlockingQueue,有这样一段话:"如果向Executor提交了一组计算任务,并且希望在计算完成后获得结果,那么可以保留与每个任务关联的Future,然后反复使用get方法,同时将参数timeout...
2019-05-05 19:00:46 468
转载 java并发编程(二十)-Executor框架
1.Executor框架主要由3大部分组成: 任务。包括被执行任务需要实现的接口:Runnable接口或者Callable接口 任务的执行。包括执行机制的核心接口Executor,以及继承Executor的ExecutorService接口。Executor框架有两个关键类,ThreadPoolExe...
2019-05-05 18:33:08 97
原创 java并发编程(十九)- 线程池(ScheduledThreadPoolExecutor )详细使用
多线程环境下需要定期执行周期任务,Timer不建议使用了。newSingleThreadScheduledExecutor:只包含一个线程,只需要单个线程执行周期任务,保证顺序的执行各个任务newScheduledThreadPool可以包含多个线程的,线程执行周期任务,适度控制后台线程数量的时候方法说明:schedule:只执行一次,任务还可以延时执行scheduleAtF...
2019-05-05 18:25:40 825
原创 java并发编程(十九)- 线程池(ThreadPoolExecutor)详细使用
线程池的创建ThreadPoolExecutor,jdk所有线程池实现的父类各个参数含义intcorePoolSize:线程池中核心线程数,<corePoolSize,就会创建新线程,=corePoolSize,这个任务就会保存到BlockingQueue,如果调用prestartAllCoreThreads()方法就会一次性的启动corePoolSize个...
2019-05-05 18:19:34 238
原创 java并发编程(十八)-通过阻塞队列实现一个自己的线程池
什么是线程池?为什么要用线程池?降低资源的消耗。降低线程创建和销毁的资源消耗; 提高响应速度:线程的创建时间为T1,执行时间T2,销毁时间T3,免去T1和T3的时间 提高线程的可管理性。实现一个我们自己的线程池线程必须在池子已经创建好了,并且可以保持住,要有容器保存多个线程; 2、线程还要能够接受外部的任务,运行这个任务。容器保持这个来不及运行的任务.pac...
2019-05-04 16:59:07 146
原创 Springboot使用详解
快速开始spring boot应用官方向导搭建boot应用地址:http://start.spring.io, 选择对应的版本 创建 maven项目解压,拷贝到工作空间,导入maven项目 注意...
2019-05-04 15:43:59 124
原创 Git 常用命令笔记
1. 将branch1分支上的部分改动合并到master分支上如上操作要首先切换到master分支:git checkeout master然后执行合并命令:git checkout --path branch1 file
2019-05-04 15:43:32 58
原创 java并发编程(十七)-阻塞队列(生产者与消费者模式)
概念、生产者消费者模式1)当队列满的时候,插入元素的线程被阻塞,直达队列不满。2)队列为空的时候,获取元素的线程被阻塞,直到队列不空。生产者和消费者模式生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待...
2019-05-04 15:28:54 261
原创 java并发编程(十六)-并发容器后续(ConcurrentSkipListMap ConcurrentSkipListSet ConcurrentLinkedQueue 写时复制容器)
ConcurrentSkipListMap 和 ConcurrentSkipListSetTreeMap和TreeSet有序的容器,这两种容器的并发版本ConcurrentSkipListSet是线程安全的有序的集合,适用于高并发的场景。ConcurrentSkipListSet和TreeSet,它们虽然都是有序的集合。但是,第一,它们的线程安全机制不同,TreeSet是非线程安...
2019-05-03 21:48:46 285
原创 java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.8中原理和实现)
与1.7相比的重大变化取消了segment数组,直接用table保存数据,锁的粒度更小,减少并发冲突的概率。 存储数据时采用了链表+红黑树的形式,纯链表的形式时间复杂度为O(n),红黑树则为O(logn),性能提升很大。什么时候链表转红黑树?当key值相等的元素形成的链表中元素个数超过8个的时候。主要数据结构和关键变量Node类存放实际的key和value值。sizeCtl:负...
2019-05-03 21:02:10 209
原创 java并发编程(十六)-并发容器之ConcurrentHashMap (JDK1.7中原理和实现)
ConcurrentHashMap中的数据结构ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment实际继承自可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,每个Segment里包含一个Ha...
2019-05-03 12:04:56 468
原创 java程序员必备的并发编程基础知识( hash以及位运算)
Hash散列,哈希:把任意长度的输入通过一种算法(散列),变换成为固定长度的输出,这个输出值就是散列值。属于压缩映射,容易产生哈希冲突。Hash算法有直接取余法等。产生哈希冲突时解决办法:开放寻址;2、再散列;3、链地址法(相同hash值的元素用链表串起来)。ConcurrentHashMap在发生hash冲突时采用了链地址法。md4,md5,sha-hash算法也属于hash算法...
2019-05-02 22:38:51 227
原创 利用位运算做权限控制
位运算应用范围十分广泛,下面这个例子就是用来做权限控制类似于linux的文件系统里面的chmod 777 节约内存空间,一个数据机构就能表示多种权限直接上代码吧:package com.caojiulu;/** *@author caojiulu * *类说明: */public class Permission { // 是否允许查询,二进制第1位...
2019-05-02 22:38:32 388
转载 java并发编程(十五)-LockSupport工具类
LockSupport是Java6引入的一个工具类,它简单灵活,应用广泛。一、简单俗话说,没有比较就没有伤害。这里咱们还是通过对比来介绍LockSupport的简单。在没有LockSupport之前,线程的挂起和唤醒咱们都是通过Object的wait和notify/notifyAll方法实现。写一段例子代码,线程A执行一段业务逻辑后调用wait阻塞住自己。主线程调用notify方...
2019-05-02 18:30:41 117
原创 java并发编程(十四)- 显示锁
使用显示锁的基本范式package com.caojiulu;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * @author caojiulu * *使用显示锁的范式 */public class LockDemo { priva...
2019-05-02 18:02:38 123
原创 java并发编程(十三)- 显示锁使用Lock和Condition实现等待通知模式
通常在开发并发程序的时候,会碰到需要停止正在执行业务A,来执行另一个业务B,当业务B执行完成后业务A继续执行。ReentrantLock通过Condtion等待/唤醒这样的机制.相比较synchronize的wait()和notify()/notifAll()的机制而言,Condition具有更高的灵活性,这个很关键。Conditon可以实现多路通知和选择性通知。当使用notify()/n...
2019-05-02 17:57:43 247
原创 关于java的模板方法设计模式
一般来说,定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。直接上代码吧,一看就很清晰。...
2019-05-02 17:42:27 118
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人