openfire服务器linux(openwrtftp服务器)「openwrtftp服务器设置」

  java后端1年履历和技能总结(1)

  1.弁言

  毕业已经一年有余,这一年里特别感谢技能管理职员的器重,以及同事的资助,学到了不少东西。这一年里走过一些弯路,也碰到一些困难,也受到过做为一名开辟却常常为体系维护和发布当救火队员的苦恼。遂决定梳理一下本身所学的东西,为各人分享一下。

  颠末一年意识到从前也有很多认识误区,比如:

  偏幸网络,常常网络各种资料视频塞满一个个硬盘,然后心满意足的看着容量不可动。

  不重底子,总以为很多底子东西不必要再看了,着实不懂的地方很多,盘算机程序方面任何一个结果都必有缘故起因,不要只会用不知道原理,那是加工厂出来的。如今ide查察代码那么方便,ctrl+点击就进入了JDK查察实现细节。

  好高骛远,在盘算机底子不牢固的环境下,总想着要做架构,弄分布式,搞大数据之类。

  不器重性能,只求能实现功能,sql查询是不是可以优化,是否有算法妙用,大对象是否要打扫。

  不器重扩展性,模块之间精密耦合,常用方法不提取成工具类,调用关系紊乱等题目。

  ……

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

  2.语法底子

  2.1Java类初始化次序

  这是全部环境的类初始化次序,假如实际类中没有界说则跳过:父类静态变量——父类静态代码块——子类静态代码块——父类非静态变量——父类非静态代码块——父类构造函数——子类非静态变量——子类非静态代码块——子类构造函数

  2.2值转达和引用转达

  大概很多人对此不屑一顾,心想老子都工作一年了,对这些还不认识吗?但实际环境并非如许,JDK中东西全部认识了吗?以一个最简单的例子开始,你以为下图中代码实行完之后fatherList中的元素是什么?

  

openfire服务器linux(openwrtftp服务器) openfire服务器linux(openwrtftp服务器)「openwrtftp服务器设置」 行业资讯

  这是一个最底子的值转达和引用转达的例子,你以为好简单,已经想跃跃欲试的挑衅了,那么请看下面的,StringBuffer很好明白,但是当你实行一遍之后发现是不是和预想中的输出不一样呢?String不是引用范例吗,怎么会如许呢?假如你无法明白,那么请看下String的实现源码,相识下其在内存中分配的实现原理。

  

  2.3聚集的利用

  这部分险些每个人都会用到,而且各人还都不陌生。下图泉源于互联网,供各人复习一下。但是利用聚集的特性举行奇妙的组合运用能办理优化很多复杂题目。Set不可重复性,List的次序性,Map的键值对,SortSet/SortMap的有序性,我在工作中有很多复杂的业务都奇妙的利用了这些,涉及到公司保密信息,我就不贴出代码了。工作越久越发现这些和越奇妙。

  

  2.3非常处理惩罚

  1.看着try、catch、finally非常轻易,假如和事件传播连合在一起,就会变得极其复杂。

  2.finally不肯定必须实行,return在catch/finally中处理惩罚环境(发起亲身操刀试一下)。

  3.catch中可以继承抛自界说非常(并把非常一步步转达到控制层,利用切面抓取封装非常,返回给调用者)。

  4.Java学习交换QQ群:589809992克制闲聊,非喜勿进!

