Spring Boot开发知识点积累

这里积累工作和学习中遇到的一些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的文件夹。

启动类的位置可以移动吗

参考文献:

posted @ 2022-03-04 22:48  DailyYu  阅读(94)  评论(0编辑  收藏  举报