这里积累工作和学习中遇到的一些Spring boot开发知识点,用于自己查阅,免得时间久了就忘了。(慢慢填坑)
final关键字
final关键词可以修饰类、方法、类的成员变量、局部变量。
- 修饰类:被final修饰类的类不能被继承,不能有子类了。
- 修饰方法:方法不能被重写。
- 修饰类的成员变量:该变量必须被初始化(通过初始赋值或者构造方法里赋值,二者只能选一个),变量初始赋值后就不能修改了。
- 修饰局部变量:可以不初始化,可以后续被赋值,但是第一次赋完值之后就不能修改了。
如图,代码 b=d;
会报错。
枚举的使用
字符串和集合判空
字符串:
使用org.apache.commons.lang3.StringUtils中的StringUtils,maven引入如下依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
StringUitls.isEmpty(str) //str = null str.length()=0 或者 str="" 会被判为空字符串
StringUitls.isBlank(str) //str = null str.length()=0 str="" str=" " 会被判为空字符串
注意两者的区别,正确使用。
集合:
导入这个类就行了 import org.springframework.util.CollectionUtils;
CollectionUtils.isEmpty(集合) //结合为null, 或者集合size() = 0 会被判定为空
InitializingBean接口
ApplicationContextAware接口
PooledObjectFactory
ThreadPoolExecutor
通过ThreadPoolExecutor来创建线程池,先来一个简单的例子:
public class ThreadPoolExcutorExample {
private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, //核心线程池个数
3, //最大线程池个数
3, //线程空闲多久会被释放
TimeUnit.SECONDS, //keepAliveTime的时间单位
new SynchronousQueue<Runnable>(), //任务队列
Executors.defaultThreadFactory(), //线程工厂,用于创建线程,默认的就行
new ThreadPoolExecutor.AbortPolicy()); //当线程太多时的拒绝策略
public void test() {
List<String> datas = new ArrayList<>(Arrays.asList("第一个线程", "第二个线程", "第三个线程","第四个线程"));
for(int i=0; i<datas.size(); i++) {
//threadPoolExecutor.getPoolSize();是当前已经被使用的线程池个数
if(threadPoolExecutor.getPoolSize() < threadPoolExecutor.getMaximumPoolSize()) { //判断一下,避免线程池不够用
String data = datas.get(i);
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println(data);
}
});
}
}
}
}
ThreadPoolExecutor变量的声明地方,可以是方法内部,类的变量(直接初始化,或者使用类的构造函数初始化),或者多个不同的线程池集中放在一个类里(通过依赖注入在使用的地方取用)
ThreadPoolExecutor的构造函数有7个参数,这里详细纪录一下任务队列和拒绝策略。
任务队列:
- SynchronousQueue:不会在任务队列中保持任务,会直接执行创建线程,直到达到maximumPoolSize。
- ArrayBlockingQueue:先创建线程直到达到corePoolSize大小,然后新任务会进入ArrayBlockingQueue队列,当队列长度超过ArrayBlockingQueue的大小,新的任务进来会创建新的线程直到达到maximumPoolSize,再之后就会执行拒绝策略。
- LinkedBlockingQueue:可以无限的添加任务,maximumPoolSize参数就会失效。
- PriorityBlockingQueue:可以设置任务的优先级。
拒绝策略:
- AbortPolicy:直接抛出异常。
- DiscardPolicy:丢弃提交的任务。
- DiscardOldestPolicy:丢弃队列中最早加入的任务。
- CallerRunsPolicy:提交任务的线程自己负责执行这个任务。
提交方法:
execute提交:多线程没有返回值
submit提交:多线程有返回值
CountDownLatch
参考这篇博客:https://www.cnblogs.com/Lee_xy_z/p/10470181.html
Mybatis @options注解
@Insert("xxxxxxx")
@Options(useGeneratedKeys = true, keyProperty = "userId", keyColumn = user_id")
int addInstance(User user);
@Options可以在插入数据时返回数据的主键,keyProperty是接收id的对象的属性名,keyColumn是数据库表的主键名。
Spring Boot PostgreSQL jsonb数据类型处理
参考这里:https://blog.csdn.net/qq_34382367/article/details/88890260
开发中PO DTO VO DO的意义
- PO(Persistent Object)持久层对象:就是和数据库对于的Java对象,有些项目中也叫entity。
- DTO(Data Transfer Object)数据传输对象:前端传过来的数据可以用一个DTO对象来接收。
- VO(View Object)页面对象:给前端的数据,通过一个VO封装到一起返回。
- DO(Domain Object)领域对象: 从现实世界中抽象出来的有形或无形的业务实体。
一个springboot项目多个模块的使用(多模块springboot项目的创建)
参考这个:https://www.cnblogs.com/yangyongjie/p/14291646.html
idea中directory和package
如下两图,在springboot项目中,创建文件夹,有时是directory有时是package。
如图,package目录可以使用点“.”来作为名字,实际在电脑上创建文件夹是aaa文件夹,里面有bbb文件夹,bbb里面有个ccc文件夹,ccc里面才是代码文件。package类型的目录不能用短横线-作为目录名字,因为Java的包路径不能使用短横线-。如果在创建时用短横线则目录会变成directory类型,而不是package类型。
如图,directory目录则只会在电脑上创建名为xxx.yyy.zzz的文件夹。
启动类的位置可以移动吗
参考文献: