日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSM面试题

發布時間:2023/12/10 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSM面试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

框架面試題

一、Mybatis

1、談談你對框架的理解,框架有什么好處?

1、啥是框架框架就是一個架子,表演節目,舞臺已經搭建好,表演什么節目,看自己的需求了。框架是一個半成品,對于Java語言來說,框架就是封裝了別人的代碼。在框架的基礎上我們在進一步開發,拿來主義。(你想啊,在二階段我們都手動去用request.getParameter()獲取參數、在dao手動去寫sql,不管啥業務,這些東西都是一樣的,框架就將這些給你封裝好啦) 2、解決的問題解決的是技術整合問題。軟件開發環境和規模都很大,不可能任何一個項目的代碼都從零開始,此時就需要一個非常優秀的框架把基礎技術整合完畢,我們在他的基礎上進一步開發。提高性能,易擴展,易維護,最終提高整個團隊的開發效率 3、怎么用框架呢?(1) 導入相關坐標(jar包)(2) 框架運行細節定義,編寫配置文件(每個框架都有自己的配置文件呀)(3) 調用框架中的API

2、Mybatis框架的好處

1、原先使用jdbc時每次CRUD都要寫那六大步驟,太冗余了吧 而且:(1)頻繁連接,釋放數據庫資源,降低系統性能(2)SQL語句硬編碼,難以維護(sql都寫到.java里了)(3)參數和占位符對應問題(4)結果集解析復雜,列名硬編碼 2、mybatis框架是一個very優秀的持久層(dao)框架,對JDBC進行了封裝,使得開發者只需要關注Sql語句(業務)本身即可,無需開發者處理加載驅動、獲取連接、創建Statement等繁瑣的過程。實現了ORM思想

3、如何理解ORM思想呢?

對象關系映射

將數據庫中的關系數據表映射為JAVA中的對象,把對數據表的操作轉換為對對象的操作,實現面向對象編程。因此ORM的目的是使得開發人員以面向對象的思想來操作數據庫。Mybatis框架是一個半自動的ORM持久層框架,也可以在Java中實現類似 insert(User)的操作最終操作數據庫,但是需要我們自己寫Sql語句。Mybatis是目前比較流行的Dao層框架。

4、Mybatis的編程步驟

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FzpbauxZ-1639100484220)(img/2.png)]

//1、加載核心配置文件 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //2、創建構建器 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3、構建SqlSession工廠 SqlSessionFactory sqlSessionFactory = builder.build(inputStream); //4、生產SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //5、執行業務User user = sqlSession.selectOne("test.queryUserById",2);System.out.println(user); //6、釋放資源sqlSession.close();

5、#{} 和 ${} 的區別

1. #{}是預編譯處理,${}是字符串替換。2. Mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;3. Mybatis在處理${}時,就是把${}替換成變量的值,相當于字符串拼接4. 使用#{}可以有效的防止SQL注入,提高系統安全性。

6、動態代理開發方式的好處以及規范是什么

定義一個Mapper接口,這個接口其實和我們UserDao接口是一樣的,從Mybatis框架中拿到一個代理對象(代理的是這個Mapper接口),通過代理對象調用接口當中的方法完成業務。四大規范: 1、sql映射文件的namespace必須和mapper接口的全限定類名保持一致 2、mapper接口的接口方法名必須和xml中的sql語句id保持一致 3、mapper接口的接口方法形參類型必須和sql語句的輸入參數類型保持一致 4、mapper接口的接口方法返回類型必須和sql語句的resultType保持一致

7、mybatis的配置文件有哪些?作用是啥

  • SqlMapperConfig.xml

    主配置文件

1、enviroments配置數據源環境:數據源、事務管理器的配置 2、全局typeAliases配置:別名配置 3、mappers:加載指定的配置文件<mappers><mapper resource="mapper/UserMapper.xml" /><mapper class="com.ujiuye.mapper.UserMapper"></mapper><package name="com.ujiuye.mapper"></package></mappers>
  • 寫sql的配置文件

    比如:<select>、<update>、<insert>、<delete>

8、MyBatis應用動態SQL解決了什么問題?

