說一下spring中Bean的做用域前端
singleton:程序員
Spring IoC容器中只會存在一個共享的Bean實例,不管有多少個Bean引用它,始終指向同一對象。Singleton做用域是Spring中的缺省做用域。spring
prototype:設計模式
每次經過Spring容器獲取prototype定義的bean時,容器都將建立一個新的Bean實例,每一個Bean實例都有本身的屬性和狀態,而singleton全局只有一個對象。緩存
request:session
在一次Http請求中,容器會返回該Bean的同一實例。而對不一樣的Http請求則會產生新的Bean,並且該bean僅在當前Http Request內有效。框架
session:post
在一次Http Session中,容器會返回該Bean的同一實例。而對不一樣的Session請求則會建立新的實例,該bean實例僅在當前Session內有效。spa
global Session:prototype
在一個全局的Http Session中,容器會返回該Bean的同一個實例,僅在使用portlet context時有效。
說一下spring中Bean的生命週期
實例化一個Bean,也就是咱們一般說的new。
按照Spring上下文對實例化的Bean進行配置,也就是IOC注入。
若是這個Bean實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的是Spring配置文件中Bean的ID。
若是這個Bean實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(),傳遞的是Spring工廠自己(能夠用這個方法獲取到其餘Bean)。
若是這個Bean實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文。
若是這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor常常被用做是Bean內容的更改,而且因爲這個是在Bean初始化結束時調用After方法,也可用於內存或緩存技術。
若是這個Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。
若是這個Bean關聯了BeanPostProcessor接口,將會調用postAfterInitialization(Object obj, String s)方法。
當Bean再也不須要時,會通過清理階段,若是Bean實現了DisposableBean接口,會調用其實現的destroy方法。
最後,若是這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。
對Spring中依賴注入兩種方式的認識
兩種注入方式爲:構造方法注入和設值注入
設值注入與傳統的JavaBean的寫法更類似,程序員更容易理解、接受,經過setter方式設定依賴關係顯得更加直觀、明顯;
對於複雜的依賴關係,若是採用構造注入,會致使構造器過於臃腫,難以閱讀。Spring在建立Bean實例時,須要同時實例化其依賴的所有實例,於是會產生浪費。而使用設值注入,則避免這下問題;
在某些屬性可選的狀況下,多參數的構造器更加笨拙,官方更鼓勵使用設值注入。
構造注入能夠在構造器中決定依賴關係的注入順序,優先依賴的優先注入。
對於依賴關係無須變化的Bean,構造注入更有用處,由於沒有setter方法,全部的依賴關係所有在構造器內設定,所以,不用擔憂後續代碼對依賴關係的破壞。
構造注入使依賴關係只能在構造器中設定,則只有組件的建立者才能改變組件的依賴關係。對組件的調用者而言,組件內部的依賴關係徹底透明,更符合高內聚的原則。
設值注入不會重寫構造方法的值。若是咱們對同一個變量同時使用了構造方法注入又使用了設置方法注入的話,那麼構造方法將不能覆蓋由設值方法注入的值。
建議採用以設值注入爲主,構造注入爲輔的注入策略。對於依賴關係無須變化的注入,儘可能採用構造注入;而其餘的依賴關係的注入,則考慮採用set注入。
Spring框架中都用到了哪些設計模式?
代理模式:在AOP和remoting中被用的比較多。
單例模式:在spring配置文件中定義的bean默認爲單例模式。
模板方法模式:用來解決代碼重複的問題。
前端控制器模式:Spring提供了DispatcherServlet來對請求進行分發。
依賴注入模式:貫穿於BeanFactory / ApplicationContext接口的核心理念。
工廠模式:BeanFactory用來建立對象的實例。
BeanFactory 和ApplicationContext的區別
BeanFactory和ApplicationContext都是接口,而且ApplicationContext是BeanFactory的子接口。
BeanFactory是Spring中最底層的接口,提供了最簡單的容器的功能,只提供了實例化對象和拿對象的功能。而ApplicationContext是Spring的一個更高級的容器,提供了更多的有用的功能。
ApplicationContext提供的額外的功能:國際化的功能、消息發送、響應機制、統一加載資源的功能、強大的事件機制、對Web應用的支持等等。
加載方式的區別:BeanFactory採用的是延遲加載的形式來注入Bean;ApplicationContext則相反的,它是在Ioc啓動時就一次性建立全部的Bean,好處是能夠立刻發現Spring配置文件中的錯誤,壞處是形成浪費。