Java Web 相關面試題總結 原

Spring 相關的的面試題

1.什麼是 IoC 容器?

 

2.解釋下 Spring Bean 的生命週期

IoC 容器是 Spring Bean 居住的地方,Spring Bean 僅僅需要  pojo,從下面的幾個步驟來分析 Bean 的生命週期:

尋找 Bean Definition (如 bean.xml)=> set 其 property(包含 

@Autowired(required = false)
public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}

@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
    ...
}

) => setBeanName (包含 Primary 與 Qualifier 註解)=> 使用 JSR-250 @PostConstruct and @PreDestroy 代替 @Bean(initMethod = "init") 和 @Bean(destroyMethod = "cleanup")

 

3.什麼是 BeanFactroy ?與  ApplicationContext 區別 (見 點擊

將 Bean 配置文件包裝爲 實際的代碼

BeanFactory factory = new XmlBeanFactory(new FileInputStream("beans.xml"));

ApplicationContext 包含 BeanFactroy 所有功能,如果沒有特殊需求一般使用 BeanFactory。功能對比:

Feature

BeanFactory

ApplicationContext

Bean instantiation/wiring

Yes

Yes

Integrated lifecycle management

No

Yes

Automatic BeanPostProcessorregistration

No

Yes

Automatic BeanFactoryPostProcessorregistration

No

Yes

Convenient MessageSource access (for internalization)

No

Yes

Built-in ApplicationEvent publication mechanism

No

Yes

 

4.  singleton 與 prototype 的不同

使用 @Scope("prototype") ,對應着 一個  bean definition  可能對應很多 實例。

 

5. Bean 的實例化方法有哪些?

在@Bean 註解下,你可以直接 new 構造方法 、調用靜態工廠方法 或 使用工廠類的工廠方法進行實例化。

 

6. DispatcherServlet 在 Spring Mvc 中扮演的角色

 

7.AOP 是什麼?解釋下 Advice、joint Point and point cut

用於橫切性質的功能,比如日誌與事務管理

join point-->  織入 Advice 候選的點,Spring AOP 中 則可以認爲所有方法執行點都是 join point

point cut-->  聲明從哪些方法織如。使用切點表達式限定 join point 作用的範圍。

advice-->  聲明織入代碼的 時機,Before、After、After-returning、After-throwing 與 Around 五種通知

 

8.setter 注入 and 構造注入 的區別?

構造注入需要記住構造參數的 type和 order,常用於注入強制性的依賴,而 setter 用於注入可選依賴。

 

9.Spring 容器中 BeanDefinition 爲什麼要有 class 屬性?

作用有兩個:

通過反射調用其構造方法創建 Bean(默認情況)

通過調用其靜態工廠方法創建 Bean

容器中有很多 BeanDefinition ,每個 BeanDefinition 包含了一些的元數據:

  • 實現類的全限定類名,
  • bean 的行爲(scope,生命週期等)
  • 對另一個 bean的 引用
  • 其他的一些設置信息,比如連接池中活躍的連接數及連接池的大小限制。

 

Servlet 相關的面試題

1.見如下 web.xml配置(

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

),請問 <load-on-startup>1</load-on-startup> 的作用是什麼?

答案:標記容器是否在啓動的時候就加載這個servlet。當值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet;當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。正數的值越小,啓動該servlet的優先級越高。

 

2.介紹下 servlet 的生命週期

servlet 被其容器所控制。 當一個請求映射到 a servlet 時,容器會執行如下的步驟:

 

1) 如果 servlet 實例不存在, web 容器將

  • Loads the servlet class.
  • Creates an instance of the servlet class.
  • Initializes the servlet instance by calling the init method. Initialization is covered in Creating and Initializing a Servlet.

2) 調用 service method, 傳遞 request and response objects 參數

3) 如果需要移除 servlet, the container 通過調用它的 destroy 方法來終結這個 servlet。

* 注意,servlet 只能通過 servlet 容器初始化,因爲 servlet 初始化需要相關配置信息被容器所加載。

 

3.可以獲取在另一箇中的 servlet context  中的信息嗎?

可以。比如可以在另一個 servlet 使用相關名字獲取相應信息:

Context.setAttribute (“name”,” value”)
Context.getAttribute (“name”)

 

4.servlet 之間如何協作?

服務端通過 session 與 application 共享

  • RequestDispatchers include () and forward() method .
  • Using sendRedirect()method of Response object.
  • Using servlet Context methods

 

5. ServletConfig 與 ServletContext 的區別?

前者是 Servlet 級,後者是 Application 級。等同於 Root WebApplicationContext 與 Servlet WebApplicationContext 的關係。

 

6.forward、include 與 redirect 區別

include 在原頁面增加內容,forward 不完全跳轉(頁面內容改變,但頁面地址不變),redirect 完全跳轉(地址和頁面完全發生改變)。另一個區別(

response.sendRedirect("jump.jsp");

request.getRequestDispatcher("jump.jsp").forward(request,response);

)forward 是直接在服務器(該請求必須在本 server 上)中進行處理,將處理完後的信息發送給瀏覽器進行顯示,所以完成後在url中顯示的是跳轉前的頁面。在forward的時候將上一頁面中傳送的request和response信息一同發送給下一頁面。在 servlet 3.1 後可以使用 addFlashAttribute 實現相似的功能(大概底層使用 session進行處理)。

 

