一:mybatis 分页插件原理你了解多少
mabatis会先执行PageHelper.startPage方法:方法内容为创建一个包含分页参数的page对象,page对象会存储pagesize,pagenum和order by的消息,
然后放在ThreadLocal本地线程中。
紧接着就会通过mybatis分页插件进行sql的分页查询
其实mybatis分页插件工具实际上就是实现了mybatis框架的Interceptor接口的一个拦截器PageInterceptor;
这个分页过滤器首先会判断你本地线程对象中有没有pagesize和order by 的列;
如果有就会在sql查询的时候拼接上 select count 查询数据数量和数据数量是否大于零,如果数据量大于零就会把数据量set到Page对象中;
但你的代码执行sql时就会从ThreadLocal本地线程中获取page对象,然后在sql查询时就会拼接上pagesize,pagenum和order by的消息;
最终查询出来的list集合会放到Page对象中,然后将Page对象返回给前端.

ThreadLocal中使用了强引用和弱引用(强引用只要不为null就不会被GC回收,弱引用只要GC发现就会被回收),ThreadLocal中有一个ThreadLocalMap内部类
这个内部类有一个Entry内部类 有个Entry属性继承extends WeakReference弱引用
这个ENTRYmap的key(ThreadLocal对象)使用的是弱引用,value使用的是强引用,这个MAP使用的是强引用,
所以当线程结束时需要使用remove()方法回收这个对象,否则长时间积累会造成内存泄露;

=============================================
二:你们项目中登录时验证码是采用的什么方式实现的
我们项目采用的是图片加数学运算实现验证的
首先我们会通过UUID工具类生成一个UUID,然后我们会定义一个字符串拼接UUID作为存入到redis 中作为验证码的key
然后我们通过第三方工具类生成一个数学运算的图片和计算结果作为Code,
然后我们将key +code 存入到redis中并设置过期时间;
然后会将验证码图片和UUID返回给前端.
=============================================
三.你们项目采用预加载了吗,采用了是怎么样实现的,你们对哪些数据进行了预加载
在spring项目中有一个类SpringApplicationRunListener会监听bean的生命周期,bean的生命周期有三个阶段
初始化容器(创建对象,执行构造方法,执行属性注入,执行bean的初始化)到使用bean和关闭容器销毁bean;预加载阶段发生在bean的初始化阶段
我们项目是通过spring的生命周期来实现预加载的,生命周期初始化有两方式第一种是采用@PostConstruct注解,第二种就是通过实现InitializingBean这个接口来实现初始化
我们项目是采用的第一种通过@PostConstruct注解来实现初始化,
在初始化过程种我们加载了数据的编码,字典数据,常量数据登一些数据放到了redis中进行预加载.

注:
1.Springboot 监听机制----生命周期----初始化加载一些数据
2.SpringApplicationRunListener ---完成环境的准备工作
3.ApplicationContextInitializer ---- bean 对象上下文 的创建 =====@PostConstruct
4.CommandLineRunner  --- bean 对象创建后,项目启动完成之前 (参数是string[])多个启动方法可以通过@Order规定启动顺序
4.ApplicationRunner  ----- bean 对象创建后,项目启动完成之前(参数是ApplicationArguments)多个启动方法可以通过@Order规定启动顺序

