首家大数据培训挂牌机构 股票代码:837906 | EN CN
Java是什么?
Java历史
Java语言特点
C++ VS Java比较
Java工厂设计模式
Java抽象工厂模式
Java单例模式
Java建造者(Builder)模式
Java原型模式
Java适配器模式
Java桥接模式
Java获取网络文件大小
Java套接字到单一的客户端
Java连接套接字
Java URL部分
Java URL连接日期
Java下载网页
Java主机指定IP地址
Java确定本地IP地址
Java检查端口占用
Java查找代理服务器设置
Java创建Socket
Java线程实例
Java检查线程活着
Java如何检查一个线程停止或没有?
Java解决死锁实例
Java如何获取正在运行的线程的优先级?
Java如何监视线程的状态?
Java获取线程名称
Java线程生产者消费者问题
Java如何设置线程的优先级?
Java如何停止线程一会儿?
Java如何暂停线程?
Java获取线程ID
Java如何检查线程的优先级?
Java显示所有正在运行的线程?
Java显示线程状态
Java中断一个线程
Java Applet实例
Java创建Applet
Java使用Applet创建横幅
Java使用Applet显示时钟?
Java在一个Applet创建不同形状
Java如何使用Applet填充形状的颜色?
Java使用Applet跳转到一个链接
Java在Applet创建事件监听器
Java使用Applet显示图像
Java使用Applet在新窗口中打开链接
Java使用Applet播放声音?
Java使用Applet读取文件
Java使用Applet写入文件
Java中Swing应用程序applet
Java简单的图形用户界面-GUI
Java以不同的字体显示文本
Java使用GUI画一条线
Java创建框架-frame
Java使用GUI显示多边形
Java在矩形中显示文本
Java GUI显示不同形状
Java如何绘制GUI实心矩形?
Java创建GUI透明光标
Java检查GUI平滑处理状态
Java在框架中显示颜色
Java GUI显示饼图
Java使用图形用户界面绘制文本
Java编辑表-table
Java 使用prepared语句
Java使用保存点和回滚
Java同时执行数据库多个SQL命令
Java使用行方法
Java使用列方法
Java正则表达式实例
Java将字符串分割
Java搜索重复单词
Java查找出现的单词
Java最后一个词的索引
Java模式匹配
Java删除空格
Java匹配电话号码
Java计数组词
Java搜索词组
Java拆分正则表达式
Java替换第一个出现字符串
Java检查日期格式
Java验证电子邮件地址格式
Java替换所有匹配字符串
Java使每个单词的第一个字母大写
从XML创建SqlSessionFactory实例
不使用XML来创建SqlSessionFactory
从SqlSessionFactory获取SqlSession
映射SQL语句
作用域和生命周期
Mapper XML配置
properties元素
Settings元素
typeAliases 元素
typeHandlers元素
理解CacheLine与写出更好的JAVA
Java核心技术点之动态代理
更好的使用JAVA线程池
理解Java中字符流与字节流的区别
深入分析Java方法反射的实现原理
关于Java面试,你应该准备这些知识点
Java内存模型
2017年你不能错过的Java类库
Leakcanary Square的一款Android/Java内存泄漏检测工具
Java Synchronised机制
Java核心技术点之注解
JVM(8):JVM知识点总览-高级Java工程师面试必备
JVM(3):Java GC算法 垃圾收集器
JVM(1):Java 类的加载机制
解决ActiveMQ中,Java与C++交互中文乱码问题
关于Java Collections的几个常见问题
Java I/O 总结
JVM源码分析之Java对象的创建过程
JVM源码分析之Java类的加载过程
Java GC的那些事(下)
Java GC的那些事(上)
java对象头的HotSpot实现分析
面试的角度诠释Java工程师(一)
面试的角度诠释Java工程师(二)
框架开发之Java注解的妙用
谈谈Java反射机制
Java并发:volatile内存可见性和指令重排
死磕Java并发:Java内存模型之happens-before
死磕Java并发:深入分析volatile的实现原理
死磕Java并发:深入分析synchronized的实现原理
Java 10 可能对 Lambda 表达式进行升级
G1垃圾回收器中的字符串去重(Java 8 Update 20)
Java RESTful框架的性能比较
理解RxJava的线程模型
继续了解Java的纤程库 – Quasar
Java中的纤程库 – Quasar
Java豆瓣电影爬虫——抓取电影详情和电影短评数据
Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
Java Lambda表达式初探
Java中的陷阱题
Java 9的这一基本功能,你可能从未听过
关于Java并发编程的总结和思考
几种简单的负载均衡算法及其Java代码实现
JAVA虚拟机关闭钩子(Shutdown Hook)
Java 脚本化编程指南
Java Scripting API 使用示例
Java 8 的 Nashorn 脚本引擎教程
如何开始使用 Java 机器学习
CognitiveJ —— Java 的图像分析库
Java 性能优化的五大技巧
Java 解惑:Comparable 和 Comparator 的区别
Google Java编程风格指南
java NIO详解
Java 异常处理的误区和经验总结
Java语法糖(4):内部类
Java语法糖(3):泛型
Java语法糖(2):自动装箱和自动拆箱
Java消息队列任务的平滑关闭
Java语法糖(1):可变长度参数以及foreach循环原理
2016最流行的Java EE服务器
自己写一个java.lang.reflect.Proxy代理的实现
java 如何在pdf中生成表格
如何防止单例模式被JAVA反射攻击
java虚拟机 jvm 局部变量表实战
聊聊并发-Java中的Copy-On-Write容器
java.lang.Instrument 代理Agent使用
Java开发者需要了解的移动开发编程语言
13个不容错过的Java项目
2016年7款最佳 Java 框架推荐
Java 开发者值得关注的 11 个技术博客
Redmonk发布Java框架流行度调研结果
Java 8开发的4大顶级技巧
GitHub漫游指南:10个值得你关注的Java项目
除了Guava,Java开发者还值得了解的5个谷歌类库
Java中创建对象的5种不同方法
Java性能优化全攻略
奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?
11个最值得Java开发者收藏的网站
Java的常见误区与细节
对Java意义重大的7个性能指标
Java调优经验谈
关于Java并发编程的总结和思考
HDFS Federation设计动机与基本原理
《Effective STL》学习笔记(第三部分)
《Effective STL》学习笔记(第二部分)
《Effective STL》学习笔记(第一部分)
数据结构之位图
Thrift使用指南
Cassandra概要介绍
Cassandra部署与安装
Cassandra客户端
Cassandra数据模型
Cassandra中的各种策略
数据结构之树状数组
数据结构之伸展树
数据结构之后缀数组
数据结构之堆
浅析MRv1与MRv2的API兼容性
Apache Tez最新进展
运行在YARN上的计算框架
从传统操作系统角度理解Hadoop YARN

