Mycat和Mysql搭建高可用企業數據庫集群

個人背景

如標題所示,我的個人背景非常簡單,Java開發經驗1年半,學歷普通,2本本科畢業,畢業后出來就一直在Crud,在公司每天重復的工作對我的技術提升并沒有什么幫助,但小鎮出來的我也深知自我努力的重要性,想要改變“命運”,沒有背景沒有資本的人,只能通過勤奮獲得。

幸運女神往往會眷顧努力的人,所以當好運降臨到我頭上,我并不詫異,目前拿到了美團30K的offer,下文也不說廢話,主要分享我這次“美團面試經歷”和“個人學習方法”,希望能幫助到你們。

1年半經驗,2本學歷,Curd背景,竟給30K,我的美團Offer終于來了

二、Spring生命周期的大膽猜測

這里分享一個閱讀源碼的小技巧:捉大放小,連蒙帶猜!8字真言,我們在閱讀源碼過程中,因為你要知道,每一個被開源出來的優秀框架,其源碼的體系都是極其龐大復雜的,我們不能面面俱到,所以在看源碼過程中一定不能被細枝末節纏住,一定要先理清楚整個框架的一個大致思想和大致的框架體系,再去搞那些細枝末節,其效率會好很多,其次在看源碼過程中,我們一定要大膽的去想,去猜測,如果這個功能讓你自己去寫,你會怎么實現!

我們今天學習SpringBean的生命周期也是按照這個8字真言去學習,通過我們之前所學,Spring大致有以下的功能:

  1. 他會幫我們自動的創建對象然后保存起來!
  2. 他會幫我們完成屬性的填充!
  3. 如果我們設置了Aop的功能,他會幫我們自動的代理,實現切面功能!

我們從平常的使用中,至少可以得知以上的三點,如果讓你自己去實現,必會如何實現呢?

  • 首先他既然能夠幫我們自己創建對象,那么他肯定是通過反射來創建的,通過反射來創建,就必定繞不過去要使用Class對象創建,那么我們如何獲取Class對象呢? 去掃描項目,將指定的包下的加了注解的類文件切割獲取Class名稱,通過反射加載Class名稱,反射創建java對象!
  • 我們要完成屬性的填充,為了方便和性能方面,我肯定會把這些創建好的對象保存起來,無疑Map容器是最合適的!
  • 我們在創建一個對象完成之后,反射拿到里面的屬性,如果需要填充,我們先去我們之前保存的容器里面去取,取不出來在反射吧這個依賴的屬性創建出來,然后填充進對象再保存在容器里面,從而完成了屬性的注入!
  • 填充完成屬性之后,我們那當前對象,取與Aop邏輯進行對比,判斷是否需要代理,不需要則創建完成,保存進Map容器,需要代理則對當前這個類進行jdk或者cglib的代理然后再保存進容器里面!

于是乎,我們自己實現了一個Spring管理一個Bean的所有過程,畫個圖,他大概長這樣!

自己實現看起來,整個流程就很清晰,掃描、創建、注入、代理、保存一應俱全,但是Spring的實現方式遠比我們自己實現的要復雜的多得多!

三、Spring的生命周期流程

Spring作者希望,Spring再著手管理一個Bean的時候,它希望能夠讓Spring的使用者能夠插手,Spring把一個類對象變成一個Java Object的每一步,怎么理解呢?

比如我們買了一棟新房子,這個房子需要取裝修,你自己去裝修誠然不夠專業,不能夠面面俱到,所以是我們就找了一個裝修公司幫助我們裝修新房,于是裝修公司就開始預先畫好的圖紙進行裝修,但是在裝修的過程中,你為了讓自己的新家更加溫馨,你想掛一些壁畫在墻上,但是圖紙上卻沒有!于是你就找裝修公司,要求裝修公司在新家的墻上掛上一些壁畫!裝修公司在接受到你的請求之后,就吩咐裝修的工人在圖紙之外去給你在墻上掛上壁畫之后,然后再接著裝修!