==============================================
四:你们项目采用的是安全框架
我们项目采用是springSecurity的安全框架,这个框架中有一个名叫AuthenticationManager的类,类中有一个authonticate()方法,单调用这个方法是就会通过springSecurity
的14个拦截器对我们的用户登录进行验证;
我们首先定义了一个用户登录对象名为LoginUser implements UserDetails;
在我们项目中用户登录时我们会通过前端传入的UUID到redis中去查询Code,如果正确我们就会进行authonticate((new UsernamePasswordAuthenticationToken(username, password))方法
我们需要从数据库中去查询用户的数据,这里我们项目重写了SpringSecurity的UserDetailsService 接口中的方法来实现我们从数据库中查询用户数据,当数据库查询验证成功时
我们会在 UserDetailsService 接口的实现类中给LoginUser授权并生成token返回给前端;
在SpringSecurity中有一个过滤器OncePerRequestFilter,我们通过JwtAuthenticationTokenFilter继承在这个过滤器中对用户是否登录进行判断和Token解析如果成功就会对Token进行刷新操作,每次使用时都会延长Token时间.
==================================================
五.线程和线程池区别
进程是操作系统分配资源的基本单位;
线程是操作系统调度的基本单位。
线程有三种创建方式:new thead,implements runnable ,callable  ---在项目中只要创建线程就一直创建,会导致内存泄漏
线程池:七种创建方式
Executors.newFixedThreadPool()             -------创建一个固定大小
Executors.newCachedThreadPool()            -----创建一个可缓存的,大小是接口和服务器能力
Executors.newSingleThreadExecutor()        ----创建单个线程
Executors.newScheduledThreadPool()        -----创建一个可以执行延迟任务的线程池
ThreadPoolExecutor()                     ------手动创建线程池,可自定义7相关参数
自定义线程池的七个参数:
1.核心线程:一旦被创建就不会被销毁
2.最大线程数:核心线程数加零时线程数
3.空闲时间(值)
4.空闲时间(单位):临时线程的销毁时间
5.阻塞列队:
ArrayBlockingQueue    一个由数组结构组成的有界阻塞队列
LinkedBlockingQueue    一个由链表结构组成的有界阻塞队列
SynchronousQueue    一个不存储元素的阻塞队列,即直接提交给线程,不保持它们
PriorityBlockingQueue    一个支持优先级排序的无界阻塞队列
DelayQueue    一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素
LinkedTransferQueue    一个由链表结构组成的无界阻塞队列。与 SynchronousQueue 类似,还含有非阻塞方法
LinkedBlockingDeque    一个由链表结构组成的双向阻塞队列
6.创建线程的方式:
ThreadFactory threadFactory = new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            // 创建线程池中的线程
            Thread thread = new Thread(r);
            // 设置线程名称
            thread.setName("线程-" + r.hashCode());
            // 设置线程优先级
            thread.setPriority(Thread.MAX_PRIORITY);
            // 设置线程类型(守护线程、用户线程), false-用户线程
            thread.setDaemon(false);
            return thread;
        }
    };
7.拒绝策略:
    AbortPolicy:为线程池默认的拒绝策略,该策略直接抛异常处理。
    DiscardPolicy:直接抛弃不处理。
    DiscardOldestPolicy:丢弃队列中最老的任务。
    CallerRunsPolicy:将任务分配给当前执行execute方法线程来处理。

[线程池中线程数小于corePoolSize时,新任务将创建一个新线程执行任务,不论此时线程池中存在空闲线程;
线程池中线程数达到corePoolSize时,新任务将被放入workQueue中,等待线程池中任务调度执行;
当workQueue已满,且maximumPoolSize>corePoolSize时,新任务会创建新线程执行任务;
当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理;
当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收该线程;
如果设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收]

匿名内部类 =====new thread 开启一个异步线程
// 匿名内部类 --它是子线程  结论:子线程跑的永远没有主线程快
=================================================================
六.异步日志
定义一个延迟线程管理类AsyncManager;属性中创建一个异步操作任务调度线程池 ScheduledExecutorService
ScheduledExecutorService .schedule(TimerTask task, 延迟时间值, 延迟时间单位);执行延迟任务
创建一个TimerTask对象重写run()方法
========================================================================
七.静态,@Autowired , @postConstruct 加载时机----?策略模式自动分配
静态 变量 / 静态代码块 > @ Autowired > @postConstruct > 构造方法
通过@ConditionalOnProperty()注解判断这个属性是否在配置文件中注入,如果注入这加载这个Bean类
@ConditionalOnProperty(name = "rule.clue.import", havingValue = "rule")
通过不通的配置实现不同类的配置加载
==========================================================================
八.异步并发线程
通过 CompletableFuture.supplyAsync()方法将需要执行的任务放到方法中进行执行
CompletableFuture<Integer> todayCluesNum = CompletableFuture.supplyAsync(() -> reportMpper.getTodayCluesNum(today, username)
);
CompletableFuture<Integer> todayBusinessNum = CompletableFuture.supplyAsync(() -> reportMpper.getTodayBusinessNum(today, username)
);
CompletableFuture.allOf(
        todayCluesNum,
        todayBusinessNum
).join();
todayCluesNum.get()
todayBusinessNum.get()
===================================================================
九.项目层次 实体类 封装
展示到页面的采用VO
业务逻辑层使用DTO
数据访问层和业务员逻辑层之间使用BO
数据访问层使用POJO/DAO
=============================================
十. 使用aop 自定义注解的方式进行日志记录
自定义了一个@Log注解,然后通过AOP思想,定义这个添加了@log的方法为切入点,通过@AfterReturning,@AfterThrowing对业务的两结果都进行日志插入

@Pointcut("@annotation(com.huike.common.annotation.Log)") 自定义注解作为切点
@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult") 在方法执行之后执行日志插入操作
@AfterThrowing(value = "logPointCut()", throwing = "e")   当执行任务发生异常时,进行异常插入操作
@Log(title = "修改已读", businessType = BusinessType.UPDATE)