面试的角度诠释Java工程师(二)

于2017-05-10由小牛君创建

分享到:


续言:

相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会说它们是一样的?简单思考一下……

程序:程序是由某语言的工程师用一段段代码逻辑连贯出来的,或许当事人是看得懂滴,但是问题是你要让项目经理看得懂啊!要是项目经理都看不懂了,你还指望这个东西能到产品经理手里啊?所以就有了一系列的注释和注解。

文章:写出的字段,首先自己要看得懂吧,其次还得让别人看得懂并且认同你吧。更强大的还是得有文字魅力和吸引力,这点比程序丰富多了(简直把产品经理做的事都做了)。

大家是不是觉得我走题了?这可不是的哟!在第一篇我说了,面试的目的不是让考官知道你怎么样,而是让你自己清楚自己怎么样;在第二篇,我想说的是,在你拥有能力和技术的情况下,懂得怎么在面试官前推销自己。文章和程序亦然,面试又何尝不是呢?(通俗点讲,就是说点面试官能听的懂得话哦)

配图.jpg

三、框架篇

框架基础

反射:反射是Java开发的一类动态相关机制。因为本身Java语言并不是一款动态语言,如果我们想要得到程序动态的效果,因此便引入了反射机制这一概念。

怎么表达反射?

反射—Class类的实例化对象.png

能用反射做什么?
PS:某面试题:Java中创建实例化对象有哪些方式?
①最常见的创建对象方法,使用new语句创建一个对象。
②通过工厂方法返回对象,例:String s =String.valueOf()。(工厂方法涉及到框架)
③动用反射机制创建实例化对象,Class类的三种方法或者通过类类型的newInstance()实例方法。
④调用对象的clone()方法。(俗称克隆方法)
⑤通过I/O留的反序列化手段,调用ObjectInputStream对象的readObject()方法。

注解:日常开发中,注解的使用简化了不少代码,同时也减少了程序员的日常工作量。

Java注解可以细分为JDK注解和第三方注解。其具体使用方法,可以点开链接看哦。

Java注解.png

ORM

认识Hibernate和Mybatis之前,必然要先了解一下什么是ORM?