上面這個小故事有 這樣幾個角色,我們把它和Spring對照起來!

  • 你:代表框架的使用者!
  • 新房:代表一個Class文件,你自己也能夠裝修,但是不夠專業,所以交給裝修公司! 那么你自己創建對象可能某些使用用起來很麻煩,所以我們交給了Spring容器!
  • 裝修公司:代表著Spring容器!
  • 圖紙:代表預設步驟,Spring原本就存在的步驟!
  • 工人:Spring提供的各種接口!我們可以通過Spring工廠提供的接口做各種自定義的配置!

上面的小故事,大致可以描述Spring生命周期的核心思想!Spring再對一個Class文件實例化成具體的Spring Bean的時候,它提供了各種接口,由我們自己實現!然后再實例化過程中,不同的時機,去調用不同的接口!從而完成Spring的整個生命周期的創建!

Spring的生命周期大致分為以下部分!

  1. 掃描項目,將項目指定目錄下的Class文件轉換為Class對象!

  2. 讀取Class對象屬性包裝為BeanDefinition,然后保存再一個Map中!(不難理解,他是為了后續創建或者讀取這個類的信息更加方便取而創立的)

  3. 將全部的類轉化為 BeanDefinition 并保存之后,開始調用第一個回調接口BeanFactoryPostProcessor#postProcessBeanFactory()!

    • 它的調用時機是將掃描到的Class文件轉換為 BeanDefinition 之后調用的,我們可以通過回調的方法獲取所有的BeanDefinition ,而后續的所有對Class的操作都是基于BeanDefinition 操作的,所以,我們可以通過修改它,來改變后續的流程!
  4. 先從當前的容器對象取當前要創建的對象,當取出來的對象為null時開始著手創建對象!

  5. 做一系列的驗證,比如驗證這個類是否被排除、是否正在創建中、是否有依賴Bean【@DependsOn】注解、是否時單例等等!

  6. 驗證通過之后,開始通過反射創建這個對象!

  7. 合并BeanDefinition ,這里涉及到Spring之前版本使用的父子容器的概念,屬于另外一個知識點不做講解!

  8. 判斷當前對象是不是單例、是不是支持循環引用、是不是正在創建等!

  9. 執行第二個接口回調InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation()方法!

    • 它的執行時機時實例化完成之后,屬性填充之前,它的返回值是一個布爾值,當返回false時,不做自動屬性填充!
  10. 執行第三個接口回調InstantiationAwareBeanPostProcessor#postProcessProperties()方法!

    • 他的執行時機是,實例化之后,屬性填充檢查之后,屬性填充之前!它會返回一個屬性,后續的屬性填充會使用這個方法返回的值!我們可以在這個方法里面修改對應Bean的注入的值!
  11. 填充屬性到對象!

  12. 調用第四個回調接口BeanNameAware#setBeanName()方法!

    • 調用時機:屬性填充給完畢后,調用初始化方法之前;它的功能是能獲取bean的Name!
  13. 調用第五個回調接口BeanClassLoaderAware#setBeanClassLoader()

    • 調用時機:BeanNameAware之后,他的功能是傳入bean的類加載器;
  14. 調用第六個回調接口BeanFactoryAware#setBeanFactory()!

    • 調用時機:BeanClassLoaderAware之后,用于設置beanFactory!
  15. 調用第七個回調接口BeanPostProcessor#postProcessBeforeInitialization()方法

    • 調用時機是部分Aware之后,初始化方法之前!傳入當前實例化好的對象和beanName,再初始化前做修改!
  16. 回調第八個比較重要的生命周期的初始化方法,它可以是一個InitializingBean接口的bean,也可以是xml中配置的類,也可以是被加了@PostConstruct注解的方法!

    • 該方法內部邏輯可以用戶自己編寫,調用時機為:實例化完成之后調用!
  17. 回調第九個回調接口 BeanPostProcessor#postProcessAfterInitialization()方法!

    • 該方法的調用時機為初始化方法執行之后,這里也是Bean實例化后的最后一步,也是SpringAop實現的重要的一步!
  18. 注冊銷毀方法,以便Spring容器銷毀的時候進行方法的銷毀!

整體的方法流程示例圖如下:

四、對應源碼結構圖

最后

送大家一個小福利,點擊領取Java全套進階資料

