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

续言:

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

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

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

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

配图.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也是一套强大的自动化的管理工具,覆盖了编译、测试、运行、清理、打包和部署,整个项目构建的周期。

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



相关文章

发表评论

Comment form

(*) 表示必填项

还没有评论。

跳到底部
返回顶部