ORM是三个单词的缩写:Object/Relationship Mapping。翻译过来就是“对象/关系映射”。

为什么要有ORM?
在用面向对象思想编写应用程序的时候,最终都是把对象的信息保存在关系型数据库中,这样我们就需要编写很多与底层数据库相关的SQL语句。显然这样是很不便捷的,ORM框架技术就可以解决这些繁琐的问题。

ORM存在的意义?
彻底抛弃书写SQL语句的思想,完全使用面向对象的思想开发。

为什么要抛弃程序中书写SQL语句的思想?
①不同的数据库使用的SQL语法不同,例:同样一段SQL脚本,能在T-SQL中运行,但不一定能保证可以在PL-SQL中运行。
②同样的功能在不同的数据库有不同的实现方式,例:分页SQL。
③程序过分依赖SQL,对程序的移植、扩展和维护带来很大的麻烦。

Hibernate框架

Hibernate是Java领域内的一款开源的ORM框架技术。

Hibernate的机制原理:
①Hibernate对JDBC进行非常轻量级的封装。
(从本质上而言,最终Hibernate还是通过JDBC来进行对数据库的操作,只不过在JDBC的基础上进行了一定的封装)
②与EBJ(本身是JavaEE的规范,重量级的ORM框架技术)不同,Hibernate属于轻量级的ORM框架技术。
③Hibernate介于数据库层和业务逻辑层之间,起到持久化层的作用。

HQL数据查询基础
检索对象——from子句
选择——select子句
限制——where子句
排序——order by子句

HQL和SQL语句不同,HQL中from子句是必须的,可以没有select子句。

Hibernate的常用属性:

cascade:设置级联关系。
inverse:设置由哪一方维护关联关系。

例:下面的这段代码集合了常用属性以及表与表之间的多对一和一对多关系。

<hibernate-mapping>
    <class name="" table="">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="increment" />
        </id>
        <many-to-one name="" class=""
            fetch="">
            <column name="" />
        </many-to-one>
        ......
        <set name="" inverse="true"  cascade="all" lazy="false">
            <key>
                <column name="" />
            </key>
            <one-to-many class="" />
        </set>
    </class>
</hibernate-mapping>

Struts2框架

Struts是流行和成熟的基于MVC设计模式的Web应用程序框架。

struts2的工作原理及文件结构(请跳转到相应文章)

Struts2动态方法的调用:

Struts2动态方法调用.png

例:
①指定method属性的方法。

<action name="" method="" class="">
<result>/index.jsp</result>
</action>

②感叹号的方式。

<action name="" class="">
<result>/index.jsp</result>
</action>
<constant name="structs.enable.DynamicMethodInvocation" value="true"></constant>

③通配符的方式。

<action name="_*" method="{1}" class="">
<result>/index.jsp</result>
<result>/{1}.jsp</result>
</action>

在使用通配符方式的时候,如果要使用多个method的话,可以再在method="{1}{2}..."里面这样添加,同时需要修改name=""里面的名字+后缀_*_*...,还要配置所需要的<result>/{}.jsp</result>标签

Struts2访问servlet api:

Struts2访问servlet api.png

Struts2拦截器工作原理:

Struts2拦截器.png

思路:
当Struts在执行一个action的时候,会在action执行之前去执行一些拦截器,如果有多个拦截器会依次进行执行。
①首先执行拦截器一,执行拦截器一的处理方法并做一些处理操作。
②如果还有其它的拦截器,将执行拦截器二、拦截器三…进行拦截。
③当所有的拦截器都执行之后,将执行action操作,并调用action中的业务处理方法进行业务的处理。
④调用完之后,会返回一个字符串结果,也就是Result结果集。然后进行视图的匹配。
⑤再将前面执行的拦截器进行反向的再执行一次,最终响应到客户端。

Spring框架

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架和开源框架。

Spring框架的好处:
①从大小和开销两个方面而言Spring都是轻量级的。
②通过控制反转的技术达到松耦合的目的。
③提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑和系统级服务进行内聚性的开发。
④包含并管理应用对象的配置和生命周期,从这个意义上讲它是一种容器。
⑤将简单的组件配置、组合成为复杂的应用,从这个意义上讲它是一种框架。

什么是Spring的IOC?

Spring的IOC.png

思路:
①当业务的对象进入了Spring的容器。
(Your Business Objects)→(The Spring Container)
②然后通过配置的原数据来生产出符合系统需要的对象。
(Configuration Metadata)→(The Spring Container)→(Fully Configured system)
③当要使用这些对象的时候去Spring容器里面直接拿出来用就可以了。

