1.Spring
1.1什么是Spring框架?
Spring 是?種輕量級開發框架,旨在提?開發?員的開發效率以及系統的可維護性。
Spring 的 6 個特征:核?技術,測試,數據訪問,Web?持,集成,語?
1.2列舉?些重要的Spring模塊?
Spring Core : 基礎 , 可以說 Spring 其他所有的功能都需要依賴于該類庫。主要提供 IoC 依
賴注?功能。
Spring Aspects : 該模塊為與 AspectJ 的集成提供?持。
Spring AOP :提供了?向切?的編程實現。
Spring JDBC : Java 數據庫連接。
Spring JMS : Java 消息服務。
Spring ORM : ?于?持 Hibernate 等 ORM ?具。
Spring Web : 為創建 Web 應?程序提供?持。
Spring Test : 提供了對 JUnit 和 TestNG 測試的?持
1.3@RestController vs @Controller
Controller 返回?個??
單獨使? @Controller 不加 @ResponseBody 的話?般使?在要返回?個視圖的情況,這種情況
屬于??傳統的 Spring MVC 的應?,對應于前后端不分離的情況。
@RestController 返回 JSON 或 XML 形式數據
但 @RestController 只返回對象,對象數據直接以 JSON 或 XML 形式寫? HTTP 響應
(Response) 中,這種情況屬于 RESTful Web 服務,這也是?前?常開發所接觸的最常?的情況
(前后端分離)。
@Controller +@ResponseBody 返回 JSON 或 XML 形式數據
如果你需要在 Spring4 之前開發 RESTful Web 服務的話,你需要使? @Controller 并結
合 @ResponseBody 注解,也就是說 @Controller + @ResponseBody = @RestController ( Spring 4
之后新加的注解)。
@ResponseBody將對象轉換成JSON 或者XML形式
@ResponseBody 注解的作?是將 Controller 的?法返回的對象通過適當的轉換器轉換為指
定的格式之后,寫?到 HTTP 響應 (Response) 對象的 body 中,通常?來返回 JSON 或者
XML 數據,返回 JSON 數據的情況?較多。
1.4Spring IOC & AOP
IOC
????????IoC( Inverse of Control: 控制反轉)是?種 設計思想 ,就是 將原本在程序中?動創建對象的控制 權,交由 Spring 框架來管理。 ? IoC 容器是 Spring ?來實現 IoC 的載體, IoC 容器實際上就是個 Map ( key , value ) ,Map 中存放的是各 種對象。
????????將對象之間的相互依賴關系交給 IoC 容器來管理,并由 IoC 容器完成對象的注?。 IoC 容器就像是?個??? 樣,當我們需要創建?個對象的時候,只需要配置好配置?件 / 注解即可,完全不?考慮對象是如 何被創建出來的。
AOP
???????AOP(Aspect-Oriented Programming:?向切?編程 ) 能夠將那些與業務?關, 卻為業務模塊所共 同調?的邏輯或責任(例如事務處理、?志管理、權限控制等)封裝起來 ,便于 減少系統的重復
代碼 , 降低模塊間的耦合度 ,并 有利于未來的可拓展性和可維護性 。
????????Spring AOP就是基于動態代理的 ,如果要代理的對象,實現了某個接?,那么 Spring AOP 會使?JDK Proxy ,去創建代理對象,?對于沒有實現接?的對象, 這時候 Spring AOP 會使? Cglib ?成?個被代理對象的?類來作為代理
1.5Spring AOP 和 AspectJ AOP 有什么區別?
????????Spring AOP 屬于運?時增強,? AspectJ 是編譯時增強。 Spring AOP 基于代理 (Proxying) ,? AspectJ 基于字節碼操作 (Bytecode Manipulation) 。
????????Spring AOP 已經集成了 AspectJ , AspectJ 應該算的上是 Java ?態系統中最完整的 AOP 框
架了。 AspectJ 相?于 Spring AOP 功能更加強?,但是 Spring AOP 相對來說更簡單,如果我們的切??較少,那么兩者性能差異不?。但是,當切?太多的話,最好選擇 AspectJ ,它?Spring AOP 快很多。
1.6Spring 中的 bean 的作?域有哪些?
singleton : 唯? bean 實例, Spring 中的 bean 默認都是單例的。
prototype : 每次請求都會創建?個新的 bean 實例。
request : 每?次 HTTP 請求都會產??個新的 bean ,該 bean 僅在當前 HTTP request 內有
效。
session : 每?次 HTTP 請求都會產??個新的 bean ,該 bean 僅在當前 HTTP session 內有
效。
global-session : 全局 session 作?域,僅僅在基于 portlet 的 web 應?中才有意義, Spring5 已
經沒有了。 Portlet 是能夠?成語義代碼 ( 例如: HTML) ?段的?型 Java Web 插件。它們基于
portlet 容器,可以像 servlet ?樣處理 HTTP 請求。但是,與 servlet 不同,每個 portlet 都有不
同的會話
1.7Spring 中的單例 bean 的線程安全問題了解嗎?
單例 bean 存在線程問題,主要是因為當多個線程操作同?個對象的時候,對這個對象的?靜態成員變量的寫操作會存在線程安全問題。
常?的有兩種解決辦法:
1. 在 Bean 對象中盡量避免定義可變的成員變量(不太現實)。
2. 在類中定義?個 ThreadLocal 成員變量,將需要的可變成員變量保存在 ThreadLocal 中(推
薦的?種?式)。
1.8@Component 和 @Bean 的區別是什么?
1. 作?對象不同 : @Component 注解作?于類,? @Bean 注解作?于?法。
2. @Component 通常是通過類路徑掃描來?動偵測以及?動裝配到 Spring 容器中(我們可以使
? @ComponentScan 注解定義要掃描的路徑從中找出標識了需要裝配的類?動裝配到
Spring 的 bean 容器中)。 @Bean 注解通常是我們在標有該注解的?法中定義產?這個
bean, @Bean 告訴了 Spring 這是某個類的示例,當我需要?它的時候還給我。
3. @Bean 注解? Component 注解的?定義性更強,?且很多地?我們只能通過 @Bean 注
解來注冊 bean 。?如當我們引?第三?庫中的類需要裝配到 Spring 容器時,則只能通過
@Bean 來實現。
1.9將?個類聲明為Spring的 bean 的注解有哪些?
我們?般使? @Autowired 注解?動裝配 bean ,要想把類標識成可?于 @Autowired 注解?動
裝配的 bean 的類 , 采?以下注解可實現:
@Component :通?的注解,可標注任意類為 Spring 組件。如果?個 Bean 不知道屬于哪
個層,可以使? @Component 注解標注。
@Repository : 對應持久層即 Dao 層,主要?于數據庫相關操作。
@Service : 對應服務層,主要涉及?些復雜的邏輯,需要?到 Dao 層。
@Controller : 對應 Spring MVC 控制層,主要?戶接受?戶請求并調? Service 層返回數
據給前端??。
1.10Spring 中的 bean ?命周期?
Bean 容器找到配置?件中 Spring Bean 的定義。
Bean 容器利? Java Reflection API 創建?個 Bean 的實例。
如果涉及到?些屬性值 利? set() ?法設置?些屬性值。
如果 Bean 實現了 BeanNameAware 接?,調? setBeanName() ?法,傳? Bean 的名字。
如果 Bean 實現了 BeanClassLoaderAware 接?,調? setBeanClassLoader() ?法,傳?
ClassLoader 對象的實例。
與上?的類似,如果實現了其他 *.Aware 接?,就調?相應的?法。
如果有和加載這個 Bean 的 Spring 容器相關的 BeanPostProcessor 對象,執
? postProcessBeforeInitialization() ?法
如果 Bean 實現了 InitializingBean 接?,執? afterPropertiesSet() ?法。
如果 Bean 在配置?件中的定義包含 init-method 屬性,執?指定的?法。
} 如果有和加載這個 Bean 的 Spring 容器相關的 BeanPostProcessor 對象,執? postProcessAfterInitialization() ?法
當要銷毀 Bean 的時候,如果 Bean 實現了 DisposableBean 接?,執? destroy() ?法。
當要銷毀 Bean 的時候,如果 Bean 在配置?件中的定義包含 destroy-method 屬性,執?指
定的?法。