CRM项目问题使用总结相关推荐

  1. 企业CRM项目实施调研内容有那些?

    对企业来说,CRM项目的实施一个繁杂的工程,其中有太多的不可控的风险,因此为了降低其风险,最大化的然CRM项目实施取得成功做好CRM实施挑檐就显得非常中要了! 对于CRM系统来说,其实是的目的是为了实 ...

  2. tomcat启动成功 未加载项目_智云CRM项目启动大会在深圳成功召开

    自2018年12月29日与桂林智神信息技术有限公司正式签署CRM项目合同之后,鼎资软件便迅速成立智云CRM项目组,开始了紧张的实施前准备工作,包括项目组成员甄选.确定项目目标和实施范围,制定项目实施计 ...

  3. CRM项目第一天(2021-12-16)1

    CRM项目第一天(2021-12-16)1 1.CRM项目介绍: 从0到1的项目开发. 涉及到的技术点: 1.前后端交互. 2.UI 3.jQuery 4.Ajax 5.Spring 6.Spring ...

  4. CRM 项目实战-笔记

    CRM项目: 编程思想和编程习惯 web项目的开发:如何分析.设计.编码.测试 技术架构 视图层(View) 展示数据,跟用户交互 html,css,js,jquery,bootstrap(ext|e ...

  5. CRM项目(idea)-1-环境搭建.

    搭建CRM项目的开发环境: 1 设置字体 * 设置工作区的字符集为utf-8* 这个是针对本次工程设置. 以后项目中可以点击other setting 2 创建Maven项目前的准备工作 使用sett ...

  6. 悟空CRM项目测试实战(4)

    今天是进入悟空CRM项目系统测试的第四天,在进过将近三天的测试用例的编写后,测试用例编写的工作可以是暂时告一段落了,在这三天的编写测试用例的过程中给我最大的直观感受就是枯燥,没完没了的对着电脑点点点, ...

  7. 第一章:第1章 CRM核心业务介绍--概述,crm架构,公司组织结构,软件开发的生命周期,crm项目的核心业务介绍。...

    第一章:第1章 CRM核心业务介绍 1. 什么是crm项目: 1,CRM(Customer Relationship Management)客户关系管理是管理企业与客户之间关系的新型管理机制.终极目标 ...

  8. CRM项目实战第一天

    总纲: 1.项目分析 2.项目设计 3.编码 4.测试 CRM项目(客户管理系统项目) 项目采用的技术架构: 视图层(view):展示数据,与用户交互.html.css.js.jquery.boots ...

  9. 视频教程-SpringBoot后台CRM项目(第一季)-Java

    SpringBoot后台CRM项目(第一季) 2011年毕业后在澳门 遊澳集团(UO Group)旗下某IT科技公司从事 android,php,j2ee开发工作,负责 国际短信发送系统.银联支付业务 ...

  10. crm项目大纲,SSM回顾

    大家好,简单聊一聊由ssm框架搭建的一个普通的web项目 CRM项目的核心业务:   1)CRM项目的简介:Customer Relationship Management 客户关系管理系统     ...

最新文章

  1. 65个免费和高质量的纹理包
  2. Robotframework SSHLibrary库关键字
  3. [爬虫学习笔记]C# 使用 ScrapySharp 并行下载天涯图片
  4. 年均增长超200%的网易云信,如何向PaaS行业领跑者再进一步?
  5. 并发执行变成串行_网易Java研发面试官眼中的Java并发——安全性、活跃性、性能...
  6. java mapfile_基于文件的数据结构:关于MapFile
  7. python人脸识别系统下载_简单的Python人脸识别系统
  8. paraview使用GUI连接服务器
  9. 风险预测模型_利用好预后预测模型,2个月发篇4分+SCI不是梦
  10. 计算机课制作海报教案,信息技术作品制作教案
  11. html5文字游戏引擎,HTML5游戏实战(3): 60行代码实现水平跑酷游戏
  12. python一只青蛙一次可以_Python面试题系列之11 变态青蛙跳
  13. 数字化转型企业人才画像
  14. Docker一些使用问题的解决方法
  15. STM32开发基础知识——OLED开发基础
  16. TextView自动调节字体大小
  17. 简单发送QQ邮件教程
  18. PXE+KickStart自动化安装Linux系统
  19. 用Chrome浏览器调试钉钉应用--Web页面调试
  20. Ubuntu18 USB网卡驱动安装踩坑记录

热门文章

  1. 使用vuetify2.0的正确姿势
  2. IDEA 运行 Maven 项目
  3. Nginx应用环境 三
  4. python字典查询_python字典用法
  5. svg标签和svg文件区别_什么是SVG文件? SVG图片和标签说明
  6. 铜回收技术,铜回收树脂,铜的深度去除工艺
  7. 504 Gateway Time-out原因及解决方法
  8. 10款最优秀的开源移动开发工具
  9. 方之熙:开启智能、互联嵌入式计算未来
  10. c语言编辑87152,POJ 3287 (基础BFS) Catch That Cow