什么是Spring的AOP?
AOP:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
主要功能有:日志记录、性能统计、安全控制、事务处理、异常处理等。

注:
预编译方式:AspectJ。
动态代理方式:JDK动态代理和CGLib动态代理。(也就是SpringAOP和JbossAOP)

Spring的AOP用途:
①提供了声明式的的企业服务,特别是EJB的替代服务的声明。
②允许用户定义自己的方法,以完成OOP和AOP的互补使用。

Spring的事务管理

Spring的事务管理高层抽象主要包括3个接口:

Spring事务管理三个接口.png

TransactionDefinition定义事务传播行为(7种):

TransactionDefinition定义事务传播行为.png

Spring MVC框架

Spring MVC是一种前端控制器的实现形式,它的基本概念分为静态概念 和 动态概念。

静态概念:如图下示。DispatcherServlet就是Spring MVC的前端控制器。
思路:
①当浏览器端用户的请求通过DispatcherServlet进行了分发,到达Cotroller层。
②到达Cotroller层之后,便生产出我们所需要的业务数据Model。
③然后Model层再通过DispatcherServlet进行传递给我们的View层。
④最后完成了最终的页面呈现。

总结:MVC将业务逻辑和页面实现了分离,其核心就是通过DispatcherServlet实现的。

Spring MVC的静态概念.png

动态概念:如图下示。

Spring MVC的基本概念.png

思路:
①当浏览器的请求Request到达DispatcherServlet。(因为DispatcherServlet也是一个Servlet,所有的Request能够被它拦截到)
②然后DispatcherServlet会搜索寻找到一个Mapping,也就是HandlerMaping,并将其功能代理给了HandlerMaping。
③然后HandlerMaping根据本身的配置,找到需要用到的Controller和HandlerInterceptor。
④然后把Controller和HandlerInterceptor制成一个可执行的链条,也就是Handler/HandlerAdapter的适配器。
⑤Handler/HandlerAdapter的适配器将信息返回给了DispatcherServlet,DispatcherServlet便开始调用这个一般化的处理器Handler/HandlerAdapter。
⑥Controller的目的就是生成ModelAndView模型,并且返还给DispatcherServlet。
⑦DispatcherServlet是不会管理视图显示的,所以它就调用ViewResolver视图解析器并通过该方法返回到View对象。(ViewResolver的作用是告诉DispatcherServlet哪个视图是用来解析当前这种场景的)
⑧然后ModelAndView将模型数据传递到View,完成了页面呈现。

Spring MVC拦截器工作流程:

Spring MVC拦截器工作流程.png

Mybatis框架

Mybatis和Hibernate一样,是一款开源的ORM框架的技术。

Mybatis的机制原理:
①Mybatis支持普通的SQL查询、存储过程和高级映射的持久层框架。
②Mybatis将大量的SQL语句从程序里面剖离出来,配置在配置文件中,实现SQL的灵活配置。

OGNL表达式:

Mybatis中的OGNL表达式1.png

Mybatis中的OGNL表达式2.png

Mybatis框架和Hibernate框架比较:
①“全自动化”的Hibernate对数据库结构提供了完整的封装和全套映射机制。
②“半自动化”的Mybatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象。
③Hibernate会自动生成SQL语句,而MyBatis不会在运行期间自动生成SQL语句执行。

四、工具篇

JUnit单元测试

JUnit是一套基于测试驱动开发的测试框架。

注:
JUnit4不需要继承junit.framework.TestCase类。
JUnit3中所有的方法都必须使用@Test注解,并且需要在方法名前加test作为前缀,需要继承junit.framework.TestCase类。

版本管理工具SVN

SVN是一个开放源代码的版本控制系统。

举个例子:
①个人的代码→口袋里的钱
②版本控制工具中的代码→卡里的钱
③版本控制工具中的客户端→卡
④版本控制工具中的服务端→刷卡机

注:在实际版本管理当中,你所写的代码,需要提交给服务端,然后别人要修改你的代码,就会从服务端更新当前目录下的代码,再进行修改和提交。所以,“卡里的钱”可以理解为团队公有的代码体系。

项目管理工具maven

maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

注:
maven也是一套强大的自动化的管理工具,覆盖了编译、测试、运行、清理、打包和部署,整个项目构建的周期。

它还提供了一个仓库的概念,统一的帮助开发人员管理项目所依赖的第三方的架包,最大可能的避免环境配置不同所产生的问题(在你的电脑上能运行,在我的电脑上就不能运行)。