JDBC 相關的面試題

1. 什麼是 jdbc?

連接數據庫的程序接口規範 api

 

2.創建一個  jdbc 連接的主要步驟有哪些?

Load driver(

Class.forName("com.mysql.jdbc.Driver");

)  -->  獲取連接 --> 創建 Statement 對象 -->  執行 sql --> 獲取結果集 --> 關閉連接

 

3.Java 中,Statement 分爲哪幾種類型?

普通的 statement,沒有sql 參數

Statement   stmt = conn.createStatement( );
ResultSet rs = stmt.executeQuery(sql);  

PreparedStatement(查詢複用並且可以添加 sql參數)

String SQL = "Update stock SET limit = ? WHERE stockType = ?";
PreparedStatement  pstmt = conn.prepareStatement(SQL);
ResultSet rs = pstmt.executeQuery();

CallableStatement (用於訪問存儲過程,可接受運行時參數)

CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}"); 
ResultSet rs = cs.executeQuery();

 

4.冷拷貝 與 熱拷貝 的區別?

前者在數據庫關閉的情況下,備份其相關文件。或者是在數據庫開啓的情況下,備份數據庫操作的sql語句(不能出錯,否則恢復出錯)。 

 

5.數據庫中的髒讀是什麼?

在另一個事務 commit 或 rollback 之前讀數據,導致數據出錯的情況。

 

6.什麼是兩階段提交?(2pc,與併發中的 2pl 不是一個概念)

假設:該分佈式系統中,存在一個節點作爲協調者(Coordinator),其他節點作爲參與者(Cohorts)。且節點之間可以進行網絡通信。

第一階段,提交請求階段:協調者發起投票

第二階段,提交執行階段:如果所有投票是 yes,則執行

 

7. MySQL 加鎖處理分析(原文

 

RESTful Web Services 相關的面試題

1.什麼是 rest 與 restful web service?

REST 全稱 REpresentational State Transfer (具象狀態傳輸),讓無狀態的 web 服務,變成一個可訪問的資源並通過 http協議進行識別。而 soap 類的 web服務則通過 WSDL 進行識別。

 

2. restful 與 soap 有什麼不同?

雖然它們都是跨平臺的,但是有顯著的差異:

REST 更輕量級,使用 http協議(可以用 text、xml、json),soap 只支持 xml;

SOAP意味着所有調用的URL都是相同的,只有Java方法的參數不同。 REST意味着URL反映要完成的操作。

 

3.restful 支持哪些 http 方法?

post 創建 get 查看 patch 局部更新 put 更新 delete 刪除

 

4.自上而下的Web服務和自下而上的Web服務有什麼區別?

自上向下意味着您從一個WSDL開始,然後在Java中創建所有必要的腳手架。自下向上意味着您從Java方法開始,並從中生成WSDL。

 

5.restful 怎麼保證線程安全?

通過線程池實現每個請求都單獨一個線程,有可能出現線程安全問題。spring 中的線程安全問題 

* 注意:spring web 中,默認Controller、Dao、Service 都是單例的。並且並沒有設計線程安全的單例模式(雖然線程安全的單例可以有很多實現方法)

 

Mybatis 相關面試題

1.什麼是 mybatis?

自定義 SQL、存儲過程以及高級映射的 java 持久層框架

 

2.JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?

① 數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。

解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。


② Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。

解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。


③ 向sql語句傳參數麻煩,因爲sql語句的where條件不一定,可能多也可能少,佔位符需要和參數一一對應。

解決: Mybatis自動將java對象映射至sql語句。


④ 對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。

解決:Mybatis自動將sql執行結果映射至java對象。

 

3.MyBatis編程步驟是什麼樣的?

① 創建SqlSessionFactory 
② 通過SqlSessionFactory創建SqlSession 
③ 通過sqlsession執行數據庫操作 
④ 調用session.commit()提交事務 
⑤ 調用session.close()關閉會話

 

4.使用MyBatis的mapper接口調用時有哪些要求?

①  Mapper接口方法名和mapper.xml中定義的每個sql的id相同 
②  Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同 
③  Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同 
④  Mapper.xml文件中的namespace即是mapper接口的類路徑。

 

5.簡單介紹下 mybatis 緩存

分爲一級緩存、二級緩存。一級緩存放在 SqlSession 中,爲查詢緩存。二級緩存是mapper範圍級別(或者說是 namespace 級別)。mybatis無法實現分佈式緩存,需要和其它分佈式緩存框架進行整合。注意避免開啓緩存導致的髒讀。深入理解請閱讀相關文檔

 

6.Mapper編寫有哪幾種方式?

①接口實現類繼承SqlSessionDaoSupport

②使用org.mybatis.spring.mapper.MapperFactoryBean

③使用mapper掃描器

 

7.mybatis 如何分頁?分頁插件原理是什麼?

使用RowBounds 對象進行分頁,是內存分頁。可以使用分頁插件分頁。

原理是通過攔截 sql語句,重寫 sql。比如

select * from student => select t.* from (select * from student)t limit 0,10

 

8.mybatis 中${} 與 #{} 的區別是什麼?動態 sql 是做什麼的?

前者爲拼接字符串,後者爲預編譯。以 xml 標籤的形式,拼接 sql。

 

9.Mapper的 Xml映射文件,id是否可以重複?mapper方法是否可以重載?Dao 接口的工作原理是什麼?

id 可以重複, mapper方法不能重載。原因 Map<String, MappedStatement>的key使用是 namespace+id,value 是接口方法,因此無法綁定重載接口。

Dao接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理爲Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行MappedStatement所代表的sql,然後將sql執行結果返回。

 

10. mybatis 中 如何傳遞多個參數?

1)直接在方法中傳遞參數,xml文件用#{0} #{1}來獲取

