有很多认识误区

引言

我逐渐意识到以前有很多认识误区,比如:

偏爱收集:我经常收集各种资料和视频,塞满一个个硬盘,但却从未真正深入学习过。

忽视基础:我曾经认为很多基础知识不需要再学了,但其实不懂的地方很多。在计算机程序方面,任何一个结果都必有原因,不要只知其然不知其所以然。现在,IDE查看代码变得非常方便,只需Ctrl+点击就可进入JDK查看实现细节。

好高骛远:在计算机基础不牢固的情况下,总想着要做架构,弄分布式,搞大数据等高难度技术。

忽视性能:只求能实现功能,却忽略了SQL查询是否可以优化,是否有算法优化的方法,大对象是否需要清除等问题。

忽视扩展性:模块之间紧密耦合,常用方法没有提取成工具类,调用关系混乱等问题。

……

1.语法基础

2.1 值传递和引用传递

在计算机科学中,值传递和引用传递是两种常见的参数传递方式。值传递是指在函数调用时将参数的值复制到函数的形式参数中,而引用传递则是指将实参的地址复制到形参中,从而使函数能够访问实参的值。当我们在编写程序时,我们需要了解这些概念以便更好地理解程序的运行方式。

值传递和引用传递在实际应用中有许多不同的用途。例如,在编写代码时,我们可能需要创建一个函数来修改数组中的元素。在这种情况下,我们需要使用引用传递,以便让函数能够修改数组中的值。另一方面,在其他情况下,我们可能会使用值传递来确保函数不会修改原始数据。

总之,值传递和引用传递是程序员经常使用的两种参数传递方式。了解它们的细节和用途将有助于您更好地理解程序的工作方式,并帮助您更好地编写高效的代码。

2.2 集合的使用

集合是一种常见的数据结构,几乎每个人都已经用过了。虽然它们很常见,但是利用集合的特性进行巧妙的组合运用能解决很多复杂问题。例如,Set不可重复性,List的顺序性,Map的键值对以及SortSet/SortMap的有序性。这些特性在工作中有很多复杂的业务都可以巧妙的使用。

通过使用Set,我可以将一个大型的数据集合去重,以便更好地分析数据。通过使用List,我可以按照顺序存储数据,以便更好地进行数据分析。通过使用Map,我可以将数据与键值对应,以便更好地进行数据查询。通过使用SortSet/SortMap,我可以在有序的数据集合中查找数据。

在我工作的过程中,我发现越来越多的情况需要使用集合进行数据处理。因此,我建议大家学好集合的使用,这将对你的工作有很大的帮助。

2.3 异常处理

在处理异常时,try、catch、finally这些关键字可能很容易理解,但是如果和事务传播结合在一起,就会变得极其复杂。这就需要我们在代码中仔细考虑,避免出现意外的情况。此外,在catch/finally中处理情况时,需要注意finally并不一定必须执行,而且如果想更好地掌握异常处理技巧,建议亲自操刀试一下,从而更好地理解异常处理的机制。另外,对于catch中抛出的自定义异常,我们可以继续将其传递到控制层,并且利用切面抓取封装异常,最终再将其返回给调用者。这样可以更好地掌控异常处理的流程。

2.4 面向对象思想

提到面向对象,我们都知道抽象、封装、继承、和多态这些关键概念。但是在实际工作经验中,很多人却很难将这些概念应用到项目中。对于如何巧妙地应用面向对象思想,我们需要多加思考。为了更好地处理共性的机会,我们可以考虑建立基类。例如,每个控制层方法可能要通过security获取一个登录用户id,用于根据不同的用户操作不同的数据,可以抽象出一个应用层基类,实现获取id的protect方法。同理,DAO层可以利用泛型提取出一个包含增删改查的基类。这样可以更好地控制代码的逻辑,提高代码的复用性。

除了基本的面向对象思想之外,我们还需要了解一些设计模式,这些模式可以帮助我们更好地解决一些实际问题。此外,在面试中,单例模式也是一个常见的问题,如果还没有理解的话,建议去看一看相关的资料,加深对设计模式的理解。

3.多线程

3.1 线程安全

线程同步问题是问题和bug高发区。共享变量要特别注意。多个操作能修改数据表中同一条数据的可能会引起线程安全问题。不安全的类型使用,例如StringBuffer、StringBuild,HashTable、HashMap等,会导致线程安全问题。Spring的bean默认是单例的,如果有类变量就要特别小心了。多个系统共享数据库情况,这个其实和分布式系统类似。用户重复提交问题也要注意。

