Spring
-
Spring框架是什么?
答:Spring是輕量級的面向切面和控制反轉的框架,初代版本為2002年發布的interface21,Spring框架是為了解決企業級應用開發的復雜性的出現的,它可以幫助開發人員管理物件之間的關系,能實作模塊與模塊之間、類與類之間的解耦合,Spring是一個大雜燴,它集成其他許多框架,使其他框架能與spring結合搭配使用
-
Spring常用的注解有哪些?
答:
1、@Controller
在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把用戶請求的資料經過業務bai處理層處理之后封裝成一個Model ,然后再把該Model 回傳給對應的View 進行展示,在SpringMVC 中提供了一個非常簡便的定義Controller 的方法,你無需繼承特定的類或實作特定的介面,只需使用@Controller 標記一個類是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界訪問到,此外Controller 不會直接依賴于HttpServletRequest 和HttpServletResponse 等HttpServlet 物件,它們可以通過Controller 的方法引數靈活的獲取到,
@Controller 用于標記在一個類上,使用它標記的類就是一個SpringMVC Controller 物件,分發處理器將會掃描使用了該注解的類的方法,并檢測該方法是否使用了@RequestMapping 注解,@Controller 只是定義了一個控制器類,而使用@RequestMapping 注解的方法才是真正處理請求的處理器,單單使用@Controller 標記在一個類上還不能真正意義上的說它就是SpringMVC 的一個控制器類,因為這個時候Spring 還不認識它,那么要如何做Spring 才能認識它呢?這個時候就需要我們把這個控制器類交給Spring 來管理,有兩種方式:
(1)在SpringMVC 的組態檔中定義MyController 的bean 物件,
(2)在SpringMVC 的組態檔中告訴Spring 該到哪里去找標記為@Controller 的Controller 控制器,2、@RequestMapping
RequestMapping是一個用來處理請求地址映射的注解,可用于類或方法上,用于類上,表示類中的所有回應請求的方法都是以該地址作為父路徑,
3、@Resource和@Autowired
@Resource和@Autowired都是做bean的注入時使用,其實@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要匯入,但是Spring支持該注解的注入,4、@ModelAttribute和 @SessionAttributes
代表的是:該Controller的所有方法在呼叫前,先執行此@ModelAttribute方法,可用于注解和方法引數中,可以把這個@ModelAttribute特性,應用在BaseController當中,所有的Controller繼承BaseController,即可實作在呼叫Controller時,先執行@ModelAttribute方法,
@SessionAttributes即將值放到session作用域中,寫在class上面,
具體示例參見下面:使用 @ModelAttribute 和 @SessionAttributes 傳遞和保存資料5、@PathVariable
用于將請求URL中的模板變數映射到功能處理方法的引數上,即取出uri模板中的變數作為引數,
6、@requestParam
@requestParam主要用于在SpringMVC后臺控制層獲取引數,類似一種是request.getParameter("name"),它有三個常用引數:defaultValue = "https://www.cnblogs.com/smart-rick/p/0", required = false, value = "https://www.cnblogs.com/smart-rick/p/isApp";defaultValue 表示設定默認值,required 銅過boolean設定是否是必須要傳入的引數,value 值表示接受的傳入的引數型別,
7、@ResponseBody
作用: 該注解用于將Controller的方法回傳的物件,通過適當的HttpMessageConverter轉換為指定格式后,寫入到Response物件的body資料區,
使用時機:回傳的資料不是html標簽的頁面,而是其他某種格式的資料時(如json、xml等)使用;8、@Component
相當于通用的注解,當不知道一些類歸到哪個層時使用,如果有WEB開發架構中固定的層則使用更加語意化的注解@Repository注解于DAO層、@Service注解于Service層、@Controller 注解于Controller層
-
Spring框架有哪些好處?
答:Spring能有效地組織你的中間層物件,為模塊之間降低耦合,還包括輕量級,面向切面,控制反轉,都是Spring的好處
-
Spring由哪些主要模塊組成?
答:
-
Spring IOC容器是什么?
答:IOC容器意味著將物件交給IOC容器接管,由這樣一個容器幫助我們管理物件,而不是傳統的由開發人員管理物件,IOC可以幫助我們注入屬性給物件,需要的時候給我們,
-
Spring IOC有哪些好處?
答:降低模塊與模塊之間的耦合,降低類與類之間的耦合,讓開發人員不再做重復的物件創建賦值等繁瑣的操作,而是需要用到時由IOC容器創建好自己傳遞過來
-
BeanFactory和ApplicationContext有什么區別?
答:
BeanFactory:
是Spring里面最低層的介面,提供了最簡單的容器的功能,只提供了實體化物件和拿物件的功能;
ApplicationContext:
應用背景關系,繼承BeanFactory介面,它是Spring的一各更高級的容器,提供了更多的有用的功能;
-
國際化(MessageSource)
-
訪問資源,如URL和檔案(ResourceLoader)
-
載入多個(有繼承關系)背景關系 ,使得每一個背景關系都專注于一個特定的層次,比如應用的web層
-
訊息發送、回應機制(ApplicationEventPublisher)
-
AOP(攔截器)
兩者裝載bean的區別
BeanFactory:
BeanFactory在啟動的時候不會去實體化Bean,中有從容器中拿Bean的時候才會去實體化;
ApplicationContext:
ApplicationContext在啟動的時候就把所有的Bean全部實體化了,它還可以為Bean配置lazy-init=true來讓Bean延遲實體化;
我們該用BeanFactory還是ApplicationContext
延遲實體化的優點:(BeanFactory)
應用啟動的時候占用資源很少;對資源要求較高的應用,比較有優勢;
不延遲實體化的優點: (ApplicationContext)
-
所有的Bean在啟動的時候都加載,系統運行的速度快;
-
在啟動的時候所有的Bean都加載了,我們就能在系統啟動的時候,盡早的發現系統中的配置問題
-
建議web應用,在啟動的時候就把所有的Bean都加載了,(把費時的操作放到系統啟動中完成)
-
-
Spring的依賴注入是什么?
答:主動尋找依賴屬性,通過set方法或者建構式等方式注入到物件內部,
-
Spring的依賴注入有幾種方式?
答:構造器注入,setter注入,介面注入
依賴類必須要實作指定的介面,然后實作該介面中的一個函式,該函式就是用于依賴注入,該函式的參
數就是要注入的物件,
優點:
介面注入中,介面的名字、函式的名字都不重要,只要保證函式的引數是要注入的物件型別即可,
缺點:
侵入行太強,不建議使用, -
Spring Bean支持哪幾種作用域?
答:singlet單例,prototype多例,request HTTP請求,session會話,session-global全域會話
-
Spring Bean生命周期是怎樣的?
答:


