Java工程师面试框架篇(三)

    |     2017年2月15日   |   Java面试题   |     0 条评论   |    1653

框架篇面试通常从 反射 / 注解 打底,再问 ORM、Hibernate、Struts2、Spring IOC/AOP、Spring MVC 和 MyBatis。下面按这个顺序把原图和配置示例留下来,方便对着图回忆调用链。

20140731144525904006

一、框架基础:反射与注解

Java 本身不是动态语言,要「运行时才决定用哪个类、哪个方法」,靠的是反射。细节可看 反射笔记。

创建对象的常见路子(面试常问):

  • new 语句。
  • 工厂方法,例如 String.valueOf()。
  • 反射:Class 的三种拿法,或 newInstance()。
  • clone()。
  • 反序列化:ObjectInputStream.readObject()。

注解能少写不少样板。JDK 自带和第三方都有,用法见 注解笔记。

二、ORM 与 Hibernate

ORM 是 Object/Relationship Mapping。面向对象写出来的对象,最终要进关系库;若每处手写 SQL,换库、分页、移植都疼。ORM 想让你尽量用对象思维,少把 SQL 散落在业务里。

  • 不同库 SQL 方言不一样(T-SQL 能跑的,PL-SQL 未必能)。
  • 同一功能实现不同,分页就是典型。
  • 程序绑死 SQL,扩展和维护都难。

Hibernate 是 Java 里开源的 ORM:对 JDBC 做轻量封装,最终仍走 JDBC;相对 EJB 那种重量级规范,它更轻,夹在数据库和业务之间当持久层。

HQL 里 from 是必须的,可以没有 select。常用属性: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 框架。工作原理和目录结构见 这篇。

动态方法调用

① 指定 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>

③ 通配符:多个 method 时 method="{1}{2}...",同时改 name 为 _*_*...,并配好 <result>。

<action name="_*" method="{1}" class="">

<result>/index.jsp</result>

<result>/{1}.jsp</result>

</action>

访问 Servlet API:

拦截器:执行 Action 前先跑拦截器,多个就按顺序;全部过完才进业务;返回 Result 匹配视图后,拦截器再反向走一遍,最后响应客户端。

四、Spring:IOC、AOP 与事务

Spring 是轻量级 IOC + AOP 容器:体积和开销都小,用控制反转松耦合,用切面把日志、事务、安全从业务里拆出去,并管对象的配置和生命周期。

  • 业务对象进容器。
  • 按配置元数据生产系统需要的对象。
  • 用的时候直接从容器拿。

AOP 靠预编译(AspectJ)或运行期动态代理(JDK / CGLib,也就是 Spring AOP、JBoss AOP)做统一维护:日志、性能、安全、事务、异常。

五、Spring MVC

Spring MVC 是前端控制器形态。静态概念:请求经 DispatcherServlet 分到 Controller,产出 Model,再经 DispatcherServlet 交给 View。

动态概念:DispatcherServlet 本身是 Servlet,拦住 Request → HandlerMapping 找出 Controller 和拦截器 → 打成 HandlerAdapter 链条 → Controller 返回 ModelAndView → ViewResolver 解析出 View → 模型进视图完成渲染。

拦截器工作流:

六、MyBatis 与 OGNL

MyBatis 同样是开源 ORM,但偏「半自动」:支持普通 SQL、存储过程、高级映射,把大量 SQL 抽到配置文件里灵活改。

对比 Hibernate MyBatis
自动化 全自动,封装库结构、全套映射 半自动,面对的是纯粹 Java 对象
SQL 运行期自动生成 不自动生成,SQL 写在配置里

一句话总结:框架面试先问反射/注解怎么撑起动态和少样板,再问 ORM 为什么要存在;Hibernate 全自动生成 SQL,MyBatis 半自动把 SQL 外置;Struts2 拦截器夹 Action,Spring 用 IOC 装对象、AOP 横切、MVC 靠 DispatcherServlet 把请求拆成 Handler 和视图。

转载请注明来源:Java工程师面试框架篇(三)
本文链接地址:https://ai.zhousir.top/?p=1924
回复 取消