注解
你用過哪些重要的 Spring 注解?
- @Controller - 用于 Spring MVC 項目中的控制器類。
- @Service - 用于服務類。
- @RequestMapping - 用于在控制器處理程序方法中配置 URI 映射。
- @ResponseBody - 用于發送 Object 作為響應,通常用于發送 XML 或 JSON 數據作為響應。
- @PathVariable - 用于將動態值從 URI 映射到處理程序方法參數。
- @Autowired - 用于在 spring bean 中自動裝配依賴項。
- @Qualifier - 使用 @Autowired 注解,以避免在存在多個 bean 類型實例時出現混淆。
- @Scope - 用于配置 spring bean 的范圍。
- @Configuration,@ComponentScan 和 @Bean - 用于基于 java 的配置。
- @Aspect,@Before,@After,@Around,@Pointcut - 用于切面編程(AOP)。
如何在 spring 中啟動注解裝配?
默認情況下,Spring 容器中未打開注解裝配。因此,要使用基于注解裝配,我們必須通過配置<context:annotation-config /> 元素在 Spring 配置文件中啟用它。
@Component, @Controller, @Repository, @Service 有何區別?
- @Component:這將 java 類標記為 bean。它是任何 Spring 管理組件的通用構造型。spring 的組件掃描機制現在可以將其拾取并將其拉入應用程序環境中。
- @Controller:這將一個類標記為 Spring Web MVC 控制器。標有它的 Bean 會自動導入到 IoC 容器中。
- @Service:此注解是組件注解的特化。它不會對 @Component 注解提供任何其他行為。您可以在服務層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。
- @Repository:這個注解是具有類似用途和功能的 @Component 注解的特化。它為 DAO 提供了額外的好處。它將 DAO 導入 IoC 容器,并使未經檢查的異常有資格轉換為 Spring DataAccessException。
@Required 注解有什么用?
@Required 應用于 bean 屬性 setter 方法。此注解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性。如果尚未填充受影響的 bean 屬性,則容器將拋出 BeanInitializationException。
示例:
public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
@Autowired 注解有什么用?
@Autowired 可以更準確地控制應該在何處以及如何進行自動裝配。此注解用于在 setter 方法,構造函數,具有任意名稱或多個參數的屬性或方法上自動裝配 bean。默認情況下,它是類型驅動的注入。
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
@Qualifier 注解有什么用?
當您創建多個相同類型的 bean 并希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 注解和 @Autowired 通過指定應該裝配哪個確切的 bean 來消除歧義。
例如,這里我們分別有兩個類,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必須裝配 id 為 emp1 的 bean。
Employee.java
public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName() {
return name;
}
}
EmpAccount.java
public class EmpAccount {
private Employee emp;
@Autowired
@Qualifier(emp1)
public void showName() {
System.out.println(“Employee name : ”+emp.getName);
}
}
@RequestMapping 注解有什么用?
@RequestMapping 注解用于將特定 HTTP 請求方法映射到將處理相應請求的控制器中的特定類/方法。此注解可應用于兩個級別:
- 類級別:映射請求的 URL
- 方法級別:映射 URL 以及 HTTP 請求方法
數據訪問
spring DAO 有什么用?
Spring DAO 使得 JDBC,Hibernate 或 JDO 這樣的數據訪問技術更容易以一種統一的方式工作。這使得用戶容易在持久性技術之間切換。它還允許您在編寫代碼時,無需考慮捕獲每種技術不同的異常。
列舉 Spring DAO 拋出的異常。
spring JDBC API 中存在哪些類?
- JdbcTemplate
- SimpleJdbcTemplate
- NamedParameterJdbcTemplate
- SimpleJdbcInsert
- SimpleJdbcCall
使用 Spring 訪問 Hibernate 的方法有哪些?
我們可以通過兩種方式使用 Spring 訪問 Hibernate:
- 使用 Hibernate 模板和回調進行控制反轉
- 擴展 HibernateDAOSupport 并應用 AOP 攔截器節點
列舉 spring 支持的事務管理類型
Spring 支持兩種類型的事務管理:
- 程序化事務管理:在此過程中,在編程的幫助下管理事務。它為您提供極大的靈活性,但維護起來非常困難。
- 聲明式事務管理:在此,事務管理與業務代碼分離。僅使用注解或基于 XML 的配置來管理事務。
spring 支持哪些 ORM 框架
- Hibernate
- iBatis
- JPA
- JDO
- OJB
AOP
什么是 AOP?
AOP(Aspect-Oriented Programming), 即 面向切面編程, 它與 OOP( Object-Oriented Programming, 面向對象編程) 相輔相成, 提供了與 OOP 不同的抽象軟件結構的視角. 在 OOP 中, 我們以類(class)作為我們的基本單元, 而 AOP 中的基本單元是 Aspect(切面)
AOP 中的 Aspect、Advice、Pointcut、JointPoint 和 Advice 參數分別是什么?
- Aspect - Aspect 是一個實現交叉問題的類,例如事務管理。方面可以是配置的普通類,然后在 Spring Bean 配置文件中配置,或者我們可以使用 Spring AspectJ 支持使用 @Aspect 注解將類聲明為 Aspect。
- Advice - Advice 是針對特定 JoinPoint 采取的操作。在編程方面,它們是在應用程序中達到具有匹配切入點的特定 JoinPoint 時執行的方法。您可以將 Advice 視為 Spring 攔截器(Interceptor)或 Servlet 過濾器(filter)。
- Advice Arguments - 我們可以在 advice 方法中傳遞參數。我們可以在切入點中使用 args() 表達式來應用于與參數模式匹配的任何方法。如果我們使用它,那么我們需要在確定參數類型的 advice 方法中使用相同的名稱。
- Pointcut - Pointcut 是與 JoinPoint 匹配的正則表達式,用于確定是否需要執行 Advice。Pointcut 使用與 JoinPoint 匹配的不同類型的表達式。Spring 框架使用 AspectJ Pointcut 表達式語言來確定將應用通知方法的 JoinPoint。
- JoinPoint - JoinPoint 是應用程序中的特定點,例如方法執行,異常處理,更改對象變量值等。在 Spring AOP 中,JoinPoint 始終是方法的執行器。
什么是通知(Advice)?
特定 JoinPoint 處的 Aspect 所采取的動作稱為 Advice。Spring AOP 使用一個 Advice 作為攔截器,在 JoinPoint “周圍”維護一系列的攔截器。
有哪些類型的通知(Advice)?
- Before - 這些類型的 Advice 在 joinpoint 方法之前執行,并使用 @Before 注解標記進行配置。
- After Returning - 這些類型的 Advice 在連接點方法正常執行后執行,并使用@AfterReturning 注解標記進行配置。
- After Throwing - 這些類型的 Advice 僅在 joinpoint 方法通過拋出異常退出并使用 @AfterThrowing 注解標記配置時執行。
- After (finally) - 這些類型的 Advice 在連接點方法之后執行,無論方法退出是正常還是異常返回,并使用 @After 注解標記進行配置。
- Around - 這些類型的 Advice 在連接點之前和之后執行,并使用 @Around 注解標記進行配置。
指出在 spring aop 中 concern 和 cross-cutting concern 的不同之處。
concern 是我們想要在應用程序的特定模塊中定義的行為。它可以定義為我們想要實現的功能。
cross-cutting concern 是一個適用于整個應用的行為,這會影響整個應用程序。例如,日志記錄,安全性和數據傳輸是應用程序幾乎每個模塊都需要關注的問題,因此它們是跨領域的問題。
AOP 有哪些實現方式?
實現 AOP 的技術,主要分為兩大類:
- 靜態代理 - 指使用 AOP 框架提供的命令進行編譯,從而在編譯階段就可生成 AOP 代理類,因此也稱為編譯時增強;
- 編譯時編織(特殊編譯器實現)
- 類加載時編織(特殊的類加載器實現)。
- 動態代理 - 在運行時在內存中“臨時”生成 AOP 動態代理類,因此也被稱為運行時增強。
- JDK 動態代理
- CGLIB
Spring AOP and AspectJ AOP 有什么區別?
Spring AOP 基于動態代理方式實現;AspectJ 基于靜態代理方式實現。Spring AOP 僅支持方法級別的 PointCut;提供了完全的 AOP 支持,它還支持屬性級別的 PointCut。
如何理解 Spring 中的代理?
將 Advice 應用于目標對象后創建的對象稱為代理。在客戶端對象的情況下,目標對象和代理對象是相同的。
Advice + Target Object = Proxy
什么是編織(Weaving)?
為了創建一個 advice 對象而鏈接一個 aspect 和其它應用類型或對象,稱為編織(Weaving)。在 Spring AOP 中,編織在運行時執行。請參考下圖:
MVC
Spring MVC 框架有什么用?
Spring Web MVC 框架提供 模型-視圖-控制器 架構和隨時可用的組件,用于開發靈活且松散耦合的 Web 應用程序。MVC 模式有助于分離應用程序的不同方面,如輸入邏輯,業務邏輯和 UI 邏輯,同時在所有這些元素之間提供松散耦合。
描述一下 DispatcherServlet 的工作流程
DispatcherServlet 的工作流程可以用一幅圖來說明:
- 向服務器發送 HTTP 請求,請求被前端控制器 DispatcherServlet 捕獲。
- DispatcherServlet 根據 -servlet.xml 中的配置對請求的 URL 進行解析,得到請求資源標識符(URI)。然后根據該 URI,調用 HandlerMapping 獲得該 Handler 配置的所有相關的對象(包括 Handler 對象以及 Handler 對象對應的攔截器),最后以HandlerExecutionChain 對象的形式返回。
- DispatcherServlet 根據獲得的Handler,選擇一個合適的 HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時將開始執行攔截器的 preHandler(...)方法)。
- 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)。在填充Handler的入參過程中,根據你的配置,Spring 將幫你做一些額外的工作:
- HttpMessageConveter:將請求消息(如 Json、xml 等數據)轉換成一個對象,將對象轉換為指定的響應信息。
- 數據轉換:對請求消息進行數據轉換。如String轉換成Integer、Double等。
- 數據根式化:對請求消息進行數據格式化。如將字符串轉換成格式化數字或格式化日期等。
- 數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BindingResult或Error中。
- Handler(Controller)執行完成后,向 DispatcherServlet 返回一個 ModelAndView對象;
- 根據返回的ModelAndView,選擇一個適合的 ViewResolver(必須是已經注冊到 Spring 容器中的ViewResolver)返回給DispatcherServlet。
- ViewResolver 結合Model和View,來渲染視圖。
- 視圖負責將渲染結果返回給客戶端。
喜歡本文的朋友點點轉發和關注,感謝支持!