標籤: 網頁設計公司推薦

  • 區塊鏈和分佈式数字賬本正火?如何在7天內快速掌握這些必備的知識

    前言

    讀研期間,幾次被問到:“什麼是區塊鏈?”“我怎麼學習區塊鏈”。甚至跟“上至九十九”(爺爺奶奶),“下至剛會走的”(小學生的弟弟妹妹)解釋過我的研究內容。因此想總結一份7天的學習計劃(大量資料警告),讓那些對區塊鏈感興趣的人快速入門。區塊鏈技術的被運用到各行各業,尤其是各界(商界和政府)都對區塊鏈技術創新高度重視。本文總結了諸多入門區塊鏈的主要資源,博客、書籍和視頻,希望幫你用7天時間獲取必要的區塊鏈基礎知識。

    作者宇宙之一粟,轉載請先聲明出處
    公眾號宇宙之一粟,關注公眾號獲取更多相關資源

    介紹

    區塊鏈,剛開始聽起來會很新穎,因為是一個英文組合詞彙( Block + Chain )。區塊:存放數據的載體(想象成箱子),鏈:把這些箱子首尾相連(類似數據結構中的單鏈表)。

    區塊鏈的本質:一個去中心化的分佈式賬本數據庫。其本身是一串使用密碼學相關聯所產生的數據塊,每一個數據塊中包含了多次比特幣網絡交易有效確認的信息。

    區塊鏈技術從比特幣中發展而來,是比特幣的底層技術,和比特幣是相伴相生的關係。目前這項技術已經不僅僅限於比特幣——青出於藍而勝於藍。各行各業開始利用這項技術尋求突破。

    2019年6月,Facebook宣布了其加密貨幣項目——。

    我們國家央行也將發行自己的数字貨幣——( Digital Currency Electronic Payment ),也採用了區塊鏈技術,目前仍處於研究測試過程中。

    2019年10月24日下午,。一時間區塊鏈技術又衝上了風口。

    因此,我們有必要對區塊鏈技術做一個基本的了解。

    如何獲得知識

    如果想快速學習區塊鏈知識:收聽音頻課,閱讀書籍,看論文或在線文章,學習白皮書以及參与區塊鏈的相關學習計劃或在線課程。其他針對想從事更加專業的學習人員——參加編程或智能合約編碼課程。

    應該學習到什麼程度

    在區塊鏈領域工作或打算工作的每個人至少應該能夠理解並編寫一個非常簡單的智能合約,例如以程序語言Solidity通過幾行代碼實現的託管過程。儘管其他人會說,在學習區塊鏈和DLT時應該把重點放在另一個方面,但在我們看來,這是一條清晰的聲明。

    在我們看來,理解簡單的智能合約(例如5-10行代碼)的需求不僅對於信息系統領域的員工很重要,而且在商業,經濟和法律領域也很重要。但是,關於如何配置節點的更深入的技術知識通常不是緊要的,但以後可以獲取。

    任何尋求參与區塊鏈技術並考慮以下步驟的人都可能擁有光榮的職業生涯。我們認為,區塊鏈技術及其日益重要的潛力有可能對感興趣的人的職業道路產生积極影響,因為在這個動態且快速增長的細分市場中,未來幾年甚至數十年內還有很多工作要做。這樣,可以將由於数字化和自動化程度提高而失業(例如在金融部門)的風險降到最低。

    但是感興趣的人如何獲得足夠的知識呢?存在哪些研究區塊鏈技術的機會?本文總結了區塊鏈教育的一些不同策略。我們基本上設計了一個特定的程序,以在大約7個工作日內實現“區塊鏈入門”。

    一、購買或轉讓加密貨幣

    所需時間:0.5天

    除了獲得一些理論知識之外,理解此技術非常重要的是您在操作上“弄髒手”。 它的工作方式如下,為感興趣的人提供有關什麼是區塊鏈技術的最重要學習。

    因此,開始的最佳練習是:購買加密貨幣(例如比特幣)並在全球範圍內進行轉移。 如下所示,請找到分步指南:

    • 在例如或比特派上開設一個帳戶;其他選擇:Bitstamp,Bitrex,Binance。
    • 購買比特幣或者購買以太幣。請注意,萬一使用公鑰或私鑰出錯,這筆錢將不可避免地丟失。因此,遵循此步驟當然是每個人自己的決定。
    • 開設第二個帳戶(上面的示例)。
    • 從第二個帳戶獲取一個錢包地址,該地址類似於以太坊的0xd42899dcC146d4788649e6aa5B09f129fC269127。
    • 第一步,將您購買的一部分以太幣或比特幣轉移到該地址。請注意,以太幣和比特幣的地址不同,因此請謹慎行事,切勿混淆。
    • 現在,您可以看到可以在幾秒鐘(以太)或幾分鐘(比特幣)內將價值發送到世界各地。
    • 一個更高級的步驟,但對理解區塊鏈非常有幫助:將插件添加到Google Chrome互聯網瀏覽器中,以直接訪問以太坊網絡並將您的以太幣存儲在您自己的錢包中。之後,開設一個帳戶並生成您自己的錢包地址。然後,將您的一些以太幣從之前的步驟轉移到這個新生成的錢包中。

    二、音頻課

    所需時間:1.5天

    如果你喜歡聽音頻課,選擇一個合適的音頻可以快速入門:

    • Kryptoshow: Julian Hosp博士很好地介紹了區塊鏈技術和加密貨幣這一主題。播客還涵蓋了高級方面,例如在密碼學和編程方面。在訪問播客。
    • BTC Echo:此播客面向更高級的受眾,重點關注比特幣和加密資產。在訪問播客。
    • 從0到1全面學透區塊鏈音頻教程,在學習

    三、閱讀重要的白皮書

    所需時間:1天

    為了了解區塊鏈技術的起源和概念,有必要研究兩種最重要的加密貨幣比特幣和以太坊的白皮書。其他補充Filecoin白皮書。

    最重要的論文:

    • 比特幣白皮書:中本聰(2008):比特幣:點對點电子現金系統,。
    • 以太坊白皮書:Buterin,V.(2013):以太坊白皮書:下一代智能合約和去中心化應用平台, 。
    • Filecoin白皮書: Protocol Labs(2017):Filecoin: A Decentralized Storage Network,
      (待完善)

    四、觀看視頻

    所需時間:2天

    在通過閱讀有關比特幣和以太坊的原始著作從“科學”角度看待區塊鏈技術之後,您可以使用視頻進一步熟悉該技術並更深入地了解該技術的不同組成部分。我們推薦以下視頻:

    最重要的視頻:

    五、更多文章和網站

    所需時間:1天

    通過遵循建議的步驟,您現在應該已經對技術有了基本的高級知識。現在,是時候更深入地研究區塊鏈技術了。我們建議閱讀以下文章:

    文章或文檔:

    需要了解的項目的網站:

    • 以太坊:
    • EOS:
    • NULS:
    • FISCO BCOS:

    六、更廣泛概述的書籍

    所需時間:2天閱讀

    其他書籍:

    • 中文版(第2版)
    • Andreas M. Antonopoulos / Gavin Wood(2018年):

    Ps: 關注公眾號 宇宙之一粟 回復關鍵字 “區塊鏈” 獲取电子版

    七、認識志同道合之人

    所需時間:參加2次聚會(主要是免費)

    下一步,我們建議您進入區塊鏈社區,並與區塊鏈專家進行首次討論。

    科學論文

    所需時間:0天,因為這是可選的

    如果您打算從科學的角度更多地探討區塊鏈的話題,那麼就有可能研究有關區塊鏈技術的論文。我們將進一步擴大此列表。

    文件:

    • Eyal I , Gencer A E , Sirer E G , et al.
    • Gilad, Yossi & Hemo, Rotem & Micali, Silvio & Vlachos, Georgios & Zeldovich, Nickolai. (2017).
    • Li C , Li P , Zhou D , et al.
    • Yin M , Malkhi D , Reiter M K , et al.
    • Wang, Jiaping & Wang, Hao. (2019).
    • 更多區塊鏈相關論文

    現在?

    重要的是“閱讀”有關區塊鏈和DLT中的教育如何工作的信息。歸根結底,只有一件重要的事情:那就去做。不要只是想,而要行動。

    歡迎評論給我,無論您是否遵循我的建議–並向我提供反饋。如果您還有其他想法,請告訴我們如何學習和使用區塊鏈。如果您使用其他來源來獲取或增加您的區塊鏈知識,那麼如果您能與我分享這些知識,我將非常感激。

    備註

    在Medium看到Education in Blockchain and DLT: How to Acquire the Necessary Knowledge with a Workload of 10 Working Days的一篇博客,但是有很多網站和學習資料使我們不能訪問的。基於此博客,製作了方便我們快速學習並掌握區塊鏈必備知識的這篇文章。

    如果您喜歡本文,將其轉發或分享(附上原文出處),我將非常高興並表示感謝。
    也歡迎關注我的微信公眾號:宇宙之一粟,分享更多資料,與你讀書學習精進。

    參考博客: Authors: Philipp Sandner, Jonas Groß

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

  • 痞子衡嵌入式:串行EEPROM接口事實標準及SPI EEPROM簡介

    痞子衡嵌入式:串行EEPROM接口事實標準及SPI EEPROM簡介

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是EEPROM接口標準及SPI EEPROM

      痞子衡之前寫過一篇文章 ,介紹過并行NOR Flash基本概念。眾所周知,現如今嵌入式非易失性存儲器基本被NOR Flash一統江湖了,但在Flash技術發明之前,EEPROM才是非易失性存儲器的霸主。EEPROM的全稱是”電可擦除可編程只讀存儲器”,即Electrically Erasable Programmable Read-Only Memory,EEPROM技術的發明可是拯救過一大批嵌入式工程師的,畢竟在這之前非易失性存儲器技術的演進分別是ROM(只讀), PROM(只能寫一次), EPROM(紫外線可擦除),擦除方式都不太友好,直到EEPROM的出現才變得人性化。雖說現在Flash是主流,但在較低容量(2Mb以下)尤其是超低容量(1Kb以下)的市場,EEPROM仍然有其不可替代的應用場合。今天痞子衡就來好好聊一聊EEPROM:

    一、EEPROM背景簡介

      聊到EEPROM發展史,不得不提浮柵MOSFET,這是一項發明於1967年的技術,它是所有閃存的基礎。1970年,第一款成功的浮柵型器件-EPROM被發明。1979年,大名鼎鼎的SanDisk(閃迪)創始人Eli Harari,發明了世界上首個電可擦除的浮柵型器件即EEPROM。
      講到EEPROM必然要將它和與其相愛相殺的Flash一起對比。關於Flash大家都很熟悉,但其實Flash全稱應該叫Flash EEPROM,它屬於廣義的EEPROM。而本文主角EEPROM,指的是狹義的EEPROM,Flash和EEPROM最大的區別是:Flash按扇區操作,EEPROM按字節操作。Flash的特點是結構簡單,容量可以做得比較大且在大數據量下的操作速度更快,但缺點是操作過程麻煩,所以Flash適於當不需頻繁改寫的程序存儲器。而在有些應用中往往需要頻繁的改寫某些小量數據且需掉電非易失,傳統結構的EEPROM則非常適合。
      EEPROM不像NOR, NAND Flash技術演進得那麼複雜,因此實際上關於EEPROM並沒有成文的標準,即使最知名的电子行業標準之一JEDEC也沒有關於EEPROM的標準出台,不過各大廠商生產的EEPROM似乎都遵從某種約定的事實標準,這在後面介紹的EEPROM接口命令里顯得尤為明顯。

    二、Serial EEPROM原理

    2.1 Serial EEPROM分類

      從軟件驅動開發角度而言,Serial EEPROM可以從以下幾個方面進一步細分:

    地址碼長度:1byte / 2byte / 3byte
    通信接口類型:I2C / SPI / Microwire / UNIO Bus / Single-Wire

      本文的主要研究對象是SPI接口的EEPROM。

    2.2 SPI EEPROM內存模型

      EEPROM內存單元從大到小一般分為如下4層:Device、Sector、Page、Byte,其中Sector不是必有的,並且Page也只是個結構概念,跟NOR Flash里的Page/Sector意義不一樣,因為Byte就是EEPROM讀寫的最小單元(即可以任意地址隨機訪問),所以你可以把EEPROM當做一個非易失性的RAM。當然有些高端EEPROM中集成了Page/Sector操作命令,這隻是為了讓EEPROM操作效率更高而已。

    2.3 SPI EEPROM信號與封裝

      SPI EEPROM一般有8個腳,除去電源Vcc,地GND/Vss,以及SPI四根信號線(CS#, SCK, SI, SO)不言而喻之外,還有兩根特殊的控制信號,即WP#(寫保護)和HOLD#(掛起)。WP#信號主要是從硬件層面上對EEPROM內存進行保護,防止電路上的噪聲干擾篡改了EEPROM里的內容;而HOLD#則提供EEPROM寫操作暫停的功能,當該信號有效的時候,SI信號輸入將被忽略,因此主機可以做其他更高優先級的事情。

      SPI EEPROM雖然只有8pin,但是封裝種類還是比較齊全的,這其中最經典的當屬JEDEC定義的8-lead SOIC,此外還有TSSOP8, UDFN8, WLCSP8,下圖羅列了常見封裝:

    2.4 SPI EEPROM接口命令

    2.4.1 事實標準

      痞子衡在文章開頭的時候講過,SPI EEPROM並沒有什麼成文的接口命令標準,但是各大廠商生產的SPI EEPROM無一例外都支持下錶的6條命令,即READ(讀內存)、WRITE(寫內存)、WREN(寫使能)、WRDI(寫禁止)、RDSR(讀狀態寄存器)、WRSR(寫狀態寄存器),所以從軟件接口層面而言,這6條命令就是SPI EEPROM事實上的接口命令標準。

      除了6條標準命令外,SPI EEPROM內部還有一個8bit的狀態寄存器,用於反饋命令執行狀態,這8bit狀態寄存器的位定義也是存在如下錶所示的事實標準的:

      不考慮寫保護特性的話,bit0 – RDY#和bit1 – WEL是比較常用的,RDY#位主要用於標示所有涉及改變內存或狀態寄存器的命令的執行結果,WEL位則保存了上一次WREN和WRDI命令的執行結果。狀態寄存器中的其他兩處定義bit7 – WPEN, bit[3:2] – BP[1:0]則主要與寫保護特性有關,它們的具體作用如下:

    2.4.2 廠商個性化

      除了6條事實標準的命令外,有些廠商還實現了一些自定義的命令,這些命令並不一定通用,一般用於較大容量(3byte地址碼,512Kb以上)的EEPROM上。痞子衡找了一款非常經典的EEPROM,來自Microchip的25AA系列(25AA1024),讓我們看看它有啥個性化的命令。這顆EEPROM容量為1Mb,屬於大容量EEPROM,為了提高EEPROM操作效率,Microchip為這顆EEPROM增加了Page/Sector/Chip Erase命令,使得擦除操作效率變高了,如果沒有這些個性化擦除命令,那麼只能通過標準WRITE命令去手動實現擦除操作,既麻煩又低效。

    2.5 SPI EEPROM數據速率

      數據存取速率是個重要的技術指標,咱們來看看SPI EEPROM的讀寫時序,前面痞子衡在講EEPROM分類的時候提到過EEPROM地址碼有1byte/2byte/3byte之分,地址碼的區別主要體現了EEPROM讀寫時序上。對於讀時序,在SPI總線發完READ(0x03)命令后,緊接着要發送想要讀取的內存地址,地址碼不同,發送的地址字節數也不同。對於容量大於512Kb的EEPROM(即地址碼為3byte),顯然要發送3byte的地址,才能確定要讀的數據所在地址,然後才能進行讀數據操作。

      而對於容量小於等於512Kb的EEPROM,關於1byte和2byte地址碼區分,有一個特殊的設計,即對於512byte容量的EEPROM,按容量來說其屬於2byte地址碼範疇,READ命令后需要發送2byte地址,但實際上只需要發送1byte地址(A7-A0),而最高地址位A8放在了READ命令碼bit3里,這樣可以節省1個字節的地址碼。因此1Kb – 512Kb容量的EEPROM地址碼為2byte,512byte及以下容量的EEPROM地址碼為1byte,如下圖所示:

      從上面讀時序可以看出,READ命令碼和地址碼發完之後幾乎沒有等待周期,就可以直接讀取EEPROM中數據,因此EEPROM讀數據速率完全取決於SPI總線速率,所以我們只需要打開EEPROM數據手冊,看看它最高能支持多高的SPI總線速率即可(常見的有2MHz/5MHz/10MHz/20MHz)。
      對於寫時序,就稍微複雜一些了,這裏不考慮地址碼區別,以2byte地址為例。首先在發送WRITE命令之前需要發送一個WREN命令使能寫操作,因為默認EEPROM在執行完上一次寫操作後會恢複寫禁止狀態,在發送WRITE命令進行寫操作之前必須保證EEPROM處於寫使能狀態。

      確保EEPROM進入寫使能狀態后,開始發送WRITE命令,然後是地址碼,接着是要寫入的數據,痞子衡前面講過Page在EEPROM是個結構概念,但其實也跟WRITE命令有關,因為EEPROM既可以按byte去寫,也可以按Page去寫,如果需要存入連續的數據,顯然按Page去寫效率比按Byte寫入更高。這裏需要注意的是,WRITE命令後面跟的字節數不能超過要寫入的首地址所在Page剩餘的字節數。下圖示例的Page寫時序最大byte數為16/32,是因為示例EEPROM的page size即16/32 byte。

      當一次WRITE時序內要寫入的數據全部發送完成之後,底下便進入等待周期,與READ時序不同的是,WRITE時序有等待周期,因為EEPROM內部要將緩存在page buffer里的數據編程到真正的內存空間里,這需要時間。用戶只能通過不斷地發送如下RDSR命令去讀取狀態寄存器bit0 – RDY#來判斷WRITE等待周期是否結束。因此寫時序速率不僅僅取決於SPI總線速率,還取決於等待周期時長。

      如果想快捷地了解SPI EEPROM的性能,最簡單的就是打開SPI EEPROM手冊,看首頁的feature介紹,如下是25AA080的簡要feature:

    • Max. Clock 10 MHz
    • 1024 x 8-bit Organization
    • 16 Byte Page (‘C’ version devices)
    • 32 Byte Page (‘D’ version devices)
    • Self-Timed Erase and Write Cycles (5 ms max.)
    • Block Write Protection:
      - Protect none, 1/4, 1/2 or all of array
    • Built-In Write Protection:
      - Power-on/off data protection circuitry
      - Write enable latch
      - Write-protect pin
    • Sequential Read
    • High Reliability:
      - Endurance: > 1M erase/write cycles
      - Data retention: > 200 years

    三、SPI EEPROM產品

      最後痞子衡收集了可以售賣SPI EEPROM芯片的廠商及產品系列:

    廠商 芯片系列 官方網址
    Microchip
    Atmel
    25AA, 25LC
    AT25
    ST M95
    Onsemi CAT25
    Renesas R1EX25
    Rohm BR25A, BR25G, BR25H, BR25S
    Fudan Micro FM25

      至此,EEPROM接口標準及SPI EEPROM痞子衡便介紹完畢了,掌聲在哪裡~~~

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    南投搬家前需注意的眉眉角角,別等搬了再說!

  • 深入理解java繼承從“我爸是李剛”講起

    深入理解java繼承從“我爸是李剛”講起

    目錄

    前言
    本文主要多方面講解java繼承,旨在讓初學者通俗易懂,至於“我爸是李剛”,反正樓主也不知道誰爸是李剛。
    @

    1、繼承的概述

    1.1、繼承的由來

    至於由來簡單一句話:多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為。

    繼承描述的是事物之間的所屬關係,這種關係是 is-a 的關係。

    1.2、繼承的定義

    繼承:就是子類繼承父類的屬性行為,使得子類對象具有與父類相同的屬性、相同的行為。子類可以直接訪問父類中的非私有的屬性和行為。

    這裏再聲明一點,父類又稱為超類或者基類。而子類又稱為派生類這點很基礎!

    1.3、繼承的優點

    1. 提高代碼的復用性
    2. 類與類之間產生關係,為多態做了完美的鋪墊(不理解沒關係,之後我會再寫一篇多態的文章)

    雖然繼承的優點很多但是Java只支持單繼承,不支持多繼承

    1.4、繼承的格式

    通過 extends 關鍵字,可以聲明一個子類繼承另外一個父類,定義格式如下:

      class 父類 {
       ... 
       }
       class 子類 extends 父類 { 
       ... 
       } 

    2、關於繼承之後的成員變量

    當類之間產生了關係后,其中各類中的成員變量,產生了哪些影響呢? 關於繼承之後的成員變量要從兩方面下手,一是成員變量不重名方面,二是成員變量重名方面。

    2.1、成員變量不重名

    如果子類父類中出現不重名的成員變量,這時的訪問是沒有影響的。代碼如下:

      class liGang {
            // 父類中的成員變量。
           String name ="李剛";//------------------------------父類成員變量是name
        }
        class LiXiaoGang extends liGang {
            // 子類中的成員變量
            String name2 ="李小剛";//--------------------------子類成員變量是name2
            // 子類中的成員方法
            public void show() {
                // 訪問父類中的name,
                System.out.println("我爸是"+name);
                // 繼承而來,所以直接訪問。
                // 訪問子類中的name2
                System.out.println("我是"+name2);
            }
        }
    public class Demo {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang z = new LiXiaoGang();
                // 調用子類中的show方法
                z.show();
            }
        }
        //演示結果: 我爸是李剛   我是李小剛

    2.2、 成員變量重名

    如果子類父類中出現重名的成員變量,這時的訪問是有影響的。代碼如下:

    class liGang {
            // 父類中的成員變量。
           String name ="李剛";//------------------------------父類成員變量是name
        }
        class LiXiaoGang extends liGang {
            // 子類中的成員變量
            String name ="李小剛";//---------------------------子類成員變量也是name
            // 子類中的成員方法
            public void show() {
                // 訪問父類中的name,
                System.out.println("我爸是"+name);
                // 繼承而來,所以直接訪問。
                // 訪問子類中的name2
                System.out.println("我是"+name);
            }
        }
    public class Demo {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang z = new LiXiaoGang();
                // 調用子類中的show方法
                z.show();
            }
        }
        //演示結果: 我爸是李小剛   我是李小剛
    
    

    子父類中出現了同名的成員變量時,在子類中需要訪問父類中非私有成員變量時,需要使用 super 關鍵字,至於修飾父類成員變量,類似於之前學過的 this 。 使用格式 super.父類成員變量名

    this表示當前對象,super則表示父類對象,用法類似!

    class liGang {
            // 父類中的成員變量。
           String name ="李剛";
        }
        class LiXiaoGang extends liGang {
            // 子類中的成員變量
            String name ="李小剛";
            // 子類中的成員方法
            public void show() {
                // 訪問父類中的name,
                System.out.println("我爸是"+super.name);
                // 繼承而來,所以直接訪問。
                // 訪問子類中的name2
                System.out.println("我是"+this.name);  //當然this可省略
            }
        }
    public class Demo {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang z = new LiXiaoGang();
                // 調用子類中的show方法
                z.show();
            }
        }
        //演示結果: 我爸是李剛   我是李小剛

    2.3、關於繼承中成員變量值得思考的一個問題

    同學你有沒有想過這樣一個問題。如果父類中的成員變量
    非私有:子類中可以直接訪問。
    私有:子類是不能直接訪問的。如下:

    當然,同學你要自己體驗體驗編譯報錯過程,看圖沒體驗感不得勁,~嘔,你這無處安放的魅力,無理的要求,我佛了,行吧~

      class liGang2 {
            // 父類中的成員變量。
            private String name ="李剛";
    
        }
        class LiXiaoGang2 extends liGang2 {
            // 子類中的成員變量
            String name ="李小剛";
            // 子類中的成員方法
            public void show() {
                // 訪問父類中的name,
                System.out.println("我爸是"+super.name);//------編譯失敗不能直接訪問父類私有屬性(成員變量)
                // 繼承而來,所以直接訪問。
                // 訪問子類中的name2
                System.out.println("我是"+this.name);  //當然this可省略
            }
        }
    public class PrivateVariable {
            public static void main(String[] args) {
                // 創建子類對象
                ExtendDemo.LiXiaoGang z = new ExtendDemo.LiXiaoGang();
                // 調用子類中的show方法
                z.show();
            }
        }

    通常開發中編碼時,我們遵循封裝的原則,使用private修飾成員變量,那麼如何訪問父類的私有成員變量呢?其實這個時候在父類中提供公共的getXxx方法和setXxx方法就可以了。代碼如下:

    class liGang {
            // 父類中的成員變量。
          private String name ="李剛";
    
            public String getName() {
                return name;
            }
    
            public void setName(String name) {
                this.name = name;
            }
        }
        class LiXiaoGang extends liGang {
            // 子類中的成員變量
            String name ="李小剛";
            // 子類中的成員方法
            public void show() {
                // 訪問父類中的name,
                System.out.println("我爸是"+super.getName());
                // 繼承而來,所以直接訪問。
                // 訪問子類中的name2
                System.out.println("我是"+this.name);  //當然this可省略
            }
        }
    public class Demo {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang z = new LiXiaoGang();
                // 調用子類中的show方法
                z.show();
            }
        }
        //演示結果: 我爸是李剛   我是李小剛

    分析如下:

    3、關於繼承之後的成員方法

    分析完了成員變量,現在我們一起來分析分析成員方法。
    想一想,當類之間產生了關係,其中各類中的成員方法,又產生了哪些影響呢? 同樣我們依舊從兩方面分析。
    #### 3.1、成員方法不重名
    如果子類父類中出現不重名的成員方法,這時的調用是沒有影響的。對象調用方法時,會先在子類中查找有沒有對 應的方法,若子類中存在就會執行子類中的方法,若子類中不存在就會執行父類中相應的方法。代碼如下:

     class liGang3 {
            // 父類中的成員方法。
           public void zhuangRen1(){//--------------------------父類方法名zhuangRen1
               System.out.println("我叫李剛,人不是我撞的,別抓我,我不認識李小剛");
           }
        }
        class LiXiaoGang3 extends liGang3 {
    
            // 子類中的成員方法
            public void zhuangRen() {//--------------------------子類方法名zhuangRen
                System.out.println("有本事你們告去,我爸是李剛");  
            }
        }
        public class MemberMethod {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang3 liXiaoGang = new LiXiaoGang3();
                // 調用子類中的show方法
                liXiaoGang.zhuangRen();
                liXiaoGang.zhuangRen1();
            }
        }
        
    打印結果:有本事你們告去,我爸是李剛
            我叫李剛,人不是我撞的,別抓我,我不認識李小剛
    

    #### 3.2、成員方法重名 【方法重寫】
    成員方法重名大體也可以分兩種情況:

    1、方法名相同返回值類型、參數列表卻不相同(優先在子類查找,沒找到就去父類)
    2、方法名、返回值類型、參數列表都相同,沒錯這就是重寫(Override)

    這裏主要講方法重寫 :子類中出現與父類一模一樣的方法時(返回值類型,方法名和參數列表都相同),會出現覆蓋效果,也稱為重寫或者複寫。聲明不變,重新實現。 代碼如下:

        class liGang3 {
            // 父類中的成員方法。
           public void zhuangRen(int a){
               System.out.println("我叫李剛,人不是我撞的,別抓我");
           }
        }
        class LiXiaoGang3 extends liGang3 {
    
            // 子類中的成員方法
            public void zhuangRen(int a) {
                System.out.println("有本事你們告去,我爸是李剛");
            }
        }
        public class MemberMethod {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang3 liXiaoGang = new LiXiaoGang3();
                // 調用子類中的zhuangRen方法
                liXiaoGang.zhuangRen(1);
    
            }
        }
        結果打印:有本事你們告去,我爸是李剛

    #### 3.3、繼承中重寫方法的意義
    子類可以根據需要,定義特定於自己的行為。既沿襲了父類的功能名稱,又根據子類的需要重新實現父類方法,從而進行擴展增強。比如李剛會開車,李小剛就牛了,在父類中進行擴展增強還會開車撞人,代碼如下:

     class liGang3 {
            // 父類中的成員方法。
           public void kaiChe(){
               System.out.println("我會開車");
           }
        }
        class LiXiaoGang3 extends liGang3 {
            // 子類中的成員方法
            public void kaiChe(){
                super.kaiChe();
                System.out.println("我還會撞人");
                System.out.println("我還能一撞撞倆婆娘");
            }
        }
        public class MemberMethod {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang3 liXiaoGang = new LiXiaoGang3();
                // 調用子類中的zhuangRen方法
                liXiaoGang.kaiChe();
    
    打印結果:   我會開車
               我還會撞人
               我還能一撞撞倆婆娘
            }
        }
    

    不知道同學們發現了沒有,以上代碼中在子類中使用了 super.kaiChe();super.父類成員方法,表示調用父類的成員方法。

    最後重寫必須注意這幾點:

    1、方法重寫時, 方法名與形參列表必須一致。
    2、子類方法覆蓋父類方法時,必須要保證子類權限 >= 父類權限。
    3、方法重寫時,子類的返回值類型必須要 <= 父類的返回值類型。
    4、方法重寫時,子類拋出的異常類型要 <= 父類拋出的異常類型。

    粗心的同學看黑板,look 這裏【注意:只有訪問權限是>=,返回值、異常類型都是<=

    下面以修飾權限為例,如下:

    4、關於繼承之後的構造方法

    為了讓你更好的體會,首先我先編寫一個程序

       class liGang4 {
            // 父類的無參構造方法。
            public liGang4(){
                System.out.println("父類構造方法執行了。。。");
            }
        }
        class LiXiaoGang4 extends liGang4 {
            // 子類的無參構造方法。
           public LiXiaoGang4(){
               System.out.println("子類構造方法執行了====");
           }
        }
        public class ConstructionDemo {
            public static void main(String[] args) {
                // 創建子類對象
                LiXiaoGang4 z = new LiXiaoGang4();
    
            }
        }

    用一分鐘猜想一下結果是什麼,猜好了再看下面結果:

    父類構造方法執行了。。。
    子類構造方法執行了====

    好了,看了結果之後,你可能有疑惑。父類構造器方法怎麼執行了?我們先來分析分析,首先在main方法中實例化了子類對象,接着會去執行子類的默認構造器初始化,這個時候在構造方法中默認會在第一句代碼中添加super();沒錯,他就是開掛般的存在,不寫也存在的!有的調~讀四聲“跳”~皮的同學就會說,你說存在就存在啊,無憑無據 ~呀,你這個該死的靚仔~ 如下:

    構造方法的名字是與類名一致的,所以子類是無法繼承父類構造方法的。 構造方法的作用是初始化成員變量的。所以子類的初始化過程中,必須先執行父類的初始化動作。子類的構造方法中默認會在第一句代碼中添加super(),表示調用父類的構造方法,父類成員變量初始化后,才可以給子類使用。

    當然我已經強調很多遍了 super() 不寫也默認存在,而且只能是在第一句代碼中,不在第一句代碼中行不行,答案是當然不行,這樣會編譯失敗,如下:

    5、關於繼承的多態性支持的例子

    直接上代碼了喔

    class A{
        public String show(C obj) {
            return ("A and C");
        }
    
        public String show(A obj) {
            return ("A and A");
        }
    
    }
    class B extends A{
        public String show(B obj) {
            return ("B and B");
        }
    }
    class C extends B{
        public String show(A obj) {
            return ("A and B");
        }
    }
    public class Demo1 {
        public static void main(String[] args) {
            A a=new A();
            B b=new B();
            C c=new C();
            System.out.println("第一題 " + a.show(a));
            System.out.println("第二題 " + a.show(b));
            System.out.println("第三題 " + a.show(c));
        }
    }
    運行結果:
            第一題 A and A
            第二題 A and A
            第三題 A and C

    其實吧,第一題和第三題都好理解,第二題就有點意思了,會發現A類中沒有B類型這個參數,這個時候,你就應該知道子類繼承就是父類,換句話說就是子類天然就是父類,比如中國人肯定是人,但是人不一定是中國人(可能是火星人也可能是非洲人),所以父類做為參數類型,直接傳子類的參數進去是可以的,反過來,子類做為參數類型,傳父類的參數進去,就需要強制類型轉換。

    6、super與this的用法

    了解他們的用法之前必須明確一點的是父類空間優先於子類對象產生

    在每次創建子類對象時,先初始化父類空間,再創建其子類對象本身。目的在於子類對象中包含了其對應的父類空間,便可以包含其父類的成員,如果父類成員非private修飾,則子類可以隨意使用父類成員。代碼體現在子類的構 造方法調用時,一定先調用父類的構造方法。理解圖解如下:

    #### 5.1、 super和this的含義:

    super :代表父類的存儲空間標識(可以理解為父親的引用)。

     

    this :代表當前對象的引用(誰調用就代表誰)。

    #### 5.2、 super和this訪問成員

    this.成員變量 ‐‐ 本類的
    super.成員變量 ‐‐ 父類的
    this.成員方法名() ‐‐ 本類的
    super.成員方法名() ‐‐ 父類的

    #### 5.3、super和this訪問構造方法

    this(...) ‐‐ 本類的構造方法
    super(...) ‐‐ 父類的構造方法

    #### 5.4、super()和this()能不能同時使用?

    不能同時使用,thissuper不能同時出現在一個構造函數裏面,因為this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,所以在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會通過。
    #### 5.5、總結一下super與this

    子類的每個構造方法中均有默認的super(),調用父類的空參構造。手動調用父類構造會覆蓋默認的super()super()this() 都必須是在構造方法的第一行,所以不能同時出現

    到這裏,java繼承你get到了咩,get到了請咩一聲,隨便隨手~點個讚唄~

    推薦閱讀本專欄的下一篇java文章

    歡迎各位關注我的公眾號,一起探討技術,嚮往技術,追求技術…

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

  • 前端Leader你應該知道的NPM包管理機制

    前端Leader你應該知道的NPM包管理機制

    npm install 命令

    首先總結下npm 安裝一個模塊包的常用命令。

    /* 模塊依賴會寫入 dependencies 節點 */
    
    npm install moduleName
    
    npm install -save moduleName
    
    npm install -S moduleName 
    
    /* 模塊依賴會寫入 devDependencies 節點 */
    
    npm install -save-dev moduleName
    
    npm install -D moduleName
    
    /* 全局安裝模塊包 */
    
    npm install -g moduleName
    
    /* 安裝特定版本的包 */
    
    npm install 包名@版本號
    
    /* 通過地址安裝git倉庫 */
    
    npm install git+https://github.com/itwmike/axios.git
    
    npm install git+ssh://git@github.com:itwmike/axios.git
     
    /* 安裝特定分支或Tag的git倉庫 */
    
    npm install git+https://github.com/itwmike/axios.git#tag
    
    /* 通過用戶名安裝git倉庫 */ 
    
    npm install github:帳號/倉庫名 # npm install github:itwmike/axios
    
    npm install github:帳號/倉庫名
    

      

    npm 依賴包版本號

    npm 所有node包都使用語義化版本號,規則要求如下:  

    • 每個版本號都形如1.2.3,由三個部分組成,依次叫做“主版本號(major)”、“次版本號(minor)”和“修訂號(patch)” 。

    • 當新版本無法兼容基於前一版本的代碼時,則提高主版本號 。

    • 當新版本新增了功能與特性,但仍兼容前一版本的代碼時,則提高次版本號 。

    • 當新版本僅僅修正漏洞或者增強效率,仍然兼容前一版本代碼,則提高修訂號。

    默認使用 npm install -save 下載的都是最新版本,同時會在package.json 文件中登記一個最優版本號,如下形式:

    "dependencies": {
      "axios": "^0.19.0"
    },
    

      

    最優版本號前面會多出一個“標記”,這個標記有啥意義?它的寫法又有哪些?

     

    npm install 都做了哪些事?

    拿到一個node項目時首要做法是運行 npm install 命令,這個命令將 package.json 文件中的依賴包自動解析並安裝,這也是項目能夠本地運行的前置條件。那如此簡單的一條命令,npm 背後又做了哪些不為人知的事呢?

    Number One

    自 npm 5.0后,項目中如果沒有 package-lock.json 文件的時候,npm 會自動幫我們生成。該文件的主要作用是記錄依賴包之間的具體版本號,對包版本有一個鎖定的意義,項目開發中應該將此文件上傳到git等版本控制工具(博主為此經歷了血淋淋的慘痛教育)。

    Number Two

    檢測本地包是否已經下載。如果本地 node_modules 下已經存在和 package-lock.json 中版本一致的包,則不會重新下載。

    Number Three

    下載依賴節點中對應的模板包。下載規則是:如果 package-lock.json 文件存在,則按照該文件中記錄的版本號下載對應的模塊包;如果文件不存在或文件中沒有該包的記錄,此時會按照版本號的標記(上面已講)規範下載並同時更新到 package-lock.json。

    了解了 package-lock.json 的作用后,筆者有個疑問:手動修改 package.json 中的包版本號后運行 npm install 命令會下載新包么?

    帶着這個疑問,筆者做了實驗,得出如下結論:

    • 如果新舊版本號差距較大,比如從 ^2.5.2 變為 2.6.0 ,那麼會下載最新包並且更新 package-lock.json 。

    • 如果新舊版本號差距較小,比如從 ^2.5.2 變為 2.5.4,那麼不會更新。

    總之是否更新要看特定情況,取決於 package.json中版本號的標記和 package-lock.json 是否一致。

    cnpm install 探索

    cnpm 是淘寶 npm 鏡像,在國內很受歡迎,雖然筆者並不喜歡使用。那 cnpm 和 npm 對包的管理是否一樣呢?

    • cnpm install 並不會生成 package-lock.json

    • cnpm install 並不受 package-lock.json 的約束,它會按照版本號標記規則下載依賴包

     

    由此可見,我們在項目中使用 cnpm 的時候一定要慎重,因為很可能團隊成員每個人使用的依賴包版本都不相同,造成打包后的結果也不同。

    如果團隊要使用 cnpm,請使用固定版本號的方式安裝依賴包如:cnpm install -E moduleName

     

    本文轉載自:

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    南投搬家前需注意的眉眉角角,別等搬了再說!

  • 北京公車採購案 八成為電動車

    北京公交集團持續落實首都空氣清淨規劃,2016年計畫採購2700輛新的公車,其中有81%將採購電動車款,以減少大眾運輸系統的碳排放量。

    北京霧霾問題嚴重,改用電動車來取代汽油車是減輕空氣汙染的方法之一。2015年間,北京公交集團共置換了2306輛汽油公車為新式環保公車,其中有一半以上是新能源電動車。同時,2015年改造超過8000輛柴油公車,減少60%的氮氧化合物排放量。

    在純電動車基礎設施方面,北京公交集團陸續興建吳癸電動車線路網、變電站、充電站網絡等,共有21個公車站可供純電動車充電。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

  • 010.Kubernetes二進制部署kube-controller-manager

    010.Kubernetes二進制部署kube-controller-manager

    一 部署高可用kube-controller-manager

    1.1 高可用kube-controller-manager介紹


    本實驗部署一個三實例 kube-controller-manager 的集群,啟動后將通過競爭選舉機制產生一個 leader 節點,其它節點為阻塞狀態。當 leader 節點不可用時,阻塞的節點將再次進行選舉產生新的 leader 節點,從而保證服務的可用性。

    為保證通信安全,本文檔先生成 x509 證書和私鑰,kube-controller-manager 在如下兩種情況下使用該證書:

    • 與 kube-apiserver 的安全端口通信;
    • 在安全端口(https,10252) 輸出 prometheus 格式的 metrics。

    1.2 創建kube-controller-manager證書和私鑰

      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# cat > kube-controller-manager-csr.json <<EOF
      3 {
      4   "CN": "system:kube-controller-manager",
      5   "hosts": [
      6     "127.0.0.1",
      7     "172.24.8.71",
      8     "172.24.8.72",
      9     "172.24.8.73"
     10   ],
     11   "key": {
     12     "algo": "rsa",
     13     "size": 2048
     14   },
     15   "names": [
     16     {
     17       "C": "CN",
     18       "ST": "Shanghai",
     19       "L": "Shanghai",
     20       "O": "system:kube-controller-manager",
     21       "OU": "System"
     22     }
     23   ]
     24 }
     25 EOF
     26 #創建kube-controller-manager的CA證書請求文件



    解釋:

    hosts 列表包含所有 kube-controller-manager 節點 IP;

    CN 和 O 均為 system:kube-controller-manager,kubernetes 內置的 ClusterRoleBindings system:kube-controller-manager 賦予 kube-controller-manager 工作所需的權限。



      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# cfssl gencert -ca=/opt/k8s/work/ca.pem \
      3 -ca-key=/opt/k8s/work/ca-key.pem -config=/opt/k8s/work/ca-config.json \
      4 -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager	#生成CA密鑰(ca-key.pem)和證書(ca.pem)


    1.3 分發證書和私鑰

      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
      3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
      4   do
      5     echo ">>> ${master_ip}"
      6     scp kube-controller-manager*.pem root@${master_ip}:/etc/kubernetes/cert/
      7   done


    1.4 創建和分發kubeconfig


    kube-controller-manager 使用 kubeconfig 文件訪問 apiserver,該文件提供了 apiserver 地址、嵌入的 CA 證書和 kube-controller-manager 證書:

      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
      3 [root@k8smaster01 work]# kubectl config set-cluster kubernetes \
      4   --certificate-authority=/opt/k8s/work/ca.pem \
      5   --embed-certs=true \
      6   --server=${KUBE_APISERVER} \
      7   --kubeconfig=kube-controller-manager.kubeconfig
      8 
      9 [root@k8smaster01 work]# kubectl config set-credentials system:kube-controller-manager \
     10   --client-certificate=kube-controller-manager.pem \
     11   --client-key=kube-controller-manager-key.pem \
     12   --embed-certs=true \
     13   --kubeconfig=kube-controller-manager.kubeconfig
     14 
     15 [root@k8smaster01 work]# kubectl config set-context system:kube-controller-manager \
     16   --cluster=kubernetes \
     17   --user=system:kube-controller-manager \
     18   --kubeconfig=kube-controller-manager.kubeconfig
     19 
     20 [root@k8smaster01 work]# kubectl config use-context system:kube-controller-manager --kubeconfig=kube-controller-manager.kubeconfig
     21 
     22 [root@k8smaster01 ~]# cd /opt/k8s/work
     23 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
     24 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
     25   do
     26     echo ">>> ${master_ip}"
     27     scp kube-controller-manager.kubeconfig root@${master_ip}:/etc/kubernetes/
     28   done


    1.5 創建kube-controller-manager的systemd

      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
      3 [root@k8smaster01 work]# cat > kube-controller-manager.service.template <<EOF
      4 [Unit]
      5 Description=Kubernetes Controller Manager
      6 Documentation=https://github.com/GoogleCloudPlatform/kubernetes
      7 
      8 [Service]
      9 WorkingDirectory=${K8S_DIR}/kube-controller-manager
     10 ExecStart=/opt/k8s/bin/kube-controller-manager \\
     11   --profiling \\
     12   --cluster-name=kubernetes \\
     13   --controllers=*,bootstrapsigner,tokencleaner \\
     14   --kube-api-qps=1000 \\
     15   --kube-api-burst=2000 \\
     16   --leader-elect \\
     17   --use-service-account-credentials\\
     18   --concurrent-service-syncs=2 \\
     19   --bind-address=##MASTER_IP## \\
     20   --secure-port=10252 \\
     21   --tls-cert-file=/etc/kubernetes/cert/kube-controller-manager.pem \\
     22   --tls-private-key-file=/etc/kubernetes/cert/kube-controller-manager-key.pem \\
     23   --port=0 \\
     24   --authentication-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\
     25   --client-ca-file=/etc/kubernetes/cert/ca.pem \\
     26   --requestheader-allowed-names="" \\
     27   --requestheader-client-ca-file=/etc/kubernetes/cert/ca.pem \\
     28   --requestheader-extra-headers-prefix="X-Remote-Extra-" \\
     29   --requestheader-group-headers=X-Remote-Group \\
     30   --requestheader-username-headers=X-Remote-User \\
     31   --authorization-kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\
     32   --cluster-signing-cert-file=/etc/kubernetes/cert/ca.pem \\
     33   --cluster-signing-key-file=/etc/kubernetes/cert/ca-key.pem \\
     34   --experimental-cluster-signing-duration=8760h \\
     35   --horizontal-pod-autoscaler-sync-period=10s \\
     36   --concurrent-deployment-syncs=10 \\
     37   --concurrent-gc-syncs=30 \\
     38   --node-cidr-mask-size=24 \\
     39   --service-cluster-ip-range=${SERVICE_CIDR} \\
     40   --pod-eviction-timeout=6m \\
     41   --terminated-pod-gc-threshold=10000 \\
     42   --root-ca-file=/etc/kubernetes/cert/ca.pem \\
     43   --service-account-private-key-file=/etc/kubernetes/cert/ca-key.pem \\
     44   --kubeconfig=/etc/kubernetes/kube-controller-manager.kubeconfig \\
     45   --logtostderr=true \\
     46   --v=2
     47 Restart=on-failure
     48 RestartSec=5
     49 
     50 [Install]
     51 WantedBy=multi-user.target
     52 EOF


    1.6 分發systemd

      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
      3 [root@k8smaster01 work]# for (( i=0; i < 3; i++ ))
      4   do
      5     sed -e "s/##MASTER_NAME##/${MASTER_NAMES[i]}/" -e "s/##MASTER_IP##/${MASTER_IPS[i]}/" kube-controller-manager.service.template > kube-controller-manager-${MASTER_IPS[i]}.service
      6   done						#修正相應IP
      7 [root@k8smaster01 work]# ls kube-controller-manager*.service
      8 [root@k8smaster01 ~]# cd /opt/k8s/work
      9 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
     10 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
     11   do
     12     echo ">>> ${master_ip}"
     13     scp kube-controller-manager-${master_ip}.service root@${master_ip}:/etc/systemd/system/kube-controller-manager.service
     14   done						#分發system


    二 啟動並驗證

    2.1 啟動kube-controller-manager 服務

      1 [root@k8smaster01 ~]# cd /opt/k8s/work
      2 [root@k8smaster01 work]# source /opt/k8s/bin/environment.sh
      3 [root@k8smaster01 work]# for master_ip in ${MASTER_IPS[@]}
      4   do
      5     echo ">>> ${master_ip}"
      6     ssh root@${master_ip} "mkdir -p ${K8S_DIR}/kube-controller-manager"
      7     ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-controller-manager && systemctl restart kube-controller-manager"
      8   done


    2.2 檢查kube-controller-manager 服務

      1 [root@k8smaster01 ~]# source /opt/k8s/bin/environment.sh
      2 [root@k8smaster01 ~]# for master_ip in ${MASTER_IPS[@]}
      3   do
      4     echo ">>> ${master_ip}"
      5     ssh root@${master_ip} "systemctl status kube-controller-manager|grep Active"
      6   done



    2.3 查看輸出的 metrics

      1 [root@k8smaster01 ~]# curl -s --cacert /opt/k8s/work/ca.pem --cert /opt/k8s/work/admin.pem --key /opt/k8s/work/admin-key.pem https://172.24.8.71:10252/metrics |head


    注意:以上命令在 kube-controller-manager 節點上執行。

    2.4 查看權限

      1 [root@k8smaster01 ~]# kubectl describe clusterrole system:kube-controller-manager



    ClusteRole system:kube-controller-manager 的權限很小,只能創建 secret、serviceaccount 等資源對象,各 controller 的權限分散到 ClusterRole system:controller:XXX 中。

    當在 kube-controller-manager 的啟動參數中添加 –use-service-account-credentials=true 參數,這樣 main controller 會為各 controller 創建對應的 ServiceAccount XXX-controller。內置的 ClusterRoleBinding system:controller:XXX 將賦予各 XXX-controller ServiceAccount 對應的 ClusterRole system:controller:XXX 權限。

      1 [root@k8smaster01 ~]# kubectl get clusterrole|grep controller



    如deployment controller:

      1 [root@k8smaster01 ~]# kubectl describe clusterrole system:controller:deployment-controller


    2.5 查看當前leader

      1 [root@k8smaster01 ~]# kubectl get endpoints kube-controller-manager --namespace=kube-system  -o yaml



    kubelet 認證和授權:https://kubernetes.io/docs/admin/kubelet-authentication-authorization/#kubelet-authorization
    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

  • 從沒聽說過的併發的名詞-管程

    從沒聽說過的併發的名詞-管程

    在接觸併發之前,我只聽說過進程、線程,管程這個詞倒是頭回聽說,抱着認真好學的態度,去找了找關於 管程 的資料,不學不知道,原來併發里的兩大難題–互斥和同步都可以用管程來解決,可以說,管程是一把解決併發的萬能鑰匙。

     

    那什麼是管程呢?原來管程並不像進程、線程這樣來形容一個特指東西的名詞,管程是指管理共享變量以及讀共享變量的操作過程,讓他們支持併發。Java 中的 Monitor,我們經常將它翻譯成 “監視器”,其實它還有個更學術的名字就是管程。

     

    管程有三種模型,其中廣泛應用的是 MESA 模型,Java 管程實現參考的也是 MESA 模型,所以我就着重學習這個模型。前面提到了管程可以解決併發領域互斥和同步的兩大核心問題,下面我們先看看管程是如何解決互斥問題的。

     

    • 互斥問題的解決

     

    互斥指的同一時刻只允許有一個線程訪問共享資源,管程解決互斥問題的思路很簡單,就是將共享變量及對共享變量的操作統一都封裝起來,如圖:

     

     

    線程 A 和線程 B 如果想訪問共享變量 queue,只能通過管程提供的入隊和出隊操作,入隊和出隊操作保證互斥性,只允許一個線程進入,而對外暴露的就只有管程,看上去有點面向對象封裝的意思。

     

    • 同步問題的解決

     

    在管程解決互斥問題的解決方案中,我們看到了其實共享變量和對共享變量的操作都是被封裝起來的,要想訪問共享變量就要訪問管程,所以同步的解決辦法就是在管程的入口添加一個等待隊列,當多線程想同時進入管程內部時,只允許一個線程進入,其他線程在等待隊列中等待。

     

    進入到管程內部,有可能執行修改共享變量的方法還有條件,比如要執行入隊操作,必須保證隊列不滿;要執行出隊操作,必須保證隊列不空,管程對每個條件的變量還對應有一個等待隊列,如圖:

     

     

    這裏的入口等待隊列與條件等待隊列是完全不同的兩個隊列,當進入管程內部的線程因執行方法的條件不滿足會進入條件等待隊列,等待被其他線程喚醒,喚醒後會重新進入入口的等待隊列,競爭資源。

     

    Java 內置的管程

     

    Java 內置管程與 MESA 模型類似,在 MESA 模型中,條件變量可以有多個, Java 語言內置的管程里只有一個條件變量。

     

     

    Java 內置的管程方案就是 syncronized ,使用 syncronized 修飾的代碼塊,在編譯器會自動生成相關加鎖和解鎖代碼,但是只會支持一個條件變量。

     

     

    總結一下 :

     

     

     

    以上是管程的相關介紹,後續我們會進入 Java JUC 工具包的學習,看看除了 syncronized 其他強大的併發編程類都有哪些獨特的用處。

     

     這裡有一篇 

     

    感興趣的同學可以瀏覽一下哦~

        

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    南投搬家前需注意的眉眉角角,別等搬了再說!

  • 【自然語言處理】利用LDA對希拉里郵件進行主題分析

    【自然語言處理】利用LDA對希拉里郵件進行主題分析

    首先是讀取數據集,並將csv中ExtractedBodyText為空的給去除掉

    import pandas as pd
    import re
    import os
    
    dir_path=os.path.dirname(os.path.abspath(__file__))
    data_path=dir_path+"/Database/HillaryEmails.csv"
    df=pd.read_csv(data_path)
    df=df[['Id','ExtractedBodyText']].dropna()

    對於這些郵件信息,並不是所有的詞都是有意義的,也就是先要去除掉一些噪聲數據:

    def clean_email_text(text):
        text = text.replace('\n'," ") #新行,我們是不需要的
        text = re.sub(r"-", " ", text) #把 "-" 的兩個單詞,分開。(比如:july-edu ==> july edu)
        text = re.sub(r"\d+/\d+/\d+", "", text) #日期,對主體模型沒什麼意義
        text = re.sub(r"[0-2]?[0-9]:[0-6][0-9]", "", text) #時間,沒意義
        text = re.sub(r"[\w]+@[\.\w]+", "", text) #郵件地址,沒意義
        text = re.sub(r"/[a-zA-Z]*[:\//\]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i", "", text) #網址,沒意義
        pure_text = ''
        # 以防還有其他特殊字符(数字)等等,我們直接把他們loop一遍,過濾掉
        for letter in text:
            # 只留下字母和空格
            if letter.isalpha() or letter==' ':
                pure_text += letter
        # 再把那些去除特殊字符后落單的單詞,直接排除。
        # 我們就只剩下有意義的單詞了。
        text = ' '.join(word for word in pure_text.split() if len(word)>1)
        return text

    然後取出ExtractedBodyText的那一列,對每一行email進行噪聲過濾,並返回一個對象:

    docs = df['ExtractedBodyText']
    docs = docs.apply(lambda s: clean_email_text(s))  

    然後我們呢把裏面的email提取出來:

    doclist=docs.values

    接下來,我們使用gensim庫來進行LDA模型的構建,gensim可用指令pip install -U gensim安裝。但是,要注意輸入到模型中的數據的格式。例如:[[一條郵件字符串],[另一條郵件字符串], ...]轉換成[[一,條,郵件,在,這裏],[第,二,條,郵件,在,這裏],[今天,天氣,腫么,樣],...]。對於英文的分詞,只需要對空白處分割即可。同時,有些詞語(不同於噪聲)是沒有意義的,我們要過濾掉那些沒有意義的詞語,這裏簡單的寫一個停止詞列表:

    stoplist = ['very', 'ourselves', 'am', 'doesn', 'through', 'me', 'against', 'up', 'just', 'her', 'ours',
                'couldn', 'because', 'is', 'isn', 'it', 'only', 'in', 'such', 'too', 'mustn', 'under', 'their',
                'if', 'to', 'my', 'himself', 'after', 'why', 'while', 'can', 'each', 'itself', 'his', 'all', 'once',
                'herself', 'more', 'our', 'they', 'hasn', 'on', 'ma', 'them', 'its', 'where', 'did', 'll', 'you',
                'didn', 'nor', 'as', 'now', 'before', 'those', 'yours', 'from', 'who', 'was', 'm', 'been', 'will',
                'into', 'same', 'how', 'some', 'of', 'out', 'with', 's', 'being', 't', 'mightn', 'she', 'again', 'be',
                'by', 'shan', 'have', 'yourselves', 'needn', 'and', 'are', 'o', 'these', 'further', 'most', 'yourself',
                'having', 'aren', 'here', 'he', 'were', 'but', 'this', 'myself', 'own', 'we', 'so', 'i', 'does', 'both',
                'when', 'between', 'd', 'had', 'the', 'y', 'has', 'down', 'off', 'than', 'haven', 'whom', 'wouldn',
                'should', 've', 'over', 'themselves', 'few', 'then', 'hadn', 'what', 'until', 'won', 'no', 'about',
                'any', 'that', 'for', 'shouldn', 'don', 'do', 'there', 'doing', 'an', 'or', 'ain', 'hers', 'wasn',
                'weren', 'above', 'a', 'at', 'your', 'theirs', 'below', 'other', 'not', 're', 'him', 'during', 'which']

    然後我們將輸入轉換成gensim所需的格式,並過濾掉停用詞:

    texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in doclist]

    再將這所有的單詞放入到一個詞袋中,把每個單詞用一個数字index指代:

    from gensim import corpora, models, similarities
    import gensim
    dictionary = corpora.Dictionary(texts)

    再分別統計每一篇email中每個詞語在這個詞袋中出現的次數,並返回一個列表:

    corpus = [dictionary.doc2bow(text) for text in texts]

     這個列表告訴我們,第14(從0開始是第一)個郵件中,一共6個有意義的單詞(經過我們的文本預處理,並去除了停止詞后)其中,51號單詞出現1次,505號單詞出現1次,以此類推。。。

    最後,就可以開始構建我們的模型了:

    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
    print(lda.print_topic(10, topn=5))

     可以看到,第11個主題最常用的單詞,接下來,我們看下所有的主題:

    for i in lda.print_topics(num_topics=20, num_words=5):
        print(i)

     我們再看下第一篇email屬於哪一個主題:

    print(lda.get_document_topics(corpus[0]))

     屬於第四個主題的概率是0.95

    相關代碼和數據:鏈接: https://pan.baidu.com/s/1sl1I5IeQFDHjVwf2a0C89g 提取碼: xqqf 

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

    ※自行創業 缺乏曝光? 下一步"網站設計"幫您第一時間規劃公司的門面形象

    南投搬家前需注意的眉眉角角,別等搬了再說!

  • Spring 框架常用語法進行總結

     

    Spring 框架常用語法進行總結:

    spring框架的二大主要的功能就是IOC和AOP。

    IOC: 控制反轉(依賴注入)

    AOP: 面向切面編程

    學習spring最好的方法就是去看官網,裏面有詳細的說明及使用原則

    介紹spring 中的註解的使用,xml配置等目前在市面上面較少。

     

    首先介紹Java自帶的元註解 (元註解就是 能註解到註解上的註解,能用在其他註解上的註解 )

    Java5.0定義了4個標準的meta-annotation類型

    @Target :

    用於描述註解的範圍,即註解在哪用。它說明了Annotation所修飾的對象範圍:Annotation可被用於 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)等。取值類型(ElementType)

       CONSTRUCTOR:用於描述構造器
      FIELD:用於描述域即類成員變量
      LOCAL_VARIABLE:用於描述局部變量
      METHOD:用於描述方法
      PACKAGE:用於描述包
      PARAMETER:用於描述參數
      TYPE:用於描述類、接口(包括註解類型) 或enum聲明
      TYPE_PARAMETER:1.8版本開始,描述類、接口或enum參數的聲明
      TYPE_USE:1.8版本開始,描述一種類、接口或enum的使用聲明
      
    eg :

    public @interface Log {
      ......
    }

     

    @Retention :

    用於描述註解的生命周期,表示需要在什麼級別保存該註解,即保留的時間長短。取值類型RetentionPolicy)

       SOURCE:在源文件中有效(即源文件保留)
      CLASS:在class文件中有效(即class保留)
      RUNTIME:在運行時有效(即運行時保留)  
    eg:

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Log {
      ......
    }

     

    @Documented :

    用於描述其它類型的annotation應該被作為被標註的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化。它是一個標記註解,沒有成員。

    eg :

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Log {
      ......
    }
    @Inherited :

    用於表示某個被標註的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用於一個class,則這個annotation將被用於該class的子類。

     

     

    Spring 常用的註解

    在註解配置中常用的啟動方法就是:

    <--在XML中啟用方法-->
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    Person bean = (Person) applicationContext.getBean("person");
    System.out.println(bean);

    --------------------------------------------------------------------------
       <--在註解中啟用方法-->
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    Person bean = applicationContext.getBean(Person.class);
    System.out.println(bean);


    getBeanNamesForType:得到當前IOC容器加載進來的bean的名稱
    String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
    for (String name : namesForType) {
    System.out.println(name);
    }
    @Component

    組件,沒有明確的角色

    @Service

    在業務邏輯層使用(service層)

    @Repository

    在數據訪問層使用(dao層)

    @Controller

    在展現層使用,控制器的聲明(Controller)

    @Bean

    注入ioc容器中,默認是以方法的名稱作為注入容器裏面的名稱,需注意@bean可以不在配置類裏面使用,不過經過@Bean註解使用過的方法所在的類也會被加載到ioc容器裏面。

    //配置類==配置文件

    @Configuration

    告訴Spring這是一個配置類,用在一個類的上面,配置類

    @Configuration == <bean id=”person” class=”com.opendev.entity.Person”></bean>

    @ComponentScan

    value:指定要掃描的包,用在配置類上面,告訴程序在spring中的掃包範圍

    @ComponentScans

    掃描多個包還有提供掃包的自定義掃包規則

     

    package com.atguigu.config;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.context.annotation.ComponentScans;

    import com.atguigu.bean.Person;

    //配置類==配置文件
    @Configuration  //告訴Spring這是一個配置類

    @ComponentScans(
    value = {
    @ComponentScan(value="com.atguigu",includeFilters = {
    /*@Filter(type=FilterType.ANNOTATION,classes={Controller.class}),
    @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class}),*/
    @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
    },useDefaultFilters = false)
    }
    )
    //@ComponentScan value:指定要掃描的包
    //excludeFilters = Filter[] :指定掃描的時候按照什麼規則排除那些組件
    //includeFilters = Filter[] :指定掃描的時候只需要包含哪些組件
    //FilterType.ANNOTATION:按照註解
    //FilterType.ASSIGNABLE_TYPE:按照給定的類型;
    //FilterType.ASPECTJ:使用ASPECTJ表達式
    //FilterType.REGEX:使用正則指定
    //FilterType.CUSTOM:使用自定義規則
    public class MainConfig {

    //給容器中註冊一個Bean;類型為返回值的類型,id默認是用方法名作為id
    @Bean("person")//聲明了注入ioc容器裏面的對象為person,默認都是以方法名作為id
    public Person person01(){
    return new Person("lisi", 20);
    }
    }

     

    //類中組件統一設置。滿足當前條件,這個類中配置的所有bean註冊才能生效;

    @Conditional

    裏面需要寫上相應接口的實現類

    @Import

    導入組件,id默認是組件的全類名

    spring中bean的作用域

    默認是單實例的

    //默認是單實例的
    /**
    * ConfigurableBeanFactory#SCOPE_PROTOTYPE    
    * @see ConfigurableBeanFactory#SCOPE_SINGLETON  
    * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST request
    * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION sesssion
    * @return\
    * @Scope:調整作用域
    * prototype:多實例的:ioc容器啟動並不會去調用方法創建對象放在容器中。
    * 每次獲取的時候才會調用方法創建對象;
    * singleton:單實例的(默認值):ioc容器啟動會調用方法創建對象放到ioc容器中。
    * 以後每次獲取就是直接從容器(map.get())中拿,
    * request:同一次請求創建一個實例
    * session:同一個session創建一個實例
    *
    * 懶加載:
    * 單實例bean:默認在容器啟動的時候創建對象;
    * 懶加載:容器啟動不創建對象。第一次使用(獲取)Bean創建對象,並初始化;
    *
    */
    //@Scope("prototype")
    @Lazy
    @Bean("person")
    public Person person(){
    System.out.println("給容器中添加Person....");
    return new Person("張三", 25);
    }
    spring中bean 的生命周期
    /**
    * bean的生命周期:
    * bean創建---初始化----銷毀的過程
    * 容器管理bean的生命周期;
    * 我們可以自定義初始化和銷毀方法;容器在bean進行到當前生命周期的時候來調用我們自定義的初始化和銷毀方法
    *
    * 構造(對象創建)
    * 單實例:在容器啟動的時候創建對象
    * 多實例:在每次獲取的時候創建對象\
    *
    * BeanPostProcessor.postProcessBeforeInitialization
    * 初始化:
    * 對象創建完成,並賦值好,調用初始化方法。。。
    * BeanPostProcessor.postProcessAfterInitialization
    * 銷毀:
    * 單實例:容器關閉的時候
    * 多實例:容器不會管理這個bean;容器不會調用銷毀方法;
    *
    *
    * 遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,
    * 一但返回null,跳出for循環,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization
    *
    * BeanPostProcessor原理
    * populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值
    * initializeBean
    * {
    * applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    * invokeInitMethods(beanName, wrappedBean, mbd);執行自定義初始化
    * applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    *}
    *
    *
    *
    * 1)、指定初始化和銷毀方法;
    * 通過@Bean指定init-method和destroy-method;
    * 2)、通過讓Bean實現InitializingBean(定義初始化邏輯),
    * DisposableBean(定義銷毀邏輯);
    * 3)、可以使用JSR250;
    * @PostConstruct:在bean創建完成並且屬性賦值完成;來執行初始化方法
    * @PreDestroy:在容器銷毀bean之前通知我們進行清理工作
    * 4)、BeanPostProcessor【interface】:bean的後置處理器;
    * 在bean初始化前後進行一些處理工作;
    * postProcessBeforeInitialization:在初始化之前工作
    * postProcessAfterInitialization:在初始化之後工作
    *
    * Spring底層對 BeanPostProcessor 的使用;
    * bean賦值,注入其他組件,@Autowired,生命周期註解功能,@Async,xxx BeanPostProcessor;
    *
    *
    *
    */
    spring中的自動裝配
    /**
    * 自動裝配;
    * Spring利用依賴注入(DI),完成對IOC容器中中各個組件的依賴關係賦值;
    *
    * 1)、@Autowired:自動注入:
    * 1)、默認優先按照類型去容器中找對應的組件:applicationContext.getBean(BookDao.class);找到就賦值
    * 2)、如果找到多個相同類型的組件,再將屬性的名稱作為組件的id去容器中查找
    * applicationContext.getBean("bookDao")
    * 3)、@Qualifier("bookDao"):使用@Qualifier指定需要裝配的組件的id,而不是使用屬性名
    * 4)、自動裝配默認一定要將屬性賦值好,沒有就會報錯;
    * 可以使用@Autowired(required=false);
    * 5)、@Primary:讓Spring進行自動裝配的時候,默認使用首選的bean;
    * 也可以繼續使用@Qualifier指定需要裝配的bean的名字
    * BookService{
    * @Autowired
    * BookDao bookDao;
    * }
    *
    * 2)、Spring還支持使用@Resource(JSR250)和@Inject(JSR330)[java規範的註解]
    * @Resource:
    * 可以和@Autowired一樣實現自動裝配功能;默認是按照組件名稱進行裝配的;
    * 沒有能支持@Primary功能沒有支持@Autowired(reqiured=false);
    * @Inject:
    * 需要導入javax.inject的包,和Autowired的功能一樣。沒有required=false的功能;
    * @Autowired:Spring定義的; @Resource、@Inject都是java規範
    *
    * AutowiredAnnotationBeanPostProcessor:解析完成自動裝配功能;
    *
    * 3)、 @Autowired:構造器,參數,方法,屬性;都是從容器中獲取參數組件的值
    * 1)、[標註在方法位置]:@Bean+方法參數;參數從容器中獲取;默認不寫@Autowired效果是一樣的;都能自動裝配
    * 2)、[標在構造器上]:如果組件只有一個有參構造器,這個有參構造器的@Autowired可以省略,參數位置的組件還是可以自動從容器中獲取
    * 3)、放在參數位置:
    *
    * 4)、自定義組件想要使用Spring容器底層的一些組件(ApplicationContext,BeanFactory,xxx);
    * 自定義組件實現xxxAware;在創建對象的時候,會調用接口規定的方法注入相關組件;Aware;
    * 把Spring底層一些組件注入到自定義的Bean中;
    * xxxAware:功能使用xxxProcessor;
    * ApplicationContextAware==》ApplicationContextAwareProcessor;
    *
    *
    *
    *
    */

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!

  • 工信部擬規範新能源汽車廢舊動力電池綜合利用

    工業和資訊化部近日就《新能源汽車廢舊動力蓄電池綜合利用行業規範條件》向社會公開徵求意見,擬要求已在禁止建設區域投產運營的廢舊動力蓄電池綜合利用企業,要在一定期限內通過“依法搬遷、轉產”等方式逐步退出。

    禁止建設區域包括:國家法律、法規、規章及規劃確定或縣級以上人民政府批准的自然保護區、生態功能保護區、風景名勝區、飲用水水源保護區、基本農田保護區和其他需要特別保護的區域等。

    意見稿還對廢舊動力電池綜合利用作出規範。廢舊動力蓄電池綜合利用企業應依據相關國家、行業標準,參考新能源汽車和動力蓄電池生產企業提供的拆卸、拆解技術資訊,嚴格遵循先梯級利用後再生利用的原則,提高綜合利用水準。

    根據意見稿,濕法冶煉條件下,鎳、鈷、錳的綜合回收率應不低於98%;火法冶煉條件下,鎳、稀土的綜合回收率應不低於97%;不得擅自丟棄、傾倒、焚燒與填埋廢舊動力電池中的有色金屬、石墨、塑膠、橡膠、隔膜、電解液等零部件和材料。

    在能源消耗方面,意見稿規定,企業應加強對拆卸、儲存、拆解、檢測和再生利用等環節的能耗管控,努力降低綜合能耗,提高能源利用效率,鼓勵企業採用先進適用的節能技術工藝及裝備。

    此外,工信部同日發佈《新能源汽車廢舊動力蓄電池綜合利用行業規範公告管理暫行辦法(徵求意見稿)》,擬對新能源汽車廢舊動力蓄電池綜合利用企業實行動態管理,委託相關專業機構負責協助做好公告管理相關工作。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包"嚨底家"

    網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家費用,距離,噸數怎麼算?達人教你簡易估價知識!