透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优秀工具推荐,算法知识,直通硅谷

知乎精选 admin 2019-05-16 209 次浏览 0个评论
网站分享代码

结业现已一年有余,这一年里特别感谢技能办理人员的器重,以及搭档的帮助,学到了不少东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却常常为体系保护和发布当救火队员的苦恼。遂决议整理一下自己所学的东西,为我们同享一下。

经过一年意识到曾经也有许多知道误区,比方:

偏心搜集,常常搜集各种材料视频塞满一个个硬盘,然后称心如意的看着容量不举动。

不重根底,总觉得许多根底东西不需求再看了,其实不明白的当地许多,计算机程序方面任何一个成果都必有原因,不要只会用不知道原理,那是加工厂出来的。现在ide检查代码那么便利,ctrl+点击就进入了JDK检查完结细节。

好大喜功,在计算机根底不结实的状况下,总想着要做架构,弄分布式,搞大数据之类。

不注重功用,只求能完结功用,sql查询是不是能够优化,是否有算法妙用,大目标是否要铲除。

不注重扩展性,模块之间严密耦合,常用办法不提取成东西类,调用联系紊乱等问题。

……无土栽培技能

本文要点不在这些,故只列举了一小部分,下面进入正题。

2.语法根底

 2.1 Java类初始化次序

这是一切状况的类初始化次序,假如实践类中没有界说则越过:父类静态变量——父类静态代码块——子类静态代码块——父类非静态变量——父类非静态代码块——父类结构函数——子类非静态变量——赛欧3子类非静态代码块——子类结构函数

 2.2 值传递和引证传递

或许许多人对此嗤之以鼻,心想老子都作业一年了,对这些还不了解吗?但实践状况并非这样,JDK中东西悉数了解了吗?以一个最简略的比如开端,你觉得下图中代码履行完之后fatherList中的元素是什么?


这是一个最根底的值传递和引证传递的比如,你觉得好简略,现已想摩拳擦掌的挑战了,那么请看下面的,StringBuffer很好了解,可是当你履行一遍之后发现是不是和料想中的输出不一样呢?String不是引证类型吗,怎么会这样呢春卷皮的做法?假如你无法了解,那么请看下String的完结源码,了解下其在内存中分配的完结原理。


 2.3 调集的运用

这部分简直每个人都会用到,而且我们还都不生疏。下图来源于互联网,供我们温习一下。可是运用调集的特性进行奇妙的组合运用能处理优化许多杂乱问题。Set不行重复性,List的次序性,Map的键值对,SortSet/SortMap的有序性,我在作业中有许多杂乱的事务都奇妙的运用了这些,触及到公司保密信息,我就不贴出代码了。作业越久越发现这些和越奇妙。


 2.3 反常处理

1.看着布里斯班try、catch、finally十分简略,假如和事务传达结合在一起,就会变得极端杂乱。

2.finally不一定有必要履行,return在catch/finally中处理状况(主张亲身操刀试一下)。

3.catch中能够继续抛自界说反常(并把反常一步步传递到操控层,运用切面抓取封装反常,回来给调用者)。

 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,尽管编译器不报错,程序能够运转,可是成果却可想而知。

4.Spring的bean默许是单例的,假如有类变量就要特别当心了(一般状况下是没人在操控层、事务层、DAO层等用类变量的,用的话主张是final类型,例如日志log,透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷gson等)。

5.多个体系同享数据库状况,这个其实和分布式体系相似

用户重复提交问题(即便代码中从数据库读取是否存在进行约束不能处理问题)

 3.1.2 线程安全处理

在需求同步的当地选用安全的类型。

JDK锁机制,lock、tryLock,synchronized,wait、notify、notifyAll等

Concurrent并发东西包,在处理一些问题上,谁用谁知道。强烈主张检查源码!

数据表加锁。(除非某个表的拜访频率极低,否则不主张运用)

触及分布式的,透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷选用中心件技能例如zookeeper等处理。

 3.2 异步