有時候,固定的sql語句不能夠滿足我們的應用需求。這個時候需要在 標準的基礎上建立動態的查詢語句。 Mybatis提供了多種注解,可以提供動態查詢語言。比如說在開發的時候,遇到這樣的場景,界面提供了多種查詢,但是都是非必填寫,在選擇查詢條件時可以選中任意幾種組合作為查詢條件,如果在使用jdbc的時候,需要判斷參數為空,自己組裝sql,但是mybatis提供動態sql機制,依靠標簽。應用場景:比如模塊的多條件查詢時

9、Mybatis的緩存

緩存作用:提升查詢效率

1.mybatis 一級緩存是 SqlSession 級別的緩存,默認支持一級緩存,不需要在配置文件去配 置。 2.mybaits 的二級緩存是 mapper 范圍級別,除了在 SqlMapConfig.xml 設置二級緩存的總開關 <settingname='cacheEnabled'value='true'/>,還要在具體的 mapper.xml 中開啟二級緩存:<mappernamespace='cn.hpu.mybatis.mapper.UserMapper'>

10、Mybatis如何處理多對多關系?舉一個多對多的例子

比如說學生表和課程表,一個學生可以選擇多門課程, 一門課程都能被多個學生選擇,這 樣兩張表的關系就是多對多的關系, 怎么處理多對多的情況? 遇到這種情況我們得創建一 張中間的橋表,關聯后就是 課程表對橋表就是一對多,學生表對橋表也是一對多,就可以了

11、Mybatis是否支持延遲加載?如果支持,它的實現原理是什么?

(1)Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。(2)它的原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。

12、Mybatis是如何將sql執行結果封裝為目標對象并返回的?都有哪些映射形式?

第一種是使用<resultMap>標簽,逐一定義列名和對象屬性名之間的映射關系。第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。

13、Mybatis都有哪些Executor執行器?它們之間的區別是什么?

Mybatis有三種基本的Executor執行器,SimpleExecutor、ReuseExecutor、BatchExecutor。 1.SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。 2.ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置于Map<String, Statement>內,供下一次使用。簡言之,就是重復使用Statement對象。 3.BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。 作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內。

二、Spring