openfire服务器linux(openwrtftp服务器) openfire服务器linux(openwrtftp服务器)「openwrtftp服务器设置」 行业资讯

  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,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运行时候内存分配战略);

  3.sleep时间片竣事后并不包管立马获取cpu。

  4.ThreadLocal可以或许为每一个线程维护变量副本,常用于在多线程中用空间换时间。

  5.Java学习交换QQ群:589809992克制闲聊,非喜勿进!

  4.开源框架

  4.1Hibernate、Mybatis

  信托每一个java程序员对这些都不陌生,这里不再详述。

  必要阐明的重要以下几点:

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

  2.hibernate耽误加载原理明白。

  3.hibernate的get、load方法,sava、persist、savaOrUpdate方法区别

  4.session重修了关联关系却并没有同数据库举行同步和更新

  5.hibernatesession关联关系:detached对象、persistent对象

  6.Springdata集成,注解方式设置属性和实体。

  7.mybatis插件。

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

  9.毗连池技能

  4.2SpringIOC

  4.1.1Springbean

  1.bean注入注解方式方便易读,引用第三方(数据库毗连,数据库毗连池,JedisPool等)采取设置文件方式。

  2.bean作用域:Singleton,prototype,request,session,globalsession

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

  

  4.3SpringAOP

  根本概念:关注点、切面Aspect、切入点pointcut、毗连点joinpoint、关照advice、织入weave、引入introduction。

  SpringAOP支持5中范例关照,分别是MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice、MethodInterceptor、IntroductionInterceptor(吐槽一下名字太长)

  实现方式如下:

  1.基于署理的AOP

  2.基于@Aspect注解驱动的切面。(猛烈保举:可读性好,易维护,易扩展,开辟快)

  3.纯POJO切面。

  4.注入式Aspect切面。

  4.4Srping事件

  4.4.1事件传播

  概念:某些操纵必要包管原子性,假如中心堕落,必要事件回滚。假如某个事件回滚,那么调用该事件的方法中的事件的作出怎样的动作,就是事件传播。

  短时间内写不清楚,发起访问https://www.cnblogs.com/yangy608/archive/2010/12/15/1907065.html查察。

  事件传播属性:

  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技能栈

  springboot轻量级启动框架

  springsecurity用户权限管理,根据脚色和用户,实现UserDetailsService,举行自界说权限管理。

  springtask代码级定时任务,注解方式,利用起来非常方便。必要留意的是,假如某次定时任务出了非常而没有举行处理惩罚,会导致接下来定时任务失效。假如各个任务相互独立,可以简单用try,catch困绕(之前就吃过这方面的亏)。

  springdata注解方式界说实体,属性等

  springmvc简单明白的mvc框架。url传值、数组传值、对象传值、对象数组等传值范例,上传/下载文件范例必要留意。

  springrestful留意定名,对定名要求很严格。

  springshell下令行方式实行下令,救火、导入导出数据等用起来非常方便、制作报表。

  5.Web底子

  5.1web容器启动

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

  2.webt容器启动过程,java新手很怕设置文件,明白完这些有助于认识设置文件https://blog.csdn.net/u014431852/article/details/47042895

  5.2Servlet、Interceptor、Listener、Filter

  Servlet吸取哀求返反响应,最原始的web业务处理惩罚类。

  Interceptor拦截器,可以实现HandlerInterceptor接口自界说拦截器,在日记记录、权限查抄、性能监控、通用举动等场景利用,本质是AOP。

  Listener监听器常用于统计在线人数等纵向功能。

  Filter过滤器在哀求接口处理惩罚业务之前改变requset,在业务处理惩罚之后相应用户之前改变response。假如某些数据不加密,很轻易用抓包工具加filter作弊。

  5.3web项目布局

  5.3.1mvn布局

  纯熟把握几种常见的mvn项目布局,mvn可以主动天生,这里不再详述。

  5.3.2mvn包管理

  1.版本号只管几种在一个文件中便于管理。

  2.springmilestone包办理spring包辩论题目。

  3.mvndependency:tree下令分析全部包依靠,对于辩论的在pom文件中困绕起来

  5.3.3版本控制

  1.git、svn等

  2.代码辩论办理方案

  3.分支管理。

  4.Java学习交换QQ群:589809992克制闲聊,非喜勿进!

  对于某个稳固版本上线后,假如在此底子上开辟新功能,肯定要新建分支,在新分支上提交代码,末了在新版发布时归并分支。修改运营环境bug切换到主分支举行修改

  5.4Http哀求

  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设置

  SpringMvc用json数据举行交互,设置json转换的servlet。

  封装返回值

  自界说RunEnvironmentException(状态码,缘故起因),覆盖原有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、mysql、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邮件

  很简单小功能,工具类。

  时间有限,如今先写这么多技能栈。对于代码誊写和、算法本领题目,会抽时间写在(2)中。

  我有一个微信公众号,常常会分享一些Java技能相干的干货。假如你喜好我的分享,可以用微信搜刮“Java团长”大概“javatuanzhang”关注。

客户评论

我要评论