异步运用场景不影响主线程,且呼应较慢的事务。例如IO操作,第三方服务(短信验证码、app推送、云存储上传等)。

假如异步使命许多,就需求运用使命行列目录了,使命行列能够在代码等级完结,也能够运用rletedis(优势太显着了)。

 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运转时刻内存分配战略);

3.sleep时刻片完毕后并不确保立马获取cpu。

4.Thr透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷eadLocal能够为每一个厦门超雅乳酪线程保护变量副本,常用于在多线程顶用空间换时刻。

4. 开源结构

4.1 Hibernate、Mybatis

信任每一个java程序员对这些都不生疏,这儿不再胪陈。

需求阐明的首要以下几点:

1.hibernate一级缓存(内置session缓存),二级缓存(可安装sessionFactory缓存),二级缓存会引起并发问题。

2.hibernate推迟加载原理了解。

3.hibernate 的get、load办法,sava、persist、savaOrUpdate办法差异

4.session重建了相相联系却并没有同数据库进行同步和更新

5.hibernate session相相联系:detached目标、persistent目标

6.Spring data集成,注解办法装备特点和实体。

7.mybatis 插件。

8.分页查询(数据库)。

9.衔接池技能

4.2 Spring IOC

4.1.1 Spring bean

1.bean注入 注解办法便利易读,引证第三方(数据库衔接,数据库衔接池,JedisPool等)选用装备文件办法。

2. bean效果域:Singlet透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷on,prototype,request,session,global session

3.bean生命周期:如下图所示(图片来源于互联网):


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 事务传达

概念:某些操作需求确保原子性,假如中心犯错,需求事务回滚。假如某个事务回滚,那么调用该事务的办法中的事务的作出怎么的动作,便是事务传达。

短时刻内写不清楚,主张拜访http://www.cnblogs.com/yangy608/archive/2010/12/15/1907065.html 检查。

事务a8传达特点:

1. PROPAGATION_REQUIRED--支撑当时事务,假如当时没有事务,就新建一个事务。这是最常见的挑选。

2. PROPAGATION_SUPPORTS--支撑当时事务,假如当时没有事务,就以非事务办法履行。

3. PROPAGATI小米路由器设置ON_MANDATORY--支撑当时事务,假如当时没有事务,就抛出反常。

4. PROPAGATION_REQUIRES_NEW--新建事务,假如当时存在事务,把当时事务挂起。

5. PROPAGATION_NOT_SUPPORTED--以非事务办法履行操作,假如当时存在事务,就把当时事务挂起。

6. PROPAGATION_NEVER--以非事务办法履行,假如当时存在事务,则抛出反常。

事务阻隔等级:

1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默许的隔透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷离等级,运用数据库默许的事务阻隔等级.别的四个与JDBC的阻隔等级相对应

2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的阻隔等级,充许令外一个事务能够看到这个事务未提交的数据。这种阻隔等级会发生脏读,不行重复读和幻像读。

3. ISOLATION_READ_COMMITTED: 确保一个事务修正的数据提交后才干被别的一个事务读取。别的一个事务不能读取该事务未提交的数据

4. ISOLATION_REPEATABLE_READ: 这种事务阻隔等级能够防止脏读,不行重复读。可是或许呈现幻像读。它除了确保一个事务不能读取另一个事务未提交的数据外,还确保了防止下面的状况发生(不行重复读)。

5. ISOLATION_SERIALIZABLE 这是花费最高价值可是最牢靠的事务阻隔等级。事务被处理为次序履行。除了防止脏读,不行重复读外,还防止了透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷幻像读。

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容器发动

1pokeman.web.xml加载次序: listener -> filter -> servlet

2.webt容器发动进程,java新手很怕装备文件,了解完这些有助于了解装备文件 http://blog.csdn.net/u014431852/article/details/47042895

 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.版别号尽量几种在一个文件中便于办理。