1、你覺得Spring框架有什么優勢?

  • 方便解耦,簡化開發

    通過 Spring 提供的 IoC 容器,可以將對象間的依賴關系交由 Spring 進行控制,避免硬編碼所造成的過度程序耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應用。 UserService{//硬編碼private UserDao userDao = new UserDaoImpl(); }
  • AOP編程的支持

通過 Spring 的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統 OOP 實現的功能可以通過 AOP 輕松應付
  • 聲明式事務的支持

    可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務的管理,提高開發效率和質量。
  • 方便程序的測試

可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可做的事情。
  • 方便集成各種優秀框架
Spring 可以降低各種框架的使用難度,提供了對各種優秀框架( Struts、 Hibernate、 Hessian、 Quartz 等)的直接支持。
  • 降低 JavaEE API 的使用難度
Spring 對 JavaEE API(如 JDBC、 JavaMail、遠程調用等)進行了薄薄的封裝層,使這些 API 的使用難度大為降低。
  • Java 源碼是經典學習范例
Spring 的源代碼設計精妙、結構清晰、匠心獨用,處處體現著大師對 Java 設計模式靈活運用以及對 Java 技術的高深造詣。它的源代碼無意是 Java 技術的最佳實踐的范例。

2、如何理解Spring的IOC思想

1、想了解IOC,先看下該概念 解耦合 軟件設計原則:高內聚,低耦合 內聚:一個模塊內各個元素彼此結合的緊密程度,描述的是模塊內的功能聯系 耦合:是軟件結構中各模塊之間相互連接的一種度量 簡而言之:高內聚,低耦合,其實就是同一個模塊內的各個元素之間要高度緊密,但是各個模塊之間的相互依存度卻不要那么緊密 2、IOC 全稱是Inversion Of Control,意為控制反轉,不是一個技術,而是一種思想 其作用是用于削減代碼間的耦合。它的實現思想就是利用了工廠設計模式,把創建對象代碼從具體類中剝離出去,交由工廠來完成,從而降低代碼間的依賴關系。作用:它是用于降低我們代碼間的依賴關系,削減程序中的耦合。

3、如何理解Spring中的依賴注入(DI)

1、什么是依賴注入就是讓spring框架給Bean對象的屬性進行賦值. 它是 spring 框架核心 ioc 的具體實現我們的程序在編寫時, 通過控制反轉,把對象的創建交給了 spring,但是代碼中不可能出現沒有依賴的情況。ioc 解耦只是降低他們的依賴關系,但不會消除。 例如:我們的業務層仍會調用持久層的方法。那這種業務層和持久層的依賴關系, 在使用 spring 之后, 就讓 spring 來維護了。簡單的說,依賴注入(DI)就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取 2、依賴注入的幾種方式 (1)使用構造函數方式注入 (2)使用set方法方式注入 p名稱空間 (3)靜態工廠的方法注入 (4)實例工廠的方法注入

4、Spring框架的常用注解有哪些?

1、@Component :將普通pojo實例化到spring容器中,相當于配置文件中的 <bean id="" class=""> 以及三個衍生注解@Controller:控制器層用@Service:服務層用@Repository:dao層用 2、依賴注入注解@Autowired注解:按類型注入@Qualifier("id") 注解 按照id注入@Resource注解 3、@Configuration標識當前類是Spring的一個配置類@ComponentScan替代xml中的`<context:component-scan/>`@Import引入其他配置類,被引入的配置類可以不加@Configuration注解 @PropertySource:引入外部properties文件,注意加classpath: @Value對成員變量賦值 @Bean將一個方法的返回值對象加入到Spring的容器當中管理 @Qualifier可以使用在方法參數上,表明對應的形參引入/注入的對象類型

5、你們公司使用SSM框架采用的注解方式還是XML方式開發?

企業主流的開發方式:半注解半xml開發

往往第三方jar中的對象我們使用xml配置(比如druid數據庫連接池、Mybatis的SQLSessionFactory),類似于service層和dao層的實現類,這屬于我們自己寫的代碼,往往會使用注解,這就是半xml半注解的模式

6、你對Spring的AOP如何理解?

1、AOP:面向切面編程它是一種編程思想,一種設計理念,是OOP的一種延續。運用AOP編程思想,可以提高代碼的可重用性,使編碼更加簡潔,更易于維護。簡單的說它就是把我們程序重復的代碼抽取出來,在需要執行的時候,使用動態代理的技術,在不修改源碼的基礎上,對我們的已有方法進行增強。 2、應用場景:事務和日志、統計方法執行效率

7、簡述一下Spring支持的事物管理有哪些?

1.聲明式事務管理:設置配置文件與先前比照簡化了許多。我們把這類設置配置文件格式稱為 Spring 經典的聲明式事務治理。 2.編程式事務管理:為了不損壞代碼原有的條理性,避免出現每一個方法中都包括相同的啟動事物、提交、回滾事物樣板代碼的現象,spring 提供了 transactionTemplate 模板來實現編程式事務管理。這種方式意味著你可以將事務管理和業務代碼分離。你只需要通過注解或者XML配置管理事務。 3.區別(1)編程式事務是自己寫事務處理的類,然后調用。(2)聲明式事務是在配置文件中配置,一般搭配在框架里面使用。

8、事物的四大特性有哪些(ACID)?

1.原子性:事務是最小的執行單位,不允許分割。事務的原子性確保動作要么全部完成,要么完全不起作用; 2.一致性:執行事務前后,數據保持一致,多個事務對同一個數據讀取的結果是相同的; 3.隔離性:并發訪問數據庫時,一個用戶的事務不被其他事務所干擾,各并發事務之間數據庫是獨立的; 4.持久性:一個事務被提交之后。它對數據庫中數據的改變是持久的,即使數據庫發生故障也不應該對其有任何影響。

9、Spring的事物管理機制實現原理?

Spring的事務管理機制實現的原理,就是通過這樣一個動態代理對所有需要事務管理的Bean進行加載,并根據配置在invoke方法中對當前調用的 方法名進行判定,并在method.invoke方法前后為其加上合適的事務管理代碼,這樣就實現了Spring式的事務管理。Spring中的AOP實 現更為復雜和靈活,不過基本原理是一致的。

10、請解釋Spring Bean的生命周期?

1.Spring Bean的生命周期簡單易懂。在一個bean實例被初始化時,需要執行一系列的初始化操作以達到可用的狀態。同樣,當一個bean不在被調用時需要進行相關的析構操作,并從bean容器中移除。 2.Spring bean factory 負責管理在spring容器中被創建的bean的生命周期。Bean的生命周期由兩組回調(call back)方法組成。 初始化之后調用的回調方法。 銷毀之前調用的回調方法。 Spring框架提供了以下四種方式來管理bean的生命周期事件:(1)InitializingBean和DisposableBean回調接口(2)針對特殊行為的其他Aware接口(3)Bean配置文件中的Custom init()方法和destroy()方法w(4)@PostConstruct和@PreDestroy注解方式實例化 Instantiation 屬性賦值 Populate 初始化 Initialization 銷毀 Destruction

11、Spring 中@Autowired 和@Resource 的區別

1.@Autowired 默認的是按照類型進行注入, 如果沒有類型會按照名稱進行注入. 如果想直接按照名稱注入需要加入@Qualifier("gatheringDao") @Autowired @Qualifier("gatheringDao") private GatheringDao gatheringDao; 2.@Resource 默認的會按照名稱注入,名稱找不著會按照類型來找,如果這里寫了名稱,就直接 按照名稱找了不會按類型找@Resource(name = "aaa") @Resource private GatheringDao gatheringDao;

12、Spring 中用到了那些設計模式?

Spring框架中使用到了大量的設計模式,下面列舉了比較有代表性的: 1.代理模式—在AOP和remoting中被用的比較多。 2.單例模式—在spring配置文件中定義的bean默認為單例模式。 3.模板方法—用來解決代碼重復的問題。比如. RestTemplate, JmsTemplate, JpaTemplate。 4.工廠模式—BeanFactory用來創建對象的實例。 適配器–spring aop 裝飾器–spring data hashmapper 觀察者– spring 時間驅動模型 回調–Spring ResourceLoaderAware回調接口

13、Spring 如何保證 Controller 并發的安全

Spring 多線程請求過來調用的Controller對象都是一個,而不是一個請求過來就創建一個Controller對象。并發的安全? 原因就在于Controller對象是單例的,那么如果不小心在類中定義了類變量,那么這個類變量是被所有請求共享的,這可能會造成多個請求修改該變量的值,出現與預期結果不符合的異常那有沒有辦法讓Controller不以單例而以每次請求都重新創建的形式存在呢?答案是當然可以,只需要在類上添加注解@Scope(“prototype”)即可,這樣每次請求調用的類都是重新生成的(每次生成會影響效率)雖然這樣可以解決問題,但增加了時間成本,總讓人不爽,還有其他方法么?答案是肯定的!使用ThreadLocal來保存類變量,將類變量保存在線程的變量域中,讓不同的請求隔離開來

14、什么是基于Java的Spring注解配置? 給一些注解的例子?

基于Java的配置,允許你在少量的Java注解的幫助下,進行你的大部分Spring配置而非通過XML文件。以@Configuration 注解為例,它用來標記類可以當做一個bean的定義,被Spring IOC容器使用。另一個例子是@Bean注解,它表示此方法將要返回一個對象,作為一個bean注冊進Spring應用上下文。

15、Spring如何解決循環依賴問題

spring提供的兩種注入方式,構造注入和setter,那其實構造注入時如果發現循環依賴會直接初始化容器失敗,setter注入是采用三級緩存,發現循環依賴會有一個半初始化狀態進行流轉。 1.架構問題,優先架構重構 2.@lazy懶加載 3.不用構造器注入改用set,Spring已經幫忙解決

16、Spring如何處理線程并發問題?

在一般情況下,只有無狀態的Bean才可以在多線程環境下共享,在Spring中,絕大部分Bean都可以聲明為singleton作用域,因為Spring對一些Bean中非線程安全狀態采用ThreadLocal進行處理,解決線程安全問題。ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。同步機制采用了“時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而ThreadLocal采用了“空間換時間”的方式。ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。

三、SpringMvc

1、簡單描述一下你對SpringMVC的理解

SpringMVC是一個輕量級的Web表現層框架,用來寫Controller接收請求跳轉頁面的,它是Spring框架的一部分。SpringMVC是對Servlet的封裝和增強,簡化了servlet的操作。它已經超越了Struts2,成為目前最優秀的表現層框架。 1、本質web表現層的一個框架,主要用來接收請求、轉發請求、跳轉頁面 2、優勢操作特簡單,性能特別高,靈活性特別強

2、描述springmvc的處理流程吧

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8Nh8YjAr-1639100484225)(img/1.png)]