m/doc/DSmxTbFJ1cmN1R2dB)**

[外鏈圖片轉存中…(img-rZNaTsWe-1624684547280)]

[外鏈圖片轉存中…(img-4XB840rx-1624684547282)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385873.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java過濾器如何操作數據庫_jsp – 使用Java中的過濾器驗證用戶名,密碼(與數據庫聯系)...

String sql”select * from reg where username”user”‘ and pass”pwd”‘”;這是一個非常糟糕的做法.這種方法要求用戶名和密碼都通過請求傳遞普通香草.而且,你有一個SQL注入攻擊漏洞.利用會話,在JSP / Servlet中你有HttpSession.實際上也沒有必要在使用過濾器的每個請求上…

MySQL+Tomcat+JVM,看完還怕面試官

前言 我朋友也是個寫了四年Java代碼的程序員,跟女友已經戀愛多年,最近突然結婚了。 他結婚以前,換了一家公司,咱倆就好久沒見過面了。剛好今天出門辦事碰上了,找了一家店坐一起喝酒聊天。 我聊天時打趣他&#xff1…

java因子分析_因子分析(Factor Analysis)

1 問題之前我們考慮的訓練數據中樣例的個數m都遠遠大于其特征個數n&#xff0c;這樣不管是進行回歸、聚類等都沒有太大的問題。然而當訓練樣例個數m太小&#xff0c;甚至m<多元高斯分布的參數估計公式如下&#xff1a;分別是求mean和協方差的公式&#xff0c;表示樣例&#…

MySQL+多線程+Redis+算法+網絡

開頭 我們面試的時候 &#xff0c;經常會被問這種到問題:Spring中bean的循環依賴怎么解決&#xff1f; Spring中bean的加載過程&#xff1f; spring相關的問題一直是大廠面試常問到的一個問題,也是一直困擾這我們&#xff0c;不知道從哪里下手&#xff0c;今天舉例分析大廠的一…

python 函數進度條怎么_python輸出結果刷新及進度條的實現操作

print函數python輸出主要使用print函數&#xff0c;print函數介紹&#xff1a;print(*objects, sep" ", end"", filesys.stdout, flushFalse)*objects表示要打印的值&#xff0c;表示多個無名參數或需要打印的值&#xff1b;sep" "&#xff0c;對…

MySQL優化原理分析及優化方案總結

前言 今天中午收到我司安全部發了一封郵件&#xff1a;Jackson存在安全漏洞。查了一下&#xff0c;這件事并不算很新鮮了&#xff08;已經過了5天的樣子&#xff09;&#xff0c;本文來聊聊吧。 說起來還蠻戲劇化&#xff1a;阿里云向Jackson官方提交了一個Jackson序列化安全…

MySQL千萬數據量深分頁優化

前言 提到MySQL的事務&#xff0c;我相信對MySQL有了解的同學都能聊上幾句&#xff0c;無論是面試求職&#xff0c;還是日常開發&#xff0c;MySQL的事務都跟我們息息相關。 而事務的ACID&#xff08;即原子性Atomicity、一致性Consistency、隔離性Isolation、持久性Durabili…

Mysql和Redis數據同步該怎么做

前言 算法血拼&#xff1a;Google百度Alibaba字節Tencent網易360拼夕夕美團 不知不覺雙11就來了,轟轟烈烈的秋招也完美結束了,不知算法與數據結構成為了多少小伙伴進擊大廠的絆腳石&#xff1f; 恰好&#xff0c;我這兩天花了點時間&#xff0c;整理了些各大廠&#xff08;G…

python字符串是用雙引號括起來的_用python連接字符串列表并用引號將每個字符串括起來...

您也可以執行一個format調用>>> words [hello, world, you, look, nice]>>> "{0}".format(", ".join(words))"hello", "world", "you", "look", "nice"更新&#xff1a;一些基準測試…

java源代碼保存在擴展名為,看完跪了

正文 在實際的工作項目中&#xff0c; 緩存成為高并發、高性能架構的關鍵組件 &#xff0c;那么Redis為什么可以作為緩存使用呢&#xff1f;首先可以作為緩存的兩個主要特征&#xff1a; 在分層系統中處于內存/CPU具有訪問性能良好&#xff0c;緩存數據飽和&#xff0c;有良好…

java源碼文件丟恢復需要多少錢,上岸螞蟻金服!

京東Java研發崗一面&#xff08;基礎面&#xff0c;約1小時&#xff09; 自我介紹&#xff0c;主要講講做了什么和擅長什么 springmvc和spring-boot區別 Autowired的實現原理 Bean的默認作用范圍是什么&#xff1f;其他的作用范圍&#xff1f; 索引是什么概念有什么作用&am…

php 靜態方法特點,淺析php靜態方法與非靜態方法的用法區別

在php編程中&#xff0c;static關鍵字聲明一個屬性或方法是和類相關的&#xff0c;而不是和類的某個特定的實例相關&#xff0c;因此&#xff0c;這類屬性或方法也稱為“類屬性”或“類方法”如果訪問控制權限允許&#xff0c;可不必創建該類對象而直接使用類名加兩個冒號“::”…

java特性多態,90%的人看完都說好

01.第一份資料是圖解網絡 根據讀者閱讀偏好不同&#xff0c;共出了兩個版本風格的 PDF&#xff0c;分別是亮白版本和暗黑版本。 02.第二份資料是計算機的相關知識 看完能讓你對計算機有一個基礎的了解和入門&#xff0c;是培養你 內核 的基礎&#xff0c;我們看下目錄大綱 基…

php session 釋放,php中刪除Session和銷毀Session的方法

刪除某個session值可以使用PHP的unset函數&#xff0c;刪除后就會從全局變量$_SESSION中去除&#xff0c;無法訪問。session_start();$_SESSION[name] jobs;unset($_SESSION[name]);echo $_SESSION[name]; //提示name不存在如果要刪除所有的session&#xff0c;可以使用sessio…

java環境變量怎么配置,詳解系列文章

Git是什么 在回憶Git是什么的話&#xff0c;我們先來復習這幾個概念哈~ 什么是版本控制&#xff1f; 百度百科定義是醬紫的~ 版本控制是指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理&#xff0c;是軟件配置管理的核心思想之一。 那些年&#xff0c;…

php數據接口api安全,API接口數據安全之授權碼sign

**API接口數據安全之授權碼sign**>[success] 1. ASE加密方式加密~~~class Aes{private $key null;/***param String $key 密鑰*return String*/public funciton __construct(){//配置文件中的asekey 服務端及客戶端必須保持一致 且加密key必須為16 、32、64位$this->key…

java環境變量的配置與詳解,這些知識你必須拿下

1.三重心智模型 先給大家科普一個概念&#xff0c;“三重心智模型”。 認知科學家斯坦諾維奇&#xff0c;將人的心智模式&#xff0c;分成了三個部分。 第一層是自主心智&#xff0c;自主心智是我們通過進化與內隱學習獲得。比如&#xff0c;我們看到蛇就會害怕&#xff0c;情…

centos php安裝redis擴展,Centos7編譯安裝redis、php安裝phpredis擴展

解壓 進入 make&#xff1a;# tar zxvf redis-4.0.9.tar.gz# cd redis-4.0.9/# make# cd src# make install為了方便管理&#xff0c;將Redis文件中的配置文件和常用命令移動到統一文件中&#xff1a;# mkdir –p /usr/local/redis/bin# mkdir –p /usr/local/redis/etc# cp /t…

java環境變量的配置步驟,實現原理分析

1.筆試常見的問題&#xff1f; 面試常見的問題上面給的面試題鏈接基本都有。我只提幾點&#xff1a; 寫SQL&#xff1a;寫SQL很常考察group by、內連接和外連接。手寫代碼&#xff1a;手寫代碼一般考單例、排序、線程、消費者生產者。我建議排序算法除了冒泡排序&#xff0c;…

php 方法參數傳遞,在PHP中將實例方法作為參數傳遞

我想創建一個Listener類class Listener {var $listeners array();public function add(callable $function) {$this->listeners[] $function;}public function fire() {foreach($this->listeners as $function) {call_user_func($function);}}}class Foo {public funct…