2023年6月20日发(作者:)
java后端程序员1年⼯作经验总结 java后端1年经验和技术总结(1)1.引⾔ 毕业已经⼀年有余,这⼀年⾥特别感谢技术管理⼈员的器重,以及同事的帮忙,学到了不少东西。这⼀年⾥⾛过⼀些弯路,也碰到⼀些难题,也受到过做为⼀名开发却经常为系统维护和发布当救⽕队员的苦恼。遂决定梳理⼀下⾃⼰所学的东西,为⼤家分享⼀下。 经过⼀年意识到以前也有很多认识误区,⽐如: 偏爱收集,经常收集各种资料视频塞满⼀个个硬盘,然后⼼满意⾜的看着容量不⾏动。 不重基础,总觉得很多基础东西不需要再看了,其实不懂的地⽅很多,计算机程序⽅⾯任何⼀个结果都必有原因,不要只会⽤不知道原理,那是加⼯⼚出来的。现在ide查看代码那么⽅便,ctrl+点击就进⼊了JDK查看实现细节。 好⾼骛远,在计算机基础不牢固的情况下,总想着要做架构,弄分布式,搞⼤数据之类。 不重视性能,只求能实现功能,sql查询是不是可以优化,是否有算法妙⽤,⼤对象是否要清除。 不重视扩展性,模块之间紧密耦合,常⽤⽅法不提取成⼯具类,调⽤关系混乱等问题。 …… 本⽂重点不在这些,故只列举了⼀⼩部分,下⾯进⼊正题。2.语法基础 2.1 Java类初始化顺序 这是所有情况的类初始化顺序,如果实际类中没有定义则跳过:⽗类静态变量——⽗类静态代码块——⼦类静态代码块——⽗类⾮静态变量——⽗类⾮静态代码块——⽗类构造函数——⼦类⾮静态变量——⼦类⾮静态代码块——⼦类构造函数 2.2 值传递和引⽤传递 可能很多⼈对此不屑⼀顾,⼼想⽼⼦都⼯作⼀年了,对这些还不熟悉吗?但实际情况并⾮这样,JDK中东西全部熟悉了吗?以⼀个最简单的例⼦开始,你觉得下图中代码执⾏完之后fatherList中的元素是什么? 这是⼀个最基础的值传递和引⽤传递的例⼦,你觉得好简单,已经想跃跃欲试的挑战了,那么请看下⾯的,StringBuffer很好理解,但是当你执⾏⼀遍之后发现是不是和预想中的输出不⼀样呢?String不是引⽤类型吗,怎么会这样呢?如果你⽆法理解,那么请看下String的实现源码,了解下其在内存中分配的实现原理。 2.3 集合的使⽤ 这部分⼏乎每个⼈都会⽤到,⽽且⼤家还都不陌⽣。下图来源于互联⽹,供⼤家复习⼀下。但是利⽤集合的特性进⾏巧妙的组合运⽤能解决优化很多复杂问题。Set不可重复性,List的顺序性,Map的键值对,SortSet/SortMap的有序性,我在⼯作中有很多复杂的业务都巧妙的使⽤了这些,涉及到公司保密信息,我就不贴出代码了。⼯作越久越发现这些和越巧妙。 2.3 异常处理 1.看着try、catch、finally⾮常容易,如果和事务传播结合在⼀起,就会变得极其复杂。 y不⼀定必须执⾏,return在catch/finally中处理情况(建议亲⾃操⼑试⼀下)。 中可以继续抛⾃定义异常(并把异常⼀步步传递到控制层,利⽤切⾯抓取封装异常,返回给调⽤者)。 2.4 ⾯向对象思想 ⼀提起⾯向对象,⼤家都知道抽象、封装、继承、和多态。但是实际⼯作经验中⼜知道多少呢,对于项⽬中如何巧⽤估计更不要提了。 共性的机会每个都需要⽤的建⽴基类,如每个控制层⽅法可能要通过security获取⼀个登录⽤户id,⽤于根据不同的⽤户操作不同的数据,可以抽象出⼀个应⽤层基类,实现获取id的protect⽅法。同理DAO层可以利⽤泛型提取出⼀个包含增删改查的基类。 多态的Override:基类的引⽤变量不仅可以指向基类的实例对象,也可以指向其⼦类的实例对象,如果指向⼦类的实例对象,其调⽤的⽅法应该是正在运⾏的那个对象的⽅法。在策略模式中使⽤很普遍。 提到⾯向对象,就不可避免的要说设计模式,在⼯作中,⼀个技术⼤⽜写的⼀个类似策略模式(更复杂⼀点),⼗分巧妙的解决了各种业务同⼀个⽅法,并且实现了订单、⼯单、业务的解耦,看得我是⾮常佩服。我想很多⾯试中都会问道单例模式吧,还没有理解的建议去看⼀看。 3.多线程 3.1 线程安全 这个是⽼⽣常谈的问题了,但是确实是问题和bug⾼发区。线程同步问题不需要单独写了,想必⼤家都清楚,不太熟悉的建议百度⼀下。 3.1.1 线程安全问题 1.代码中如果有同步操作,共享变量要特别注意(这个⼀般都能意识到) 2多个操作能修改数据表中同⼀条数据的。(这个容易被忽略,业务A可能操作表a,业务B也可以操作表a,业务A、B即使在不同的模块和⽅法中,也会引起线程安全问题。例如如果⼀个⼈访问业务A接⼝,另⼀个⼈访问业务B接⼝,在web中每个业务请求都是会有单独的⼀个线程进⾏处理的,就会出现线程安全问题)。 3.不安全的类型使⽤,例如StringBuffer、StringBuild,HashTable、HashMap等。在⼯作中我就遇到过有⼈在for循环进⾏list的remove,虽然编译器不报错,程序可以运⾏,但是结果却可想⽽知。 的bean默认是单例的,如果有类变量就要特别⼩⼼了(⼀般情况下是没⼈在控制层、业务层、DAO层等⽤类变量的,⽤的话建议是final类型,例如⽇志log,gson等)。 5.多个系统共享数据库情况,这个其实和分布式系统类似 ⽤户重复提交问题(即使代码中从数据库读取是否存在进⾏限制不能解决问题) 3.1.2 线程安全解决 在需要同步的地⽅采⽤安全的类型。 JDK锁机制,lock、tryLock,synchronized,wait、notify、notifyAll等 Concurrent并发⼯具包,在处理⼀些问题上,谁⽤谁知道。强烈建议查看源码! 数据表加锁。(除⾮某个表的访问频率极低,否则不建议使⽤) 涉及分布式的,采⽤中间件技术例如zookeeper等解决。 3.2 异步 异步使⽤场景不影响主线程,且响应较慢的业务。例如IO操作,第三⽅服务(短信验证码、app推送、云存储上传等)。 如果异步任务很多,就需要使⽤任务队列了,任务队列可以在代码级别实现,也可以利⽤redis(优势太明显了)。 3.3 多线程通信 这⽅⾯⽂章⾮常多,这⾥不在详述。 1.共享变量⽅式(共享⽂件、全局变量,信号量机制等) 2.消息队列⽅式 3. 忙等,锁机制 3.4多线程实现 1.集成Thread类,重写(这⾥的重写指的是override)run⽅法,调⽤start⽅法执⾏。 2.实现Runable接⼝,实现run⽅法,以Runable实例创建thread对象。 3.实现Callable接⼝,实现call⽅法,FutureTask包装callable接⼝,FutureTask对象创建thread对象,常⽤语异步操作,建议使⽤匿名内部类,⽅便阅读和使⽤。 额外需要说明的是: 1.理解thread的join⽅法; 2.不要认为volitate是线程安全的(不明⽩原因的建议去看jvm运⾏时刻内存分配策略); 时间⽚结束后并不保证⽴马获取cpu。 Local能够为每⼀个线程维护变量副本,常⽤于在多线程中⽤空间换时间。4. 开源框架4.1 Hibernate、Mybatis 相信每⼀个java程序员对这些都不陌⽣,这⾥不再详述。 需要说明的主要以下⼏点: ate⼀级缓存(内置session缓存),⼆级缓存(可装配sessionFactory缓存),⼆级缓存会引起并发问题。 ate延迟加载原理理解。 ate 的get、load⽅法,sava、persist、savaOrUpdate⽅法区别 n重建了关联关系却并没有同数据库进⾏同步和更新 ate session关联关系:detached对象、persistent对象 data集成,注解⽅式配置属性和实体。 s 插件。 8.分页查询(数据库)。 9.连接池技术4.2 Spring IOC 4.1.1 Spring bean 注⼊ 注解⽅式⽅便易读,引⽤第三⽅(数据库连接,数据库连接池,JedisPool等)采⽤配置⽂件⽅式。 2. bean作⽤域:Singleton,prototype,request,session,global session ⽣命周期:如下图所⽰(图⽚来源于互联⽹):
4.3 Spring AOP 基本概念:关注点、切⾯Aspect、切⼊点pointcut、连接点joinpoint、通知advice、织⼊weave、引⼊introduction。 Spring AOP⽀持5中类型通知,分别是MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice、MethodInterceptor、IntroductionInterceptor(吐槽⼀下名字太长) 实现⽅式如下: 1.基于代理的AOP 2.基于@Aspect注解驱动的切⾯。(强烈推荐:可读性好,易维护,易扩展,开发快) 3.纯POJO切⾯。 4.注⼊式Aspect切⾯。4.4 Srping事务 4.4.1 事务传播 概念:某些操作需要保证原⼦性,如果中间出错,需要事务回滚。如果某个事务回滚,那么调⽤该事务的⽅法中的事务的作出如何的动作,就是事务传播。 事务传播属性: 1. PROPAGATION_REQUIRED--⽀持当前事务,如果当前没有事务,就新建⼀个事务。这是最常见的选择。 2. PROPAGATION_SUPPORTS--⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。 3. PROPAGATION_MANDATORY--⽀持当前事务,如果当前没有事务,就抛出异常。 4. PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 5. PROPAGATION_NOT_SUPPORTED--以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。 6. PROPAGATION_NEVER--以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。 事务隔离级别: 1. ISOLATION_DEFAULT: 这是⼀个PlatfromTransactionManager默认的隔离级别,使⽤数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,充许令外⼀个事务可以看到这个事务未提交的数据。这种隔离级别会产⽣脏读,不可重复读和幻像读。 3. ISOLATION_READ_COMMITTED: 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取该事务未提交的数据 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻像读。它除了保证⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免下⾯的情况产⽣(不可重复读)。 5. ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏读,不可重复读外,还避免了幻像读。4.5 其他Spring 技术栈 spring boot 轻量级启动框架 spring security ⽤户权限管理,根据⾓⾊和⽤户,实现UserDetailsService,进⾏⾃定义权限管理。 spring task 代码级定时任务,注解⽅式,使⽤起来⾮常⽅便。需要注意的是,如果某次定时任务出了异常⽽没有进⾏处理,会导致接下来定时任务失效。如果各个任务相互独⽴,可以简单⽤try,catch包围(之前就吃过这⽅⾯的亏)。 spring data 注解⽅式定义实体,属性等 spring mvc 简单明了的mvc框架。url传值、数组传值、对象传值、对象数组等传值类型,上传/下载⽂件类型需要注意。 spring restful 注意命名,对命名要求很严格。 spring shell 命令⾏⽅式执⾏命令,救⽕、导⼊导出数据等⽤起来⾮常⽅便、制作报表。 5. Web基础
5.1 web容器启动 加载顺序: listener -> filter -> servlet 5.2 Servlet、Interceptor、Listener、Filter Servlet 接收请求返回响应,最原始的web业务处理类。 Interceptor 拦截器,可以实现HandlerInterceptor接⼝⾃定义拦截器,在⽇志记录、权限检查、性能监控、通⽤⾏为等场景使⽤,本质是AOP。 Listener 监听器 常⽤于统计在线⼈数等纵向功能。 Filter 过滤器 在请求接⼝处理业务之前改变requset,在业务处理之后响应⽤户之前改变response。如果某些数据不加密,很容易⽤抓包⼯具加filter作弊。 5.3 web项⽬结构 5.3.1 mvn结构 熟练掌握⼏种常见的mvn项⽬结构,mvn可以⾃动⽣成,这⾥不再详述。 5.3.2 mvn包管理 1.版本号尽量⼏种在⼀个⽂件中便于管理。 milestone包解决spring包冲突问题。 dependency:tree命令分析所有包依赖,对于冲突的在pom⽂件中
⽬录结构明细:/etc/、~/、/usr/、/dev/、/home/、/etc/init.d/ 服务端:jdk、tomcat、nginx、mysql、jedis、neo4j启动与配置(特别说明的是该死的防⽕墙,nginx启动后⼀直访问不了,查找⼀下午查不到原因,最后发现是防⽕墙问题) 监控服务器状态(cpu,磁盘,内存),定位pid,⽇志查看 nginx负载均衡、反向代理、配置 ⾃动化部署脚本 简单shell脚本书写,避免⼤量⼈⼒劳动。 监控系统,代码抛fatal异常⾃动发邮件,系统指标持续偏⾼⾃动发邮件。 9. 数据库相关 10. 第三⽅接⼝对接10.1 ⽀付接⼝ 微信⽀付坑⽐较多,⽤将近两周时间才把微信⽀付所有完成。需要在微信后台配置的地⽅太多。 ⽽⽀付宝⽀付模块只⽤了2天时间就搞定了。10.2 推送接⼝ 为⽤户定义tag、定义alias,注意当数据更新时需要同步更新tag、更新alias。如果没采⽤异步实现(⽤户体验就是好卡啊)10.3 云存储 ⼤量⽂件上传云端(七⽜云),注意创建bucket10.4 短信验证 很简单的第三⽅接⼝,引⼊依赖,直接调⽤即可。需要在第三⽅后台设置模板等,注意限定⽤户访问次数。10.5 邮件 很简单⼩功能,⼯具类。
时间有限,⽬前先写这么多技术栈。对于代码书写和、算法技巧问题,会抽时间写在(2)中。
2023年6月20日发(作者:)
java后端程序员1年⼯作经验总结 java后端1年经验和技术总结(1)1.引⾔ 毕业已经⼀年有余,这⼀年⾥特别感谢技术管理⼈员的器重,以及同事的帮忙,学到了不少东西。这⼀年⾥⾛过⼀些弯路,也碰到⼀些难题,也受到过做为⼀名开发却经常为系统维护和发布当救⽕队员的苦恼。遂决定梳理⼀下⾃⼰所学的东西,为⼤家分享⼀下。 经过⼀年意识到以前也有很多认识误区,⽐如: 偏爱收集,经常收集各种资料视频塞满⼀个个硬盘,然后⼼满意⾜的看着容量不⾏动。 不重基础,总觉得很多基础东西不需要再看了,其实不懂的地⽅很多,计算机程序⽅⾯任何⼀个结果都必有原因,不要只会⽤不知道原理,那是加⼯⼚出来的。现在ide查看代码那么⽅便,ctrl+点击就进⼊了JDK查看实现细节。 好⾼骛远,在计算机基础不牢固的情况下,总想着要做架构,弄分布式,搞⼤数据之类。 不重视性能,只求能实现功能,sql查询是不是可以优化,是否有算法妙⽤,⼤对象是否要清除。 不重视扩展性,模块之间紧密耦合,常⽤⽅法不提取成⼯具类,调⽤关系混乱等问题。 …… 本⽂重点不在这些,故只列举了⼀⼩部分,下⾯进⼊正题。2.语法基础 2.1 Java类初始化顺序 这是所有情况的类初始化顺序,如果实际类中没有定义则跳过:⽗类静态变量——⽗类静态代码块——⼦类静态代码块——⽗类⾮静态变量——⽗类⾮静态代码块——⽗类构造函数——⼦类⾮静态变量——⼦类⾮静态代码块——⼦类构造函数 2.2 值传递和引⽤传递 可能很多⼈对此不屑⼀顾,⼼想⽼⼦都⼯作⼀年了,对这些还不熟悉吗?但实际情况并⾮这样,JDK中东西全部熟悉了吗?以⼀个最简单的例⼦开始,你觉得下图中代码执⾏完之后fatherList中的元素是什么? 这是⼀个最基础的值传递和引⽤传递的例⼦,你觉得好简单,已经想跃跃欲试的挑战了,那么请看下⾯的,StringBuffer很好理解,但是当你执⾏⼀遍之后发现是不是和预想中的输出不⼀样呢?String不是引⽤类型吗,怎么会这样呢?如果你⽆法理解,那么请看下String的实现源码,了解下其在内存中分配的实现原理。 2.3 集合的使⽤ 这部分⼏乎每个⼈都会⽤到,⽽且⼤家还都不陌⽣。下图来源于互联⽹,供⼤家复习⼀下。但是利⽤集合的特性进⾏巧妙的组合运⽤能解决优化很多复杂问题。Set不可重复性,List的顺序性,Map的键值对,SortSet/SortMap的有序性,我在⼯作中有很多复杂的业务都巧妙的使⽤了这些,涉及到公司保密信息,我就不贴出代码了。⼯作越久越发现这些和越巧妙。 2.3 异常处理 1.看着try、catch、finally⾮常容易,如果和事务传播结合在⼀起,就会变得极其复杂。 y不⼀定必须执⾏,return在catch/finally中处理情况(建议亲⾃操⼑试⼀下)。 中可以继续抛⾃定义异常(并把异常⼀步步传递到控制层,利⽤切⾯抓取封装异常,返回给调⽤者)。 2.4 ⾯向对象思想 ⼀提起⾯向对象,⼤家都知道抽象、封装、继承、和多态。但是实际⼯作经验中⼜知道多少呢,对于项⽬中如何巧⽤估计更不要提了。 共性的机会每个都需要⽤的建⽴基类,如每个控制层⽅法可能要通过security获取⼀个登录⽤户id,⽤于根据不同的⽤户操作不同的数据,可以抽象出⼀个应⽤层基类,实现获取id的protect⽅法。同理DAO层可以利⽤泛型提取出⼀个包含增删改查的基类。 多态的Override:基类的引⽤变量不仅可以指向基类的实例对象,也可以指向其⼦类的实例对象,如果指向⼦类的实例对象,其调⽤的⽅法应该是正在运⾏的那个对象的⽅法。在策略模式中使⽤很普遍。 提到⾯向对象,就不可避免的要说设计模式,在⼯作中,⼀个技术⼤⽜写的⼀个类似策略模式(更复杂⼀点),⼗分巧妙的解决了各种业务同⼀个⽅法,并且实现了订单、⼯单、业务的解耦,看得我是⾮常佩服。我想很多⾯试中都会问道单例模式吧,还没有理解的建议去看⼀看。 3.多线程 3.1 线程安全 这个是⽼⽣常谈的问题了,但是确实是问题和bug⾼发区。线程同步问题不需要单独写了,想必⼤家都清楚,不太熟悉的建议百度⼀下。 3.1.1 线程安全问题 1.代码中如果有同步操作,共享变量要特别注意(这个⼀般都能意识到) 2多个操作能修改数据表中同⼀条数据的。(这个容易被忽略,业务A可能操作表a,业务B也可以操作表a,业务A、B即使在不同的模块和⽅法中,也会引起线程安全问题。例如如果⼀个⼈访问业务A接⼝,另⼀个⼈访问业务B接⼝,在web中每个业务请求都是会有单独的⼀个线程进⾏处理的,就会出现线程安全问题)。 3.不安全的类型使⽤,例如StringBuffer、StringBuild,HashTable、HashMap等。在⼯作中我就遇到过有⼈在for循环进⾏list的remove,虽然编译器不报错,程序可以运⾏,但是结果却可想⽽知。 的bean默认是单例的,如果有类变量就要特别⼩⼼了(⼀般情况下是没⼈在控制层、业务层、DAO层等⽤类变量的,⽤的话建议是final类型,例如⽇志log,gson等)。 5.多个系统共享数据库情况,这个其实和分布式系统类似 ⽤户重复提交问题(即使代码中从数据库读取是否存在进⾏限制不能解决问题) 3.1.2 线程安全解决 在需要同步的地⽅采⽤安全的类型。 JDK锁机制,lock、tryLock,synchronized,wait、notify、notifyAll等 Concurrent并发⼯具包,在处理⼀些问题上,谁⽤谁知道。强烈建议查看源码! 数据表加锁。(除⾮某个表的访问频率极低,否则不建议使⽤) 涉及分布式的,采⽤中间件技术例如zookeeper等解决。 3.2 异步 异步使⽤场景不影响主线程,且响应较慢的业务。例如IO操作,第三⽅服务(短信验证码、app推送、云存储上传等)。 如果异步任务很多,就需要使⽤任务队列了,任务队列可以在代码级别实现,也可以利⽤redis(优势太明显了)。 3.3 多线程通信 这⽅⾯⽂章⾮常多,这⾥不在详述。 1.共享变量⽅式(共享⽂件、全局变量,信号量机制等) 2.消息队列⽅式 3. 忙等,锁机制 3.4多线程实现 1.集成Thread类,重写(这⾥的重写指的是override)run⽅法,调⽤start⽅法执⾏。 2.实现Runable接⼝,实现run⽅法,以Runable实例创建thread对象。 3.实现Callable接⼝,实现call⽅法,FutureTask包装callable接⼝,FutureTask对象创建thread对象,常⽤语异步操作,建议使⽤匿名内部类,⽅便阅读和使⽤。 额外需要说明的是: 1.理解thread的join⽅法; 2.不要认为volitate是线程安全的(不明⽩原因的建议去看jvm运⾏时刻内存分配策略); 时间⽚结束后并不保证⽴马获取cpu。 Local能够为每⼀个线程维护变量副本,常⽤于在多线程中⽤空间换时间。4. 开源框架4.1 Hibernate、Mybatis 相信每⼀个java程序员对这些都不陌⽣,这⾥不再详述。 需要说明的主要以下⼏点: ate⼀级缓存(内置session缓存),⼆级缓存(可装配sessionFactory缓存),⼆级缓存会引起并发问题。 ate延迟加载原理理解。 ate 的get、load⽅法,sava、persist、savaOrUpdate⽅法区别 n重建了关联关系却并没有同数据库进⾏同步和更新 ate session关联关系:detached对象、persistent对象 data集成,注解⽅式配置属性和实体。 s 插件。 8.分页查询(数据库)。 9.连接池技术4.2 Spring IOC 4.1.1 Spring bean 注⼊ 注解⽅式⽅便易读,引⽤第三⽅(数据库连接,数据库连接池,JedisPool等)采⽤配置⽂件⽅式。 2. bean作⽤域:Singleton,prototype,request,session,global session ⽣命周期:如下图所⽰(图⽚来源于互联⽹):
4.3 Spring AOP 基本概念:关注点、切⾯Aspect、切⼊点pointcut、连接点joinpoint、通知advice、织⼊weave、引⼊introduction。 Spring AOP⽀持5中类型通知,分别是MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice、MethodInterceptor、IntroductionInterceptor(吐槽⼀下名字太长) 实现⽅式如下: 1.基于代理的AOP 2.基于@Aspect注解驱动的切⾯。(强烈推荐:可读性好,易维护,易扩展,开发快) 3.纯POJO切⾯。 4.注⼊式Aspect切⾯。4.4 Srping事务 4.4.1 事务传播 概念:某些操作需要保证原⼦性,如果中间出错,需要事务回滚。如果某个事务回滚,那么调⽤该事务的⽅法中的事务的作出如何的动作,就是事务传播。 事务传播属性: 1. PROPAGATION_REQUIRED--⽀持当前事务,如果当前没有事务,就新建⼀个事务。这是最常见的选择。 2. PROPAGATION_SUPPORTS--⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。 3. PROPAGATION_MANDATORY--⽀持当前事务,如果当前没有事务,就抛出异常。 4. PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 5. PROPAGATION_NOT_SUPPORTED--以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。 6. PROPAGATION_NEVER--以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。 事务隔离级别: 1. ISOLATION_DEFAULT: 这是⼀个PlatfromTransactionManager默认的隔离级别,使⽤数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应 2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,充许令外⼀个事务可以看到这个事务未提交的数据。这种隔离级别会产⽣脏读,不可重复读和幻像读。 3. ISOLATION_READ_COMMITTED: 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取该事务未提交的数据 4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻像读。它除了保证⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免下⾯的情况产⽣(不可重复读)。 5. ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏读,不可重复读外,还避免了幻像读。4.5 其他Spring 技术栈 spring boot 轻量级启动框架 spring security ⽤户权限管理,根据⾓⾊和⽤户,实现UserDetailsService,进⾏⾃定义权限管理。 spring task 代码级定时任务,注解⽅式,使⽤起来⾮常⽅便。需要注意的是,如果某次定时任务出了异常⽽没有进⾏处理,会导致接下来定时任务失效。如果各个任务相互独⽴,可以简单⽤try,catch包围(之前就吃过这⽅⾯的亏)。 spring data 注解⽅式定义实体,属性等 spring mvc 简单明了的mvc框架。url传值、数组传值、对象传值、对象数组等传值类型,上传/下载⽂件类型需要注意。 spring restful 注意命名,对命名要求很严格。 spring shell 命令⾏⽅式执⾏命令,救⽕、导⼊导出数据等⽤起来⾮常⽅便、制作报表。 5. Web基础
5.1 web容器启动 加载顺序: listener -> filter -> servlet 5.2 Servlet、Interceptor、Listener、Filter Servlet 接收请求返回响应,最原始的web业务处理类。 Interceptor 拦截器,可以实现HandlerInterceptor接⼝⾃定义拦截器,在⽇志记录、权限检查、性能监控、通⽤⾏为等场景使⽤,本质是AOP。 Listener 监听器 常⽤于统计在线⼈数等纵向功能。 Filter 过滤器 在请求接⼝处理业务之前改变requset,在业务处理之后响应⽤户之前改变response。如果某些数据不加密,很容易⽤抓包⼯具加filter作弊。 5.3 web项⽬结构 5.3.1 mvn结构 熟练掌握⼏种常见的mvn项⽬结构,mvn可以⾃动⽣成,这⾥不再详述。 5.3.2 mvn包管理 1.版本号尽量⼏种在⼀个⽂件中便于管理。 milestone包解决spring包冲突问题。 dependency:tree命令分析所有包依赖,对于冲突的在pom⽂件中
⽬录结构明细:/etc/、~/、/usr/、/dev/、/home/、/etc/init.d/ 服务端:jdk、tomcat、nginx、mysql、jedis、neo4j启动与配置(特别说明的是该死的防⽕墙,nginx启动后⼀直访问不了,查找⼀下午查不到原因,最后发现是防⽕墙问题) 监控服务器状态(cpu,磁盘,内存),定位pid,⽇志查看 nginx负载均衡、反向代理、配置 ⾃动化部署脚本 简单shell脚本书写,避免⼤量⼈⼒劳动。 监控系统,代码抛fatal异常⾃动发邮件,系统指标持续偏⾼⾃动发邮件。 9. 数据库相关 10. 第三⽅接⼝对接10.1 ⽀付接⼝ 微信⽀付坑⽐较多,⽤将近两周时间才把微信⽀付所有完成。需要在微信后台配置的地⽅太多。 ⽽⽀付宝⽀付模块只⽤了2天时间就搞定了。10.2 推送接⼝ 为⽤户定义tag、定义alias,注意当数据更新时需要同步更新tag、更新alias。如果没采⽤异步实现(⽤户体验就是好卡啊)10.3 云存储 ⼤量⽂件上传云端(七⽜云),注意创建bucket10.4 短信验证 很简单的第三⽅接⼝,引⼊依赖,直接调⽤即可。需要在第三⽅后台设置模板等,注意限定⽤户访问次数。10.5 邮件 很简单⼩功能,⼯具类。
时间有限,⽬前先写这么多技术栈。对于代码书写和、算法技巧问题,会抽时间写在(2)中。
发布评论