- 第一步:用戶發送請求至前端控制器DispatcherServlet - 第二步:DispatcherServlet收到請求調用HandlerMapping處理器映射器 - 第三步:處理器映射器根據請求Url找到,具體的Handler(后端控制器),生成處理器對象及處理器攔截器(如果有則生成)一并返回DispatcherServlet - 第四步:DispatcherServlet調用HandlerAdapter處理器適配器去調用Handler - 第五步:處理器適配器執行Handler - 第六步:Handler執行完成給處理器適配器返回ModelAndView - 第七步:處理器適配器向前端控制器返回 ModelAndView,ModelAndView 是SpringMVC 框架的一個底層對象,包括 Model 和 View - 第八步:前端控制器請求視圖解析器去進行視圖解析,根據邏輯視圖名來解析真正的視圖。 - 第九步:視圖解析器向前端控制器返回View - 第十步:前端控制器進行視圖渲染,就是將模型數據(在 ModelAndView 對象中)填充到 request 域 - 第十一步:前端控制器向用戶響應結果

3、介紹一下SpringMvc中的組件以及作用

1、DispatcherServlet:前端控制器接收用戶請求,響應結果,相當于中央處理器,DispatcherServlet是整個流程控制的中心,由它調用其它組件完成用戶請求的處理。DispatcherServlet的存在降低了組件之間的耦合性 2、HandlerMapping:處理器映射器理解為一個Map<url,Hanlder>,HandlerMapping負責根據用戶請求的Url找到Handler即處理器,SpringMVC提供了不同的映射器來實現不同的映射方式,例如:實現接口方式,注解方式等。 3、Handler:處理器在SpringMVC當中有兩層意思:Controller或者Controller當中的方法,Handler相對于前端控制器DispatcherServlet來說是后端控制器,執行具體業務處理的,它在DispatcherServlet的控制下處理用戶的具體請求。 4、HandlAdapter:處理器適配器不同的接口類型轉換成usb,體現了萬物歸一的思想,通過HandlerAdapter對Handler處理器進行執行,這是適配器模式的應用 5、ViewResolver:視圖解析器ViewResolver進行視圖解析,首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象。

