最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring底層核心源碼原理解析

 更新時間:2023年09月08日 09:55:48   作者:小滿和小晨  
這篇文章主要介紹了Spring底層核心源碼原理解析,當在某個方法上加了@Transactional注解后,就表示該方法在調(diào)用時會開啟Spring事務,而這個方法所在的類所對應的Bean對象會是該類的代理對象,需要的朋友可以參考下

Spring核心知識點

本文章將對以下Spring核心知識進行介紹。

1、Bean的生命周期底層原理

2、依賴注入底層原理

3、初始化底層原理

4、推斷構造方法底層原理

5、AOP底層原理

6、Spring事務底層原理

這是入門時寫的Spring代碼

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

但是用ClassPathXmlApplicationContext其實已經(jīng)過時了,在新版的Spring MVC和Spring Boot的底層主要用的都是AnnotationConfigApplicationContext,比如:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
//ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) context.getBean("userService");
userService.test();

AppConfig.class和spring.xml一樣,表示Spring的配置,比如可以指定掃描路徑,可以直接定義Bean,比如:

spring.xml中的內(nèi)容為:

<context:component-scan base-package="com.zhouyu"/>
<bean id="userService" class="com.zhouyu.service.UserService"/>

AppConfig中的內(nèi)容為:

@ComponentScan("com.zhouyu")
public class AppConfig {
 @Bean
 public UserService userService(){
  return new UserService();
 }
}

Spring中是如何創(chuàng)建一個對象?

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) context.getBean("userService");
userService.test();

在調(diào)用AnnotationConfigApplicationContext的構造方法時,也就是第一行代碼,會去做一些事情:

1、解析AppConfig.class,得到掃描路徑

2、遍歷掃描路徑下的所有Java類,如果發(fā)現(xiàn)某個類上存在@Component、@Service等注解,那么Spring就把這個類記錄下來,存在一個Map中,比如Map<String, Class>。(實際上,Spring源碼中確實存在類似的這么一個Map,叫做BeanDefinitionMap)

3、Spring會根據(jù)某個規(guī)則生成當前類對應的beanName,作為key存入Map,當前類作為value

這樣,但調(diào)用context.getBean(“userService”)時,就可以根據(jù)"userService"找到UserService類,從而就可以去創(chuàng)建對象了。

Bean的創(chuàng)建過程

Bean創(chuàng)建的生命周期,大致過程如下

