日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

大佬把Spring框架总结的「无比详细」,不信你学不会!

發布時間:2025/3/20 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大佬把Spring框架总结的「无比详细」,不信你学不会! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今日推薦

后端接口如何提高性能?

16 個寫代碼的好習慣

為什么不推薦使用BeanUtils屬性轉換工具

盤點阿里巴巴 34 個牛逼 GitHub 項目

常見代碼重構技巧(非常實用)

作者:itcats_cn

blog.csdn.net/itcats_cn/article/details/81479185

1、IOC和DI

IOC: 控制反轉

即控制權的轉移,將我們創建對象的方式反轉了,以前對象的創建是由我們開發人員自己維護,包括依賴關系也是自己注入。使用了spring之后,對象的創建以及依賴關系可以由spring完成創建以及注入,反轉控制就是反轉了對象的創建方式,從我們自己創建反轉給了程序創建(spring)

DI: ?Dependency Injection ?依賴注入

spring這個容器中,替你管理著一系列的類,前提是你需要將這些類交給spring容器進行管理,然后在你需要的時候,不是自己去定義,而是直接向spring容器索取,當spring容器知道你的需求之后,就會去它所管理的組件中進行查找,然后直接給你所需要的組件.

實現IOC思想需要DI做支持

注入方式:

  • set方式注入

  • 構造方法注入

  • 字段注入

  • 注入類型:

  • 值類型注入

  • 引用類型注入

  • 好處:

    1.降低組件之間的耦合度,實現軟件各層之間的解耦.

    2.可以使容器提供眾多服務如事務管理消息服務處理等等。當我們使用容器管理事務時,開發人員就不需要手工 控制事務,也不需要處理復雜的事務傳播

    3.容器提供單例模式支持,開發人員不需要自己編寫實現代碼.

    4.容器提供了AOP技術,利用它很容易實現如權限攔截,運行期監控等功能

    5.容器提供眾多的輔佐類,使這些類可以加快應用的開發.如jdbcTemplate HibernateTemplate

    2.applicationContext & BeanFactory區別

    BeanFactory接口

    (1) spring的原始接口,針對原始接口的實現類功能較為單一

    (2)BeanFactory接口實現類的容器,特點是每次在獲得對象時才會創建對象

    ApplicationContext接口

    (1)每次容器啟動時就會創建容器中配置的所有對象

    (2)提供了更多功能

    (3)從類路徑下加載配置文件: ClassPathXmlApplicationContext
    從硬盤的絕對路徑下加載配置文件:FileSystemXmlApplication

    3.spring配置詳解

    3.1、元素屬性

    • bean元素:使用該元素描述需要spring容器管理對象

    • name屬性:給被管理的對象起個名字,獲得對象時getBean("name值")

    • class屬性:被管理對象的完整類名

    • id屬性:與name屬性一模一樣,名稱不可重復,不能使用特殊字符

    name和id之間的一些注意點:

    1、配置兩個相同的 id 或者 name 都不能通過。

    2、如果既配置了 id ,也配置了 name ,則兩個都生效。如果id和name都沒有指定,則用類全名作為name,如<bean class="com.stamen.BeanLifeCycleImpl">,則你可以通過getBean("com.stamen.BeanLifeCycleImpl")返回該實例。

    3、如果配置基本類的時候,注解和配置文件都使用的時候,注解和配置文件中 name 相同的時候, 則兩個沖突,配置文件生效。

    如果配置基本類的時候,注解和配置文件都使用的時候,注解和配置文件中 name 不相同的時候, 則兩個不沖突,都能夠生效。

    擴展:SpringBoot內容聚合

    3.2、bean元素進階( ?scope屬性 ? 生命周期屬性)—————單例多例

    (1)scope屬性

    (1)singleton(默認值)

    單例對象:被標識為單例的對象在spring容器中只會存在一個實例

    (2)prototype

    多例原型:被標識為多例的對象,每次在獲得才會被創建,每次創建都是新的對象

    (3)request

    Web環境下,對象與request生命周期一致

    (4)session

    Web環境下,對象與session生命周期一致

    總結:絕大多數情況下,使用單例singleton(默認值),但是在與struts整合時候,務必要用prototype多例,因為struts2在每次請求都會創建一個新的Action,若為單例,在多請求情況下,每個請求找找spring拿的都是同一個action。

    (2)生命周期屬性(了解)———初始化和銷毀

    (1)配置一個方法作為生命周期初始化方法,spring會在對象創建之后立刻調用 init-method

    (2)配置一個方法作為生命周期的銷毀方法,spring容器在關閉并銷毀所有容器中的對象之前調用destory-method
    <bean init-method=“init” ?destory-method=“destory”></bean>對應注解為@PostConstruct

    <bean name=“hello” class=“完整類名”></bean>對應注解為@PreDestory

    (3)模塊化配置,即分模塊配置(導入其他spring配置文件)

    <beans>??<import?resource?=?“spring配置文件的全路徑名”?/>?? </beans>

    3.3、spring三種對象的創建方式

    (1)空參數構造(重要)

    (2)靜態工廠創建(調用靜態方法創建)

    調用UserFactory類的靜態createUser方法創建名為user的對象,放入容器

    <bean?name="user"?class="cn.itcats.UserFactory"?factory-method="createUser"></bean>

    (3)實例工廠創建(調用非靜態方法創建)——需要配置兩個bean,因為無法通過類名調用非靜態方法

    <bean?name="user2"?factory-bean="userFactory"?factory-method="createUser"></bean><bean?name=“userFactory”?class=“cn.itcats.UserFactory”></bean>

    3.4、spring注入方式

    (1)set方式注入(重點)————值類型用value注入 ? ?引用類型用ref注入

    (2)構造方法注入

    函數注入

    (3)p名稱空間注入———實際上set注入,spring特有,為了簡化<property>寫法

    1、applicationContext.xml中<beans>標簽頭部導入p命名空間

    xmlns:p="http://www.springframework.org/schema/p"

    2、書寫格式:值類型注入—— ?p:屬性名="值" ? ? ? 引用類型注入—— ?p:屬性名-ref="引用的<bean> name屬性"

    把Run類中的name屬性值設置為haha,age屬性設置為20,引用屬性hello引用<bean name="hello" class="..."></bean>

    <bean?name="run2"?class="cn.itcats.thread.Run"?p:name="haha"?p:age="20"?p:hello-ref="hello"></bean>

    (4)spel注入: spring Expression Language spring表達式語言

    <bean?name="runSpel"?class="cn.itcats.thread.Run"><!--?取bean標簽中name為"user"中property為"name"中的value值?--!><property?name="name"?value="#{user.name}"></property> </bean>

    SpEL特性:(1)、使用Bean的ID來引用Bean;(2)、調用方法和訪問對象的屬性;(3)、對值進行算術、關系和邏輯運算;(4)、正則表達式匹配;(5)、集合操作

    關于spel ??https://www.cnblogs.com/goodcheap/p/6490896.html

    復雜類型注入

    1.array數組的注入

    2.list集合的注入

    3.map集合的注入

    4.properties的注入

    4、防止創建多個applicationContext取值/并指定記載spring配置文件的位置——web.xml

    1、需要導入包spring-web

    2、在web.xml中配置監聽器

    5、使用注解方式代替配置文件(官方推薦使用注解)

    1.在applicationContext.xml中書寫指定掃描注解

    2.在類中書寫Component

    注意:假如不寫括號內的值(即name或id),默認使用類名首字母小寫作為搜索,為什么意思呢?

    比如Student類中使用了@Component ? 沒有書寫括號和值,那么默認搜索id或name為student。

    搜索Java知音公眾號,回復“后端面試”,送你一份Java面試題寶典.pdf

    3.指定對象的作用范圍Scope

    聲明Student類對象為多例

    下面是對singleton和prototype的一些補充

    • singleton作用域:當把一個Bean定義設置為singleton作用域是,Spring IoC容器中只會存在一個共享的Bean實例,并且所有對Bean的請求,只要id與該Bean定義相匹配,則只會返回該Bean的同一實例。值得強調的是singleton作用域是Spring中的缺省作用域。

    • prototype作用域:prototype作用域的Bean會導致在每次對該Bean請求(將其注入到另一個Bean中,或者以程序的方式調用容器的getBean()方法)時都會創建一個新的Bean實例。根據經驗,對有狀態的Bean應使用prototype作用域,而對無狀態的Bean則應該使用singleton作用域。對于具有prototype作用域的Bean,有一點很重要,即Spring不能對該Bean的整個生命周期負責。具有prototype作用域的Bean創建后交由調用者負責銷毀對象回收資源。簡單的說:

    • singleton 只有一個實例,也即是單例模式。

    • prototype訪問一次創建一個實例,相當于new。

    4.值類型的注入

    實際通過反射field賦值

    實際通過set方式賦值

    5.引用類型的注入

    面試題: @AutoWired和@Resource的區別?

    @AutoWired默認以類型進行查找,@Resource默認以名稱進行查找

    @AutoWired(required=false) ? ?+ ? @Qualifier("user") ? ?== ? @Resource(name="user")

    其中@Resource注解是jdk1.6后才有的

    6.創建與銷毀方法

    7.spring整合junit測試(spring創建容器)

    @RunWith(SpringJUnit4ClassRunner.class)
    ? ? ?@ContextConfiguration("classpath:applicationContext.xml")

    6、spring中AOP名詞解釋

    JoinPoint(連接點):目標對象中,所有可以增強的方法,就是spring允許你是通知(Advice)的地方,那可就真多了,基本每個方法的前、后(兩者都有也行),或拋出異常是時都可以是連接點,spring只支持方法連接點。

    Pointcut(切入點):目標對象中,已經被增強的方法。調用這幾個方法之前、之后或者拋出異常時干點什么,那么就用切入點來定義這幾個方法。

    Advice(通知/增強)?:增強方法的代碼、想要的功能。

    Target(目標對象):被代理對象,被通知的對象,被增強的類對象。

    Weaving(織入):將通知應用到連接點形成切入點的過程

    Proxy(代理):將通知織入到目標對象之后形成的代理對象

    aspect(切面):切入點+通知————通知(Advice)說明了干什么的內容(即方法體代碼)和什么時候干(什么時候通過方法名中的before,after,around等就能知道),二切入點說明了在哪干(指定到底是哪個方法),切點表達式等定義。

    雖然現在都用Maven項目構建,但是不能忘記,使用aop需要用到的包:spring-aop + spring-aspects ? ? + springsource.org.aopalliance ?+ springsource.org.aspectj.weaver

    搜索Java知音公眾號,回復“后端面試”,送你一份Java面試題寶典.pdf

    關于AOP看一個小例子:

    1、準備目標對象(被代理對象,被通知的對象,被增強的類對象)

    2、準備通知(被增強方法的代碼,想要實現功能的方法代碼)

    3、配置 applicationContext.xml

  • 導入aop(約束)命名空間

  • 配置目標對象

  • 配置通知對象

  • 配置將通知織入目標對象

  • 4、測試

    總結:通知的幾種類型
    ?? ?1.前置通知———目標方法運行之前調用
    ?? ?2.后置通知———目標方法運行之后調用(如果出現異常不調用)
    ?? ?3.環繞通知———目標方法之前和之后都調用
    ?? ?4.異常攔截通知———如果出現異常,就會調用
    ?? ?5.后置通知———目標方法運行之后調用(無論是否出現異常都會調用)

    7、spring中的aop使用注解配置

    1、applicationContext.xml中配置目標對象,通知對象,開啟使用注解完成織入

    2、@Aspect注解代表該類是個通知類,書寫切點表達式@Pointcut("execution(返回值 全類名.方法名(參數))")

    注意環繞通知需要這么寫:

    public?void?around(ProceedingJoinPoint?proceedingJoinPoint)?throws?Throwable?{//環繞方法執行前//proceedingJoinPoint.proceed();表示對攔截的方法進行放行//若注釋proceedingJoinPoint.proceed()則不會執行被AOP匹配的方法proceedingJoinPoint.proceed();//環繞方法執行后}

    AOP注解解析:

    @Before?前置通知(Before advice)?:在某連接點(JoinPoint)——核心代碼(類或者方法)之前執行的通知,但這個通知不能阻止連接點前的執行。為啥不能阻止線程進入核心代碼呢?因為@Before注解的方法入參不能傳ProceedingJoinPoint,而只能傳入JoinPoint。要知道從aop走到核心代碼就是通過調用ProceedingJionPoint的proceed()方法。而JoinPoint沒有這個方法。?
    這里牽扯區別這兩個類:Proceedingjoinpoint 繼承了 JoinPoint 。是在JoinPoint的基礎上暴露出 proceed 這個方法。proceed很重要,這個是aop代理鏈執行的方法。暴露出這個方法,就能支持 aop:around 這種切面(而其他的幾種切面只需要用到JoinPoint,這跟切面類型有關), 能決定是否走代理鏈還是走自己攔截的其他邏輯。建議看一下 JdkDynamicAopProxy的invoke方法,了解一下代理鏈的執行原理。這樣你就能明白 proceed方法的重要性。

    @After?后通知(After advice) :當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。

    @AfterReturning?返回后通知(After return advice) :在某連接點正常完成后執行的通知,不包括拋出異常的情況。

    @Around?環繞通知(Around advice) :包圍一個連接點的通知,類似Web中Servlet規范中的Filter的doFilter方法。可以在方法的調用前后完成自定義的行為,也可以選擇不執行。這時aop的最重要的,最常用的注解。用這個注解的方法入參傳的是ProceedingJionPoint pjp,可以決定當前線程能否進入核心方法中——通過調用pjp.proceed();

    @AfterThrowing?拋出異常后通知(After throwing advice) :在方法拋出異常退出時執行的通知。

    8、spring整合jdbc

    spring中提供了一個可以操作數據庫的對象,對象封裝了jdbc技術? ————JDBCTemplate JDBC模板對象,而JdbcDaoSupport則對JdbcTemplate進行了封裝,所以要操作JdbcTemplate,或只需要繼承JdbcDaoSupport即可。

    依賴關系配置:

    測試:

    9、spring中的aop事務

    事務的四大基本特性:

    事物的概述

    ⑴?原子性(Atomicity)

    原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

    ⑵?一致性(Consistency)

    一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態。

    拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉賬,轉幾次賬,事務結束后兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。

    ⑶?隔離性(Isolation)

    隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。

    即要達到這么一種效果:對于任意兩個并發的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在并發地執行。

    關于事務的隔離性數據庫提供了多種隔離級別,稍后會介紹到。

    ⑷?持久性(Durability)

    持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。

    例如我們在使用JDBC操作數據庫時,在提交事務方法后,提示用戶事務操作完成,當我們程序執行完成直到看到提示后,就可以認定事務以及正確提交,即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因為故障而沒有執行事務的重大錯誤。

    關于事務的隔離級別:https://blog.csdn.net/itcats_cn/article/details/81487466

    spring中事務的分類:

    spring中事務可以分為編程式事務控制和聲明式事務控制。

    編程式事務控制

    自己手動控制事務,就叫做編程式事務控制。

    Jdbc代碼:

    ?Conn.setAutoCommit(false);??//?設置手動控制事務

    Hibernate代碼:

    Session.beginTransaction();????//?開啟一個事務

    【細粒度的事務控制:可以對指定的方法、指定的方法的某幾行添加事務控制】

    (比較靈活,但開發起來比較繁瑣:每次都要開啟、提交、回滾.)

    聲明式事務控制

    Spring提供了對事務的管理, 這個就叫聲明式事務管理。

    Spring提供了對事務控制的實現。用戶如果想用Spring的聲明式事務管理,只需要在配置文件中配置即可;?不想使用時直接移除配置。這個實現了對事務控制的最大程度的解耦。

    Spring聲明式事務管理,核心實現就是基于Aop。

    【粗粒度的事務控制:只能給整個方法應用事務,不可以對方法的某幾行應用事務。】

    (因為aop攔截的是方法。)

    Spring聲明式事務管理器類:

    Jdbc技術:DataSourceTransactionManager

    Hibernate技術:HibernateTransactionManager

    有一點需要注意的:若為編程式事務控制,則開啟事務后一定要手動釋放(提交或回滾),否則長期占用內存,有可能報事務異常

    spring封裝了事務管理的代碼(打開,提交,回滾事務)

    事務操作對象,因為在不同平臺,操作事務的代碼各不相同.spring提供了一個接口

    PlatformTransactionManager 接口

    在不同平臺,實現不同的接口即可

    注意:在spring中玩事務管理.最為核心的對象就是TransactionManager對象

    spring管理事務的屬性介紹

    • 事務的隔離級別

    • 是否只讀

    • 事務的傳播行為

    配置事務的核心管理器,它封裝了所有事務,依賴于連接池(DataSourceTransactionManager)

    xml中配置通知

    配置將通知織入目標

    10、spring中aop管理事務 注解使用步驟

    在需要管理的方法或者類中聲明配置事務管理

    @Transactional(isolation=Isolation.REPEATABLE_READ,readOnly=false,propagation=Propagation.REQUIRED) 推薦文章
    • 14個項目!

    • 一款小清新的 SpringBoot+ Mybatis 前后端分離后臺管理系統項目

    • 47K Star 的SpringBoot+MyBatis+docker電商項目,附帶超詳細的文檔!

    • 寫博客能月入10K?

    • 一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)

    更多項目源碼
    • 這或許是最美的Vue+Element開源后臺管理UI

    • 推薦一款高顏值的 Spring Boot 快速開發框架

    • 一款基于 Spring Boot 的現代化社區(論壇/問答/社交網絡/博客)

    • 13K點贊都基于 Vue+Spring 前后端分離管理系統ELAdmin,大愛

    • 想接私活時薪再翻一倍,建議根據這幾個開源的SpringBoot

    總結

    以上是生活随笔為你收集整理的大佬把Spring框架总结的「无比详细」,不信你学不会!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人黄色三级视频 | 毛茸茸多毛bbb毛多视频 | 东北少妇露脸无套对白 | 中文字幕免费在线播放 | a黄视频| 国产日本精品 | 久草a在线| 喷水了…太爽了高h | 女人裸体免费网站 | 男人深夜网站 | 亚洲天码中字 | 四虎8848精品成人免费网站 | 好吊妞一区二区三区 | 欧美色xxxxx 日本精品一区二区三区四区的功能 | 日韩精品在线观看免费 | 欧美高清二区 | 91免费在线观看网站 | 日韩v片 | 激情网av | 成年人午夜免费视频 | 69性影院| 亚洲欧美日韩成人 | 99久久精品一区二区 | 欧洲一级黄| 国产精品久久一区二区三区 | 五月天综合激情 | 国产精品四虎 | 女人的天堂av在线 | 欧美午夜精品久久久 | 日本阿v视频 | 亚洲国产果冻传媒av在线观看 | 久久久久久国产视频 | 在线免费av网址 | 中文字幕在线观看二区 | 人妻无码一区二区三区免费 | 郑艳丽三级 | 亚洲国产一区二区三区在线观看 | www麻豆| 黄色在线播放 | 精彩久久 | 十大黄台在线观看 | 日日影院| 91福利免费 | 在线视频污| 一级黄色片免费看 | 黄色一级视频免费 | 日韩免费视频一区二区视频在线观看 | 成人精品在线观看视频 | 久久九九国产视频 | 日韩激情网站 | 97激情| 国产在线不卡av | 毛片其地| 男女做激情爱呻吟口述全过程 | 国产一区二区视频免费在线观看 | 日韩免费一区 | 欧美亚洲国产视频 | 深夜福利免费在线观看 | 欧美日韩亚洲国产 | 色激情网 | 久久久高潮| 五月激情综合婷婷 | 丁香婷婷激情 | 污污内射在线观看一区二区少妇 | 影音先锋中文字幕一区 | 欧美极品在线 | 亚洲伊人精品 | 制服丝袜av一区二区三区下载 | 极品女神无套呻吟啪啪 | 亚洲欧美综合一区二区 | 中文字幕亚洲国产 | av生活片| 99re中文字幕 | 一区二区三区在线 | 国产精品久久久久高潮 | 人人干人人模 | 亚洲国产果冻传媒av在线观看 | 亚洲无码久久久久 | 在线成人| 香蕉视频国产 | 88国产精品视频一区二区三区 | 国产一伦一伦一伦 | 欧美一级淫片免费视频黄 | 女同调教视频 | www.youjizz日本| 亚洲影院在线 | 姑娘第5集高清在线观看 | 91爽爽| 欧美日本国产在线 | 日韩欧美不卡 | 久久精品国产欧美亚洲人人爽 | 性欧美18一19内谢 | 亚洲成网 | 欧美一区二区在线视频观看 | 成人免费在线视频网站 | 国产欧美日韩综合精品一区二区三区 | 亚洲欧美日本一区 | 男女高h视频| 中国免费看的片 |