
spring是一個IOC容器,用來管理bean,使用以來植入實現控制反轉們可以很方便的整個各種跨能加,提供AOP機制彌補OOP的代碼重復問題,更加發個遍將不停方法中的共同處理抽取成切面、自動注入給方法執行,比如日志、異常等
springmvc是spring對web框架的一個解決方案,提供了一個總的前端控制器servlet,用來接收請求,然后定義了一套路由策略(url到handle的映射)即時適配執行handle,將handle結果使用視圖解析技術生成視圖展現給前端
(資料圖片)
spring boot是spring提供的一個款蘇開發工具包,讓程序員更方便,更快速的開發spring+spring mvc應用,簡化了配置(約定大于配置),整合了一系列的解決方案(starter機制)、redis、mongodb、es,可以開箱即用
在使用spring框架時,兩種使用事務的方式,一種是編程式,一種是聲明式,@Transactional注解就是申明式。
首先,事務這個概念是數據庫層面的,spring只是基于數據庫中的事務進行擴展,以及提供了一些能讓程序員更加方便操作事務的方式
比如我們可以通過在某個方法上增加@Transactional注解,就可以開啟事務,這個方法中所有的sql都會在一個食物中執行,統一成功或失敗。
在一個方法上加了@Transactional注解后,spring會基于這個類生成一個代理對象,會將這個代理對象作為bean,當在使用這個代理對象的方法時,如果這個方法上存在@Transactional注解,那么代理邏輯會把bean的自動提交設置為false,然后再去執行原本的業務邏輯方法,如果執行業務邏輯方法沒有出現異常,那么代理邏輯中就會將事務進行提交,如果執行業務邏輯方法出現了異常,那么事務會進行回滾
當然,針對哪些異常回滾事務是可以配置的,可以利用@Transactional中的rollbackFor屬性進行配置,默認情況下會對RuntimeException和Error進行回滾
spring事務隔離級別就是數據庫的隔離級別:外加一個默認級別
read uncommitted 未提交讀read committed Oracle 提交讀 不可重復讀repeatable read MySQL 可重復讀serialization 可串行化數據庫的配置隔離級別是Read commited,而 spring配置的隔離級別是Repeatable Read,請問這是隔離級別是哪個?
以spring為準,如果spring設置的隔離級別數據庫不支持,效果則取決于數據庫
spring事務的原理是AOP,進行了切面增強,那么失效的根本原因是這個AOP不起作用了!常見情況如下:
發生自調用,類里面使用this調用本類的方法(this通常省略),此時這個this對象不是代理類,二十UserService對象本身! 解決辦法就是讓哪個thid編程UserService代理類方法不是public@Transactional 只能用于public的方法上,否則事務不會失效如果要用在非 public上,可以開啟AspectJ代理模式數據庫本身不支持事務沒有被spring管理異常被吃掉,事務不會回滾(或者拋出的異常沒有被定義,默認為RuntimeException)
多個事務方法相互調用時,事務如何在這些方法間傳播
方法A是一個事務方法,方法A執行過程中發調用了方法B,那么方法B也有無事務以及方法B對事務的要求都會對方法A的詩句具體造成影響,我那個是方法A的事務對方法B的事務也有影響,這種影響具體是什么就由兩個方法所定義的是位于傳播類型所決定的
REQUIRED(spring默認的事務傳播機制):如果當前(調用方)沒有事務,則自己(被調用方)新建一個事務,如果當前存在事務,則加入這個事務
SUPPORTS:如果當前存在事務,則加入事務,如果沒有,就以非事務方式運行
MANDATORT:當前存在事務,則加入當前事務,如果當前事務不存在,則拋出異常
REQUIRES_NEW:創建一個新事物,如果存在當前事務,則掛起該事務 (各搞個的)
NOT_SUPPORTED:以非事務的方法運行,如果當前存在事務,則掛起
NEVER:不適用事務,如果存在事務則拋出異常
NESTED:如果當前事務存在,則在嵌套事務中執行,否則和REQUIRED一樣(開啟一個事務)
不是線程安全的
spring中的Bean 默認時單例模式的,框架中并沒有對bean進行多線程的封裝處理。
如果bean時有狀態,那就要開發人員自己進行線程安全的保證,最簡單的辦法就是改變bean的作用域, 把“singleton”改為“protopyte”這樣每次請求bean就相當于時new Bean() 這樣就可以保證線程的安全了。
有些黃臺就是有數據存儲功能無狀態就是不會保存數據 controller、service和dao層本身并不是線程安全的,知識如果知識調用最里面的方法,而且多線程調用一個實例方法,會在內存中賦值變量,中認識自己的線程的弘佐內存,是安全的簡單工廠:由一個工廠類根據傳入的參數,動態決定應該創建哪一個茶農i你類
spring中的BeanFactory就是簡單工廠模式的體現,根據傳入一個唯一的標識來獲得Bean對象,但是否是在傳入參數后創建 還是傳入參數之前創建這個要根據具體情況來定。
工廠方法:
實現了FactoryBean接口時一類叫做factory的bean。
其特點是:spring會在使用getBean()調用獲得該bean時,會自動調用該bean的getObject()方法,所以返回的不是factory這個bean,而是bean.getObject()方法的返回值。
單例模式:保證一個類僅有一個實例,并提供一個發個文她的全局訪問點
spring對單例的實現,spring中的單例模式完成了后半句話,既提供了全局餓訪問點BeanFactory。但沒有從構造器級別去控制單例,這是因為spring管理的是任意的java對象
適配器模式:
spring定義了一個適配接口,使得每一種Controller有一種對應的適配器實現類,讓適配器代替controller執行相應的方法,這樣在Controller時,只需要增加一個適配器類就完成springMVC的擴展了。
裝飾器模式:動態地給一個對象添加一些額外地指責。就增加功能來說,Decorator模式相比生成子類更為靈活。
spring中用到地包裝器在雷鳴上有兩種表現,一種時類名中有Wrapper,另一種時類名中含有Decorator。
動態代理:
切面