1、利用該類的構造方法來實例化得到一個對象(但是如何一個類中有多個構造方法,Spring則會進行選擇,這個叫做推斷構造方法

2、得到一個對象后,Spring會判斷該對象中是否存在被@Autowired注解了的屬性,把這些屬性找出來并由Spring進行賦值(依賴注入

3、依賴注入后,Spring會判斷該對象是否實現(xiàn)了BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口,如果實現(xiàn)了,就表示當前對象必須實現(xiàn)該接口中所定義的setBeanName()、setBeanClassLoader()、setBeanFactory()方法,那Spring就會調(diào)用這些方法并傳入相應的參數(shù)(Aware回調(diào)

4、Aware回調(diào)后,Spring會判斷該對象中是否存在某個方法被@PostConstruct注解了,如果存在,Spring會調(diào)用當前對象的此方法(初始化前

5、緊接著,Spring會判斷該對象是否實現(xiàn)了InitializingBean接口,如果實現(xiàn)了,就表示當前對象必須實現(xiàn)該接口中的afterPropertiesSet()方法,那Spring就會調(diào)用當前對象中的afterPropertiesSet()方法(初始化

6、最后,Spring會判斷當前對象需不需要進行AOP,如果不需要那么Bean就創(chuàng)建完了,如果需要進行AOP,則會進行動態(tài)代理并生成一個代理對象做為Bean(初始化后

通過最后一步,可以發(fā)現(xiàn),當Spring根據(jù)UserService類來創(chuàng)建一個Bean時:

  • 如果不用進行AOP,那么Bean就是UserService類的構造方法所得到的對象。
  • 如果需要進行AOP,那么Bean就是UserService的代理類所實例化得到的對象,而不是UserService本身所得到的對象。

Bean對象創(chuàng)建出來后:

  • 如果當前Bean是單例Bean,那么會把該Bean對象存入一個Map<String, Object>,Map的key為beanName,value為Bean對象。這樣下次getBean時就可以直接從Map中拿到對應的Bean對象了。(實際上,在Spring源碼中,這個Map就是單例池)
  • 如果當前Bean是原型Bean,那么后續(xù)沒有其他動作,不會存入一個Map,下次getBean時會再次執(zhí)行上述創(chuàng)建過程,得到一個新的Bean對象。

推斷構造方法

如果一個類存在多個構造方法,Spring會使用哪個呢?

1、如果一個類只存在一個構造方法,不管該構造方法是無參構造方法,還是有參構造方法,Spring都會用這個構造方法

2、如果一個類存在多個構造方法

  • 這些構造方法中,存在一個無參的構造方法,那么Spring就會用這個無參的構造方法
  • 這些構造方法中,不存在一個無參的構造方法,那么Spring就會報錯
  • 如果某個構造方法上加了@Autowired注解,那就表示程序員告訴Spring就用這個加了注解的方法,那Spring就會用這個加了@Autowired注解構造方法了

AOP大致流程

AOP就是進行動態(tài)代理,在創(chuàng)建一個Bean的過程中,Spring在最后一步會去判斷當前正在創(chuàng)建的這個Bean是不是需要進行AOP,如果需要則會進行動態(tài)代理。

如何判斷當前Bean對象需不需要進行AOP:

1、找出所有的切面Bean

2、遍歷切面中的每個方法,看是否寫了@Before、@After等注解

3、如果寫了,則判斷所對應的Pointcut是否和當前Bean對象的類是否匹配

4、如果匹配則表示當前Bean對象有匹配的的Pointcut,表示需要進行AOP ?

Spring事務

當在某個方法上加了@Transactional注解后,就表示該方法在調(diào)用時會開啟Spring事務,而這個方法所在的類所對應的Bean對象會是該類的代理對象。 ?

Spring事務的代理對象執(zhí)行某個方法時的步驟:

1、判斷當前執(zhí)行的方法是否存在@Transactional注解

2、如果存在,則利用事務管理器(TransactionMananger)新建一個數(shù)據(jù)庫連接

3、修改數(shù)據(jù)庫連接的autocommit為false

4、執(zhí)行target.test(),執(zhí)行程序員所寫的業(yè)務邏輯代碼,也就是執(zhí)行sql

5、執(zhí)行完了之后如果沒有出現(xiàn)異常,則提交,否則回滾

Spring事務是否會失效的判斷標準:某個加了@Transactional注解的方法被調(diào)用時,要判斷到底是不是直接被代理對象調(diào)用的,如果是則事務會生效,如果不是則失效。

到此這篇關于Spring底層核心源碼原理解析的文章就介紹到這了,更多相關Spring核心原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決springcloud集成nacos遇到的問題

    解決springcloud集成nacos遇到的問題

    這篇文章介紹了如何解決springcloud集成nacos遇到的問題,文章中有詳細的代碼示例,需要的朋友可以參考一下
    2023-04-04
  • Spring Boot從main方法到內(nèi)嵌Tomcat的全過程(自動化流程)

    Spring Boot從main方法到內(nèi)嵌Tomcat的全過程(自動化流程)

    SpringBoot啟動始于main方法,創(chuàng)建SpringApplication實例,初始化上下文,準備環(huán)境,刷新容器并啟動內(nèi)嵌Tomcat,通過自動配置加載必要類完成應用部署,本文給大家介紹Spring Boot從main方法到內(nèi)嵌Tomcat的全過程,感興趣的朋友一起看看吧
    2025-07-07
  • 分布式框架Zookeeper?api的使用介紹

    分布式框架Zookeeper?api的使用介紹

    Zookeeper作為?個分布式框架,主要用來解決分布式?致性問題,它提供了簡單的分布式原語,并且對多種編程語?提供了API,所以接下來重點來看下Zookeeper的java客戶端API使用方式
    2022-09-09
  • 利用Java Set 去除重復object的方法

    利用Java Set 去除重復object的方法

    下面小編就為大家?guī)硪黄肑ava Set 去除重復object的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • java實現(xiàn)圖書館管理系統(tǒng)

    java實現(xiàn)圖書館管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)圖書館管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Java數(shù)組集合的深度復制代碼實例

    Java數(shù)組集合的深度復制代碼實例

    這篇文章主要介紹了Java數(shù)組集合的深度復制代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Netty學習教程之基礎使用篇

    Netty學習教程之基礎使用篇

    Netty是由JBOSS提供的一個Java開源框架。Netty提供異步的、事件驅動的網(wǎng)絡應用程序框架和工具,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡服務器和客戶端程序。下面這篇文章主要給大家介紹了關于Netty基礎使用的相關資料,需要的朋友可以參考下。
    2017-05-05
  • Java文件與Base64之間的轉化方式

    Java文件與Base64之間的轉化方式

    這篇文章介紹了如何使用Java將文件(如圖片、視頻)轉換為Base64編碼,以及如何將Base64編碼轉換回文件,通過提供具體的工具類實現(xiàn),作者希望幫助讀者更好地理解和應用這一過程
    2025-02-02
  • java客戶端Jedis操作Redis Sentinel 連接池的實現(xiàn)方法

    java客戶端Jedis操作Redis Sentinel 連接池的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava客戶端Jedis操作Redis Sentinel 連接池的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • JAVA后端應該學什么技術

    JAVA后端應該學什么技術

    這篇文章主要介紹了JAVA后端應該學什么技術,對JAVA感興趣的同學,可以規(guī)劃一下
    2021-04-04

最新評論

习水县| 东兴市| 柳河县| 宁夏| 介休市| 延长县| 隆昌县| 天水市| 金寨县| 苏尼特左旗| 苍梧县| 常山县| 奎屯市| 交城县| 西安市| 和田市| 天全县| 逊克县| 紫云| 越西县| 屏南县| 乐平市| 西青区| 始兴县| 宜昌市| 柘城县| 灌云县| 丹凤县| 无锡市| 米易县| 东丽区| 鹰潭市| 呼和浩特市| 马山县| 亳州市| 景泰县| 大城县| 枣庄市| 万宁市| 铁力市| 英山县|