4、SpringMVC 的 controller 里可不可以寫成員變量?

可以寫啊,注入的 service 不就是成員變量么,你是不想問 struts2 里的獲取參數的方式啊? Struts2 早就不用了,他那種用成員變量獲取參數的方式,在高并發下會造成線程不安全, springmvc 是使用的形參接收前臺數據的,線程比較安全。

5、如何開啟注解處理器和適配器?

我們在項目中一般會在 springmvc.xml 中通過開啟 <mvc:annotation-driven> 來實現注解處理器和適配器的開啟.

6、SpringMVC如何與Ajax相互調用

通過Jackson框架把Java對象轉換成js可以識別的json對象

步驟: 1、加入Jackson.jar 2、配置json的映射 3、在接收Ajax方法里直接返回Object、List等,方法前要加@RequestBody注解

7、簡述web.xml的作用?

web中可以沒有web.xml文件,也就是說,web.xml文件并不是web工程必須的。 web.xml文件是用來初始化配置信息:比如Welcome頁面、servlet、servlet-mapping、filter、listener、啟動加載級別等。 當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的Application。

注解處理器和適配器?

我們在項目中一般會在 springmvc.xml 中通過開啟 <mvc:annotation-driven> 來實現注解處理器和適配器的開啟.

6、SpringMVC如何與Ajax相互調用

通過Jackson框架把Java對象轉換成js可以識別的json對象

步驟: 1、加入Jackson.jar 2、配置json的映射 3、在接收Ajax方法里直接返回Object、List等,方法前要加@RequestBody注解

7、簡述web.xml的作用?

web中可以沒有web.xml文件,也就是說,web.xml文件并不是web工程必須的。 web.xml文件是用來初始化配置信息:比如Welcome頁面、servlet、servlet-mapping、filter、listener、啟動加載級別等。 當你的web工程沒用到這些時,你可以不用web.xml文件來配置你的Application。

總結

以上是生活随笔為你收集整理的SSM面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。