Spring Bean生命周期
-
Spring Bean為什么默認是單例的?
答:
1、如果是多例會引數較大的性能消耗,體現在創建物件,回收物件的程序,
2、單例的話自始至終都只有一個物件,Spring創建好后就放入了快取,需要使用時可以快速獲取,
-
Spring Bean是執行緒安全的嗎?
答:當Bean的作用域范圍是singlet時執行緒是不安全的,因為所有的執行緒都會共享這一個實體,必然存在資源競爭,為prototype時執行緒安全,
-
Spring怎么注入Java集合型別?
答:使用
- 標簽或者
標簽進行進入 <bean name="list" > <!-- List 注入 --> <property name="list"> <list> <value>tom</value> <value>tom</value> <ref bean="user3"/> </list> </property> </bean> -
Spring自動裝配是指什么?
答:自動裝配就是讓應用程式背景關系為你找出依賴項的程序,說的通俗一點,就是Spring會在背景關系中自動查找,并自動給bean裝配與其關聯的屬性!
-
Spring自動裝配有哪些方式?
答:大體上有兩種方式,xml方式和注解方式,xml方式在bean標簽中加入屬性autowire="",值可以選擇byName、byType、constructor,需要在類中為需要注入的屬性提供setter方法,注解方式@Autowire,先根據byType尋找bean,如果找到數量大于1再根據byName尋找、@Resource根據byType注入、@Qualifier("beanName")指定beanName注入
-
Spring自動裝配有什么局限性?
答:
-
重寫: 你仍需用
和 配置來定義依賴,意味著總要重寫自動裝配, -
基本資料型別:你不能自動裝配簡單的屬性,如基本資料型別,String字串,和類,
-
模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配,
-
-
Spring AOP是什么?
答:將對業務操作重復的操作封裝為模塊,通過動態代理的方式注入到方法中,
-
Spring AOP有什么作用?
答:
Authentication 權限
Caching 快取
Context passing 內容傳遞
Error handling 錯誤處理
Lazy loading 懶加載
Debugging 除錯
logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
Performance optimization 性能優化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務
-
Spring AOP有哪些實作方式?
答:JDK動態代理和cglib,spring根據被代理類的型別采用適合的方式進行實作啊,如果是介面就采用JDK動態代理,如果是類就采用cglib方式,
-
Spring AOP和AspectJ AOP有什么區別?
Spring AOP AspectJ 在純 Java 中實作 使用 Java 編程語言的擴展實作 不需要單獨的編譯程序 除非設定 LTW,否則需要 AspectJ 編譯器 (ajc) 只能使用運行時織入 運行時織入不可用,支持編譯時、編譯后和加載時織入 功能不強-僅支持方法級編織 更強大 - 可以編織欄位、方法、建構式、靜態初始值設定項、最終類/方法等…, 只能在由 Spring 容器管理的 bean 上實作 可以在所有域物件上實作 僅支持方法執行切入點 支持所有切入點 代理是由目標物件創建的, 并且切面應用在這些代理上 在執行應用程式之前 (在運行時) 前, 各方面直接在代碼中進行織入 比 AspectJ 慢多了 更好的性能 易于學習和應用 相對于 Spring AOP 來說更復雜 -
Spring支持哪些事務管理型別?
答:
- 編程式事務管理,在代碼中顯式呼叫開啟事務、提交事務、回滾事務的相關方法
- 宣告式事務管理,底層是建立在 AOP 的基礎之上,其本質是對方法前后進行攔截,然后在目標方法開始之前創建或者加入一個事務,在執行完目標方法之后根據執行情況提交或者回滾事務,
-
Spring框架用了哪些設計模式?
答:
1、代理模式:在AOP和remoting中被用的比較多
2、單例模式:在spring組態檔中定義的bean默認為單例模式
3、模板方法模式:解決代碼重復問題
父類定義骨架(共同方法的實作,呼叫哪些方法及順序),某些特定方法由子類實作(父類是空方法,子類繼承后再重寫)
4、前端控制器模式:spring提供了DispatcherServlet來對請求進行分發
5、依賴注入模式:貫穿于BeanFactory和ApplicationContext介面的核心理念
6、工廠模式:
(1)簡單工廠:
實作方式:BeanFactory根據傳入一個唯一的標識來獲得bean物件,由工廠類根據傳入的引數動態決定應該創建哪一個產品類
實作原理:
bean容器的啟動階段:讀取bean的xml組態檔,將bean元素分別轉換成一個BeanDefinition物件,然后通過BeanDefinitionRegistry將這些bean注冊到beanFactory中,
容器中bean的實體化階段:主要通過反射或者CGLIB對bean進行實體化
(2)工廠方法:
實作方式:FactoryBean介面
實作原理:實作了FactoryBean介面的bean是一類叫做factory的bean,特點是spring會在使用getBean()呼叫獲得該bean時,自動呼叫該bean的getObject()方法,回傳的是這個bean.getObject()方法的回傳值,
典型例子:spring與mybatis的結合:
//最侄訓傳的是SqlSessionFactoryBean.getObject()的回傳值
7、配接器模式
實作方式:springmvc中的配接器HandlerAdapter
實作程序:dispatcherServlet根據HandlerMapping回傳的handler,向HandlerAdapter發起請求,處理handler,HandlerAdapter根據規則找到對應的Handler并讓其執行,執行完畢后Handler會向HandlerAdapter回傳一個ModelAndView,最后由HandlerAdapter向dispatcherServlet回傳一個ModelAndView
8、裝飾器模式:
實作方式:類名中包含Wrapper,或者是Decorator,就是裝飾器模式
實質:動態地給一個物件添加一些額外的職責,比生成子類更靈活
9、觀察者模式
實作方式:spring的事件驅動模型使用的是觀察者模式,常用的地方就是listener的實作
具體實作:事件機制的實作包括事件源、事件、事件監聽器:
ApplicationEvent抽象類【事件】
ApplicationListener介面【事件監聽器】
ApplicationContext介面【事件源】
10、策略模式
實作方式:spring框架的資源訪問Resource介面,是具體資源訪問策略的抽象,也是所有資源訪問類所實作的介面
-
Spring MVC框架有什么用?
答:SpringMvc是輕量級、松耦合的MVC框架,提供模型-視圖-控制器層的不同支持,
-
Spring MVC DispatcherServlet的作業流程?
答:
-
Tomcat 啟動,對 DispatcherServlet 進行實體化,然后呼叫它的 init() 方法進行初始化,在這個初始化程序中完成了:
-
對 web.xml 中初始化引數的加載;建立 WebApplicationContext (SpringMVC的IOC容器);進行組件的初始化;
-
客戶端發出請求,由 Tomcat 接收到這個請求,如果匹配 DispatcherServlet 在 web.xml 中配置的映射路徑,Tomcat 就將請求轉交給 DispatcherServlet 處理;
-
DispatcherServlet 從容器中取出所有 HandlerMapping 實體(每個實體對應一個 HandlerMapping 介面的實作類)并遍歷,每個 HandlerMapping 會根據請求資訊,通過自己實作類中的方式去找到處理該請求的 Handler (執行程式,如Controller中的方法),并且將這個 Handler 與一堆 HandlerInterceptor (攔截器) 封裝成一個 HandlerExecutionChain 物件,一旦有一個 HandlerMapping 可以找到 Handler 則退出回圈;(詳情可以看[ Java]SpringMVC作業原理之二:HandlerMapping和HandlerAdpater 這篇文章)
-
DispatcherServlet 取出 HandlerAdapter 組件,根據已經找到的 Handler,再從所有 HandlerAdapter 中找到可以處理該 Handler 的 HandlerAdapter 物件;
-
執行 HandlerExecutionChain 中所有攔截器的 preHandler() 方法,然后再利用 HandlerAdapter 執行 Handler ,執行完成得到 ModelAndView,再依次呼叫攔截器的 postHandler() 方法;
-
利用 ViewResolver 將 ModelAndView 或是 Exception(可決議成 ModelAndView)決議成 View,然后 View 會呼叫 render() 方法再根據 ModelAndView 中的資料渲染出頁面;
-
最后再依次呼叫攔截器的 afterCompletion() 方法,這一次請求就結束了,
-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262785.html
標籤:Java
上一篇:hashMap原始碼學習