2.spring milestone包处理spring包抵触问题。

3.mvn dependency:tree指令剖析一切包依靠,关于抵触的在pom文件中 围住起来

5.3.3 版别操控

1.git、svn等

2.代码抵触处理方案

3.分支办理。

关于某个安稳版别上线后,假如在此根底上开发新功用,一定要新建分支,在新分支上提交代码,最终在新版发布时兼并分支。修正运营环境bug切换到主分支进行修正

5.4 Http恳求

5.4.1 恳求办法

post、get、put、head、delete、copy、move、connect、link、patch,最常用的是前4、5个。

5.4.2 恳求头,状况码

常用的恳求头有Accept(下载文件会特别运用)、Accept-Charset(设置utf-8字符集)、Content-Type(json等装备)等

常用的呼应头有Content-Type、Content-Type、Content-Length等,偏前端,不再胪陈。

6. 体系架构

触摸的不是特别多,现在用到的仅仅服务器主从备份。Nginx反向署理进行装备。

多个项目nginx装备

Spring Mvc 用json数据进行交互,装备json转化的servlet。

封装回来值

自界说RunEnvironmentExc重庆地铁eption(状况码,原因),掩盖原有Exception,切面ExceptionHandler抓取Exception并封装到回来值中(前后端松耦合)

令人头疼的用户重复(接连快速点击)提交问题,前端约束治标不治本;后端用sessonid在切面上完结,超级银河兄妹又需求前端存储,对一切恳求数据加sessionId。最终用jedis中存储,用接口名+用户名作为key,依据不同的接口对不同的key能够独自设置时刻,不只确保了重复提交问题,也防止了歹意恳求问题,一起还能自界说恳求距离。(期初忧虑redis缓存读写时刻延误导致约束失效,后来发现多虑了,对一般的小体系来说,经功用测验,发现即便恳求频率再进步100被也不会导致约束失效)

testNg单元测验、功用测验,掩盖测验。

切面办理日期、权限。缓存等。

7. Nosql

1.Redis的java库Jedis。

Jedispool装备。

项目顶用到的有使命行列、缓存。

2. neo4j图数据库

处理交际、引荐

8. 服务端

linux操作体系了解以centos为例:

常用简略指令:ssh、vim、scp、ps、gerp、sed、awk、cat、tail,df、top,shell、chmod、sh、tar、find、wc、ln、|

目录结构明细:/etc/、~/、/usr/、/dev/、/home/、/etc/init.d/

服务端:jdk、tomcat、nginx、m沙眼ysql、jedis、neo4j发动与装备(特别阐明的是该死的防火墙,nginx发动后一向拜访不了,查找一下午查不到原因,最终发现是防火墙问题)

监控服务器状况(cpu,磁盘,内存),定位pid,日志检查

nginx负载均衡、反向署理、装备

主动化布置脚本

简略shell脚本书写,防止很多人力劳作。

监控体系,代码抛fatal反常主动发邮件,体系目标继续偏高主动发邮件。

9. 数据库相关

10. 第三方接口对接

10.1 付出接口

微信付出坑比较多,用将近两周时刻才把微信付出一切完结。需求在微信后台装备的当地太多。

而付出宝付出模块只用了2天时刻就搞定了。

10.2 推送接口

为用户界说tag、界说alias,留意当数据更新时需求同步更新tag、更新alias。假如没选用异步完结(用户体会便是好卡啊)

10.3 云存储

很多文件上传云端(七牛云),留意创立bucket

10.4 短信验证

很简略的第三方接口,引进依靠,直接调用即可。需求在求职简历第三方后台设置模板等,留意限制用户拜访次数。

10.5 邮件

很简略小功用,东西类。

时刻有限,现在先写这么多技能栈。关于代码书写和、算法技巧问题,会抽时刻写在(透明人,这是来自!一位java后端程序员1年作业经验总结!-机器学习优异东西引荐,算法常识,直通硅谷2)中。