2)使用 @param 註解:這樣可以直接在xml文件中通過#{name}來獲取

3)使用 map 作爲參數,進行裝載

try{
    //映射文件的命名空間.SQL片段的ID,就可以調用對應的映射文件中的SQL


    /**
     * 由於我們的參數超過了兩個,而方法中只有一個Object參數收集
     * 因此我們使用Map集合來裝載我們的參數
     */
    Map<String, Object> map = new HashMap();
    map.put("start", start);
    map.put("end", end);
    return sqlSession.selectList("StudentID.pagination", map);
}catch(Exception e){
    e.printStackTrace();
    sqlSession.rollback();
    throw e;
}finally{
    MybatisUtil.closeSqlSession();
}

對應的 xml 文件


<!--分頁查詢-->
<select id="pagination" parameterType="map" resultMap="studentMap">

    /*根據key自動找到對應Map集合的value*/
    select * from students limit #{start},#{end};

</select>

 

11.mybatis 中 mapper 接口綁定有幾種實現方式,分別是怎麼實現的?

有兩種,一是通過註解綁定 @Select @Update 等,二是通過 xml 綁定,需指定 namespace 爲 mapper 接口名。當Sql語句比較簡單時候,用註解綁定;當SQL語句比較複雜時候,用xml綁定,一般用xml綁定的比較多

 

12.爲什麼說 mybatis 是半自動 orm,它與 hibernae 區別是什麼?
都是持久層框架,但 mybatis 不是完全 orm的,它可以靈活手動編寫 sql,將結果集映射成目標對象 Bean。針對多表查詢(查詢關聯對象與關聯集合對象)時,無法根據對象依賴關係進行映射。


13.Mybatis是否可以映射Enum枚舉類?

Mybatis可以映射枚舉類,不單可以映射枚舉類,Mybatis可以映射任何對象到表的一列上。映射方式爲自定義一個TypeHandler,實現TypeHandler的setParameter()和getResult()接口方法。TypeHandler有兩個作用,一是完成從javaType至jdbcType的轉換,二是完成jdbcType至javaType的轉換,體現爲setParameter()和getResult()兩個方法,分別代表設置sql問號佔位符參數和獲取列查詢結果。

 

14.Mybatis都有哪些Executor執行器?它們之間的區別是什麼?

Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。

1)SimpleExecutor:每執行一次update或select,就開啓一個Statement對象,用完立刻關閉Statement對象。

2)ReuseExecutor:執行update或select,以sql作爲key查找Statement對象,存在就使用,不存在就創建,用完後,不關閉Statement對象,而是放置於Map

3)BatchExecutor:完成批處理。

 

15.Mybatis映射文件中,如果A標籤通過include引用了B標籤的內容,請問,B標籤能否定義在A標籤的後面,還是說必須定義在A標籤的前面?

雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標籤依然可以定義在任何地方,Mybatis都可以正確識別。原理是,Mybatis解析A標籤,發現A標籤引用了B標籤,但是B標籤尚未解析到,尚不存在,此時,Mybatis會將A標籤標記爲未解析狀態,然後繼續解析餘下的標籤,包含B標籤,待所有標籤解析完畢,Mybatis會重新解析那些被標記爲未解析的標籤,此時再解析A標籤時,B標籤已經存在,A標籤也就可以正常解析完成了。

 

16.Mybatis中插入數據的主鍵生成解決方案有哪些?

有自增主鍵,使用 useGeneratedKeys="true" 屬性:

<insert id="insertUser" parameterType="model.User"
useGeneratedKeys=”true” keyProperty=”id”>
insert into user (account,username,password)
values (#{account},#{username},#{password})
</insert>

* 還可以使用註解 

@Insert("INSERT INTO table_name(p1,p2) VALUES(a,b)
@Options(useGeneratedKeys = true,keyProperty = "id")

 

或針對 oracle 無自增主鍵,使用 </SelectKey> 標籤,

<insert id="insertUser" parameterType="model.User">
	<selectKey keyProperty="id" resultType="int" order="BEFORE">
		select idseq.nextVal from dual
	</selectKey>
	insert into User
	(id, account,username, password) values
	(#{id}, #{account},#{username}, #{password})
</insert>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章