專門(mén)做ppt的網(wǎng)站名稱北京百度公司地址在哪里
1、為什么要使用 spring?
- 方便解耦,便于開(kāi)發(fā)
- 支持aop編程
- 聲明式事務(wù)的支持
- 方便程序的測(cè)試
- 方便集成各種優(yōu)秀的框架
- 降低JavaEE API的使用難度
2、解釋一下什么是 aop?
AOP 是 Aspect-Oriented Programming 的縮寫(xiě),中文翻譯為“面向切面編程”。它是一種編程范式,旨在通過(guò)將橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯分離,來(lái)提高代碼的可讀性、可維護(hù)性和可擴(kuò)展性。
在傳統(tǒng)的編程中,業(yè)務(wù)邏輯通常與系統(tǒng)的其他關(guān)注點(diǎn)(如日志記錄、事務(wù)管理、權(quán)限控制等)緊密耦合在一起。這導(dǎo)致代碼變得復(fù)雜、難以理解和維護(hù)。AOP 提供了一種機(jī)制,允許開(kāi)發(fā)人員將這些橫切關(guān)注點(diǎn)從業(yè)務(wù)邏輯中分離出來(lái),并將它們封裝成獨(dú)立的模塊,稱為切面(Aspect)。
切面可以在代碼的不同位置插入,例如方法的執(zhí)行前后、異常處理、對(duì)象的創(chuàng)建和銷毀等。通過(guò)在切面中定義切入點(diǎn)(Pointcut)和通知(Advice),開(kāi)發(fā)人員可以指定在何時(shí)何地執(zhí)行切面的代碼。
3、解釋一下什么是 ioc?
IOC 是一種設(shè)計(jì)原則,也是一種架構(gòu)模式。在傳統(tǒng)的編程方式中,對(duì)象的創(chuàng)建和管理通常由應(yīng)用程序代碼直接負(fù)責(zé)。這意味著應(yīng)用程序需要知道對(duì)象的具體類型,并在需要時(shí)創(chuàng)建和銷毀它們。這種方式存在一些問(wèn)題,例如對(duì)象之間的耦合度較高,難以進(jìn)行單元測(cè)試和維護(hù)。
IOC 的核心思想是將對(duì)象的創(chuàng)建和管理交給一個(gè)容器或框架來(lái)處理。容器或框架負(fù)責(zé)創(chuàng)建對(duì)象、管理對(duì)象的生命周期、注入對(duì)象的依賴關(guān)系等。應(yīng)用程序代碼只需要使用容器或框架提供的接口來(lái)獲取對(duì)象,而不需要關(guān)心對(duì)象的具體創(chuàng)建和管理過(guò)程。
通過(guò)使用 IOC,對(duì)象之間的耦合度降低,應(yīng)用程序的可測(cè)試性和可維護(hù)性提高。同時(shí),IOC 也使得應(yīng)用程序更加靈活,可以方便地替換或擴(kuò)展對(duì)象的實(shí)現(xiàn)。
在 Java 中,常見(jiàn)的 IOC 框架有 Spring、Guice 等。這些框架提供了豐富的功能和特性,可以幫助開(kāi)發(fā)人員更方便地實(shí)現(xiàn) IOC。
4、spring 有哪些主要模塊?
Spring 是一個(gè)開(kāi)源的輕量級(jí) Java 開(kāi)發(fā)框架,它提供了許多功能模塊,幫助開(kāi)發(fā)人員更輕松地構(gòu)建企業(yè)級(jí)應(yīng)用程序。以下是 Spring 框架的主要模塊:
- Spring Core:提供了 Spring 框架的核心功能,包括 IoC(控制反轉(zhuǎn))容器、依賴注入、Bean 管理等。
- Spring Beans:定義了 Bean 的基本概念,包括 Bean 的定義、實(shí)例化、生命周期管理等。
- Spring Context:提供了 Spring 框架的上下文環(huán)境,包括ApplicationContext 接口、BeanFactory 接口等。
- Spring AOP:提供了面向切面編程的支持,包括切面、切入點(diǎn)、通知等。
- Spring DAO:提供了對(duì)數(shù)據(jù)訪問(wèn)的支持,包括對(duì)各種數(shù)據(jù)庫(kù)的訪問(wèn)、事務(wù)管理等。
- Spring ORM:提供了對(duì)對(duì)象關(guān)系映射(ORM)的支持,包括對(duì) Hibernate、MyBatis 等 ORM 框架的集成。
- Spring Web:提供了對(duì) Web 應(yīng)用程序的支持,包括 Spring MVC 框架、WebSocket 支持等。
- Spring Security:提供了對(duì)安全框架的支持,包括用戶認(rèn)證、授權(quán)、加密等。
- Spring Social:提供了對(duì)社交網(wǎng)絡(luò)的支持,包括對(duì) Facebook、Twitter 等社交網(wǎng)絡(luò)的集成。
- Spring Cloud:提供了對(duì)云計(jì)算的支持,包括服務(wù)發(fā)現(xiàn)、負(fù)載均衡、配置管理等。
5、spring 常用的注入方式有哪些??
在 Spring 框架中,依賴注入(Dependency Injection,簡(jiǎn)稱 DI)是一種重要的技術(shù),它可以幫助我們管理對(duì)象之間的依賴關(guān)系。常用的注入方式主要有以下幾種:
- 構(gòu)造函數(shù)注入:通過(guò)在類的構(gòu)造函數(shù)中傳入依賴對(duì)象來(lái)實(shí)現(xiàn)注入。
- Setter 方法注入:通過(guò)類中提供的Setter 方法來(lái)注入依賴對(duì)象。
- 注解注入:通過(guò)在類、方法或?qū)傩陨咸砑幼⒔鈦?lái)指定依賴關(guān)系,Spring 框架會(huì)自動(dòng)進(jìn)行注入。
以下是對(duì)每種注入方式的詳細(xì)解釋:
-
構(gòu)造函數(shù)注入:
- 優(yōu)點(diǎn):在對(duì)象創(chuàng)建時(shí)就完成依賴注入,保證對(duì)象的必需依賴不會(huì)為
null
。 - 缺點(diǎn):如果類有多個(gè)構(gòu)造函數(shù),可能需要?jiǎng)?chuàng)建多個(gè)構(gòu)造函數(shù)來(lái)處理不同的依賴注入情況。
- 優(yōu)點(diǎn):在對(duì)象創(chuàng)建時(shí)就完成依賴注入,保證對(duì)象的必需依賴不會(huì)為
-
Setter 方法注入:
- 優(yōu)點(diǎn):Setter 方法的命名通常具有明確的含義,便于理解和維護(hù)。
- 缺點(diǎn):Setter 方法可能會(huì)被多次調(diào)用,導(dǎo)致不必要的性能開(kāi)銷。
-
注解注入:
- 優(yōu)點(diǎn):使用注解可以減少樣板代碼,提高代碼的簡(jiǎn)潔性和可讀性。
- 缺點(diǎn):如果使用不當(dāng),可能會(huì)導(dǎo)致代碼可讀性降低,并且可能會(huì)與其他框架或庫(kù)產(chǎn)生沖突。
在實(shí)際開(kāi)發(fā)中,通常會(huì)根據(jù)具體的需求和項(xiàng)目的特點(diǎn)選擇合適的注入方式。同時(shí),Spring 框架還提供了其他注入方式,如接口注入、字段注入等,但這些方式在實(shí)際應(yīng)用中較少使用。
無(wú)論使用哪種注入方式,都需要注意以下幾點(diǎn):
- 確保注入的依賴對(duì)象是正確的類型和實(shí)例。
- 處理好循環(huán)依賴的問(wèn)題,避免出現(xiàn)死循環(huán)。
- 合理管理依賴對(duì)象的生命周期,確保在需要的時(shí)候能夠正確創(chuàng)建和銷毀。
通過(guò)合理使用依賴注入,可以提高代碼的可維護(hù)性、可擴(kuò)展性和測(cè)試性,使系統(tǒng)更加靈活和易于管理。
6、spring 中的 bean 是線程安全的嗎?
在 Spring 框架中,Bean 的作用域決定了 Bean 是否是線程安全的。默認(rèn)情況下,Spring 的 Bean 是單例模式(Singleton)的,這意味著在整個(gè)應(yīng)用程序中只有一個(gè) Bean 實(shí)例存在。由于所有的線程都共享這個(gè)單例 Bean,所以如果 Bean 中存在共享的狀態(tài)(例如成員變量),并且在多線程環(huán)境下對(duì)這些共享狀態(tài)進(jìn)行修改,就可能會(huì)出現(xiàn)線程安全問(wèn)題。
為了確保 Spring Bean 的線程安全,可以采取以下幾種措施:
- 使用線程安全的對(duì)象:如果 Bean 中包含的成員變量是線程安全的,或者是不可變的(Immutable),那么就不需要擔(dān)心線程安全問(wèn)題。例如,使用
String
、Integer
等基本類型的包裝類,或者使用Collections.synchronizedList
等線程安全的集合類。 - 避免共享狀態(tài):盡量避免在 Bean 中定義共享的狀態(tài),尤其是在多線程環(huán)境下可能被修改的狀態(tài)。如果確實(shí)需要共享狀態(tài),可以考慮使用線程安全的方式來(lái)實(shí)現(xiàn),例如使用
Atomic
類、Synchronized
關(guān)鍵字等。 - 使用多例模式(Prototype):如果 Bean 不需要在整個(gè)應(yīng)用程序中共享,可以將其作用域設(shè)置為多例模式(Prototype)。這樣,每次獲取 Bean 時(shí)都會(huì)創(chuàng)建一個(gè)新的實(shí)例,從而避免了線程安全問(wèn)題。
- 使用線程本地變量(ThreadLocal):如果 Bean 中的狀態(tài)需要在每個(gè)線程中獨(dú)立存儲(chǔ),可以使用線程本地變量(ThreadLocal)。ThreadLocal 可以為每個(gè)線程提供一個(gè)獨(dú)立的變量副本,從而避免了線程安全問(wèn)題。
- 使用同步機(jī)制:如果 Bean 中的方法需要在多線程環(huán)境下進(jìn)行同步操作,可以使用
Synchronized
關(guān)鍵字或者Lock
類來(lái)實(shí)現(xiàn)同步。
總之,Spring 中的 Bean 默認(rèn)情況下不是線程安全的,需要根據(jù)具體情況采取相應(yīng)的措施來(lái)確保線程安全。
?7、spring 支持幾種 bean 的作用域?
- singleton:單例,默認(rèn)作用域
- prototype:原型,每次創(chuàng)建一個(gè)新對(duì)象
- request:請(qǐng)求,每次Http請(qǐng)求創(chuàng)建一個(gè)新對(duì)象,適用于WebApplicationContext環(huán)境下
- session:會(huì)話,同一個(gè)會(huì)話共享一個(gè)實(shí)例,不同會(huì)話使用不同的實(shí)例
- global-session:全局會(huì)話,所有會(huì)話共享一個(gè)實(shí)例
8、spring 事務(wù)實(shí)現(xiàn)方式有哪些??
- 編程式事務(wù)管理,需要在代碼中調(diào)用beginTransaction()、commit()、rolback()等事務(wù)管理相關(guān)的方法
- 基于TransactionProxyFactoryBean的聲明式事務(wù)管理
- 基于@Transactional的聲明式事務(wù)管理
- 基于Aspectj AOP配置事務(wù)
9、說(shuō)一下 spring 的事務(wù)隔離??
10、@RequestMapping 的作用是什么??
@RequestMapping是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,可用于類或者方法上,用來(lái)標(biāo)識(shí) http 請(qǐng)求地址與 Controller 類的方法之間的映射。
11、@Autowired 的作用是什么?
@Autowired是一個(gè)注解,他可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,讓spring完成bean自動(dòng)裝配的工作。
12、說(shuō)一下 spring mvc 運(yùn)行流程?
- 用戶向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求被 Spring 前端控制 Servelt DispatcherServlet 捕獲。(捕獲)
- DispatcherServlet對(duì)請(qǐng)求 URL進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)。然后根據(jù)該 ?URI,調(diào)用 HandlerMapping獲得該Handler配置的所有相關(guān)的對(duì)象(包括 ?Handler對(duì)象以及 ? Handler對(duì)象對(duì)應(yīng)的攔截器),最后以 HandlerExecutionChain對(duì)象的形式返回;(查找 ? handler)
- DispatcherServlet ?根據(jù)獲得的 Handler,選擇一個(gè)合適的 ?HandlerAdapter。提取Request 中的模型數(shù)據(jù),填充 Handler 入?yún)?#xff0c;開(kāi)始執(zhí)行 Handler(Controller), Handler執(zhí)行完成后,向 DispatcherServlet 返回一個(gè) ModelAndView 對(duì)象(執(zhí)行 handler)
- DispatcherServlet ?根據(jù)返回的 ModelAndView,選擇一個(gè)適合的 ViewResolver(必須是已經(jīng)注冊(cè)到 Spring 容器中的 ViewResolver) (選擇 ViewResolver)
- 通過(guò) ViewResolver 結(jié)合 Model 和 View,來(lái)渲染視圖,DispatcherServlet 將渲染結(jié)果返回給客戶端。(渲染返回)
總結(jié):核心控制器捕獲請(qǐng)求、查找Handler、執(zhí)行Handler、選擇ViewResolver,通過(guò)ViewResolver渲染視圖并返回?