• 精干货! Java 后端程序员 1 年工作经验总结


    一、引言
     
    毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少
    东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护
    和发布当救火队员的苦恼。遂决定梳理一下自己所学的东西,为大家分享一下。
     
    经过一年意识到以前也有很多认识误区,比如:
     
      
    偏爱收集,经常收集各种资料视频塞满一个个硬盘,然后心满意足的看着容量不行动。
     
      
    不重基础,总觉得很多基础东西不需要再看了,其实不懂的地方很多,计算机程序方面任何
    一个结果都必有原因,不要只会用不知道原理,那是加工厂出来的。现在
    ide
    查看代码那么
    方便,
    ctrl
    +
    点击就进入了
    JDK
    查看实现细节。
     
      
    好高骛远,在计算机基础不牢固的情况下,总想着要做架构,弄分布式,搞大数据之类。
     
      
    不重视性能
    只求能实现功能
    sql
    查询是不是可以优化
    是否有算法妙用
    大对象是否要
    清除。
     
      
    不重视扩展性,模块之间紧密耦合,常用方法不提取成工具类,调用关系混乱等问题。
     
     
    ……
     
      
    本文重点不在这些,故只列举了一小部分,下面进入正题。
    二、语法基础
    2.1
     
    Java
    类初始化顺序
     
      
    这是所有情况的类初始化顺序,如果实际类中没有定义则跳过:父类静态变量
    ——
    父类静态
    代码块
    ——
    子类静态代码块
    ——
    父类非静态变量
    ——
    类非静态代码块
    ——
    父类构造函数
    ——
    子类非静态变量
    ——
    子类非静态代码块
    ——
    子类构造函数
     
    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.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
    能够为每一个线程维护变量副本,常用于在多线程中用空间换时间。
     
    四、开源框架
    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
    作用域:
    Singleton
    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
     
    事务传播
     
    概念:某些操作需要保证原子性,如果中间出错,需要事务回滚。如果某个事务回滚,那么
    调用该事务的方法中的事务的作出如何的动作,就是事务传播。
     
    短时间内写不清楚,
    建议访问问
     
    网页链接查看。
     
      
    事务传播属性:
     
      
    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
     
    命令行方式执行命令,救火、导入导出数据等用起来非常方便、制作报表。
      
    五、
    Web
    基础
    5.1
     
    web
    容器启动
     
      
    1.
    web
    .
    xml
    加载顺序
    :
     
    listener
     
    ->
     
    filter
     
    ->
     
    servlet
     
      
    2.
    webt
    容器启动过程,
    java
    新手很怕配置文件,理解完这些有助于熟悉配置文件网页链接
    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
    等,偏前端,不再详述。
    六、系统架构
    接触的不是特别多,目前用到的只是服务器主从备份。
    Nginx
    反向代理进行配置。
     
      
    多个项目
    nginx
    配置
     
      
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    Spring
     
    Mvc
     
    json
    数据进行交互,配置
    json
    转换的
    servlet
     
      
    封装返回值
     
      
    自定义
    RunEnvironmentException
    (状态码,原因),覆盖原有
    Exception
    ,切面
    ExceptionHandler
    抓取
    Exception
    并封装到返回值中(前后端松耦合)
     
      
    令人头疼的用户重复
    连续快速点击
    提交问题
    前端限制治标不治本
    后端用
    sessonid
    在切面上实现
    又需要前端存储
    对所有请求数据加
    sessionId
    最后用
    jedis
    中存储
    用接
    口名
    +
    用户名当做
    key
    根据不同的接口对不同的
    key
    可以单独设置时间
    不仅保
    证了重复
    提交问题,也避免了恶意请求问题,同时还能自定义请求间隔。(期初担心
    redis
    缓存读写时
    间延误导致限制失效,后来发现多虑了,对一般的小系统来说,经性能测试,发现即使请求
    频率再提高
    100
    被也不会导致限制失效)
     
      
    testNg
    单元测试、性能测试,覆盖测试。
     
      
    切面管理日期、权限。缓存等。
    七、
     
    Nosql
    1.
    Redis
    java
    Jedis
     
      
    Jedispool
    配置。
     
      
    项目中用到的有任务队列、缓存。
     
      
    2.
     
    neo4j
    图数据库
     
      
    处理社交、推荐
    八、服务端
    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.1
     
    支付接口
     
    微信支付坑比较多,用将近两周时间才把微信支付所有完成。需要在微信后台配置的地方太
    多。
     
    而支付宝支付模块只用了
    2
    天时间就搞定了。
     
    9.2
     
    推送接口
     
    为用户定义
    tag
    定义
    alias
    注意当数据更新时需要同步更新
    tag
    更新
    alias
    如果没采用
    异步实现(用户体验就是好卡啊)
     
    9.3
     
    云存储
     
    大量文件上传云端(七牛云),注意创建
    bucket
     
    9.4
     
    短信验证
     
    很简单的第三方接口,引入依赖,直接调用即可。需要在第三方后台设置模板等,注意限定
    用户访问次数。
     
    9.5
     
    邮件
     
    很简单小功能,工具类。
     
    时间有限,目前先写这么多技术栈。
    6/10
     
     
     
  • 相关阅读:
    你没听过的乔布斯语录:苹果如果没这么独,可能更成功
    关于Apache mod_rewrite的中文配置、使用和语法介绍(实现URL重写和防盗链功能)
    与调试器共舞
    libxml2.dylb 导致<libxml/tree.h> 老是找不到头文件
    国家气象局提供的天气预报接口(完整Json接口)
    dSYM 文件分析工具
    总结
    1-22
    【图论】
    好像要开始图论了....但搜索还剩了点....
  • 原文地址:https://www.cnblogs.com/rey888/p/8287616.html
Copyright © 2020-2023  润新知