3.1.2 线程安全解决

在需要同步的地方采用安全的类型。JDK锁机制,lock、tryLock,synchronized,wait、notify、notifyAll等。Concurrent并发工具包,在处理一些问题上,谁用谁知道。强烈建议查看源码!数据表加锁,涉及分布式的,采用中间件技术例如zookeeper等解决。

3.2 异步

异步使用场景不影响主线程,且响应较慢的业务。例如IO操作,第三方服务(短信验证码、app推送、云存储上传等)。如果异步任务很多,就需要使用任务队列了,任务队列可以在代码级别实现,也可以利用redis(优势太明显了)。

3.3 多线程通信

共享变量方式、消息队列方式,这方面文章非常多。

3.4多线程实现

集成Thread类,重写run方法,调用start方法执行。实现Runable接口,实现run方法,以Runable实例创建thread对象。实现Callable接口,实现call方法,FutureTask包装callable接口,FutureTask对象创建thread对象,常用语异步操作。

额外需要说明的是:理解thread的join方法;不要认为volitate是线程安全的;sleep时间片结束后并不保证立马获取cpu。ThreadLocal能够为每一个线程维护变量副本,常用于在多线程中用空间换时间。

4.开源框架

4.1 Hibernate、Mybatis

hibernate一级缓存(内置session缓存),二级缓存(可装配sessionFactory缓存),二级缓存会引起并发问题。hibernate延迟加载原理理解。hibernate的get、load方法,sava、persist、savaOrUpdate方法区别。session重建了关联关系却并没有同数据库进行同步和更新。hibernate session关联关系:detached对象、persistent对象。Spring data集成,注解方式配置属性和实体。mybatis 插件。分页查询(数据库)。连接池技术。

4.2 Spring IOC

bean注入,bean作用域:Singleton,prototype,request,session,global session。bean生命周期。

4.3 Spring AOP

Spring AOP支持5中类型通知,分别是MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice、MethodInterceptor、IntroductionInterceptor。

4.4 Srping事务

事务传播:PROPAGATION_REQUIRED,PROPAGATION_SUPPORTS,PROPAGATION_MANDATORY,PROPAGATION_REQUIRES_NEW,PROPAGATION_NOT_SUPPORTED,PROPAGATION_NEVER。事务隔离级别:ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_REPEATABLE_READ,ISOLATION_SERIALIZABLE。

4.5 其他Spring 技术栈

spring boot 轻量级启动框架。spring security 用户权限管理,根据角色和用户,实现UserDetailsService,进行自定义权限管理。spring task 代码级定时任务,注解方式。spring data 注解方式定义实体,属性等。spring mvc 简单明了的mvc框架。url传值、数组传值、对象传值。

Web基础

5.1 web容器启动

web.xml加载顺序: listener -> filter -> servlet

5.2 Servlet、Interceptor、Listener、Filter

Servlet 接收请求返回响应,最原始的web业务处理类。

Interceptor 拦截器,可以实现HandlerInterceptor接口自定义拦截器,在日志记录、权限检查、性能监控、通用行为等场景使用,本质是AOP。

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

Filter 过滤器 在请求接口处理业务之前改变requset,在业务处理之后响应用户之前改变response。

5.3 web项目结构

5.3.1 mvn结构

熟练掌握几种常见的mvn项目结构,mvn可以自动生成,这里不再详述。

5.3.2 mvn包管理

版本号尽量几种在一个文件中便于管理。

spring milestone包解决spring包冲突问题。

mvn dependency:tree命令分析所有包依赖,对于冲突的在pom文件中<exclusion> 包围起来

5.3.3 版本控制

git、svn等

代码冲突解决方案

分支管理。

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异常自动发邮件,系统指标持续偏高自动发邮件。

数据库相关

第三方接口对接

6.1 支付接口

微信支付坑比较多,用将近两周时间才把微信支付所有完成。需要在微信后台配置的地方太多。

而支付宝支付模块只用了2天时间就搞定了。

6.2 推送接口

为用户定义tag、定义alias,注意当数据更新时需要同步更新tag、更新alias。如果没采用异步实现(用户体验就是好卡啊)

6.3 云存储

大量文件上传云端(七牛云),注意创建bucket

6.4 短信验证

很简单的第三方接口,引入依赖,直接调用即可。需要在第三方后台设置模板等,注意限定用户访问次数。

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶再见知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值