月份: 2020 年 5 月

  • 【自然語言處理】利用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 

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

    【其他文章推薦】

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

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

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

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

  • SQlALchemy session詳解

    系列文章:

    概念

    session用於創建程序和數據庫之間的會話,所有對象的載入和保存都需通過session對象 。

    通過sessionmaker調用創建一個工廠,並關聯Engine以確保每個session都可以使用該Engine連接資源:

    from sqlalchemy.orm import sessionmaker
    
    # 創建session
    DbSession = sessionmaker(bind=engine)
    session = DbSession()

    操作

    session的常見操作方法包括:

    1. flush:預提交,提交到數據庫文件,還未寫入數據庫文件中
    2. commit:提交了一個事務,把內存的數據直接寫入數據庫
    3. rollback:回滾
    4. close:關閉

    在事務處理時,需注意一下兩點:

    1. 在事務處理過程發生異常時,進行rollback操作,否則會在下次操作時報錯:
    Can’t reconnect until invalid transaction is rolled back 
    1. 一般情況下,在一個事務處理完成之後要關閉session,以確保數據操作的準確性。

    建議封裝上下文方法:

    from contextlib import contextmanager
    
    @contextmanager
    def session_maker(session=session):
        try:
            yield session
            session.commit()
        except:
            session.rollback()
            raise
        finally:
            session.close()

    調用:

    def update_user():
        with session_maker() as db_session:
            db_session.query(Users).filter_by(name='test2').update({'email': 'test2@qq.com'})

    線程安全

    session不是線程安全的,並且我們一般session對象都是全局的,那麼在多線程情況下,當多個線程共享一個session時,數據處理就會發生錯誤。

    為了保證線程安全,需使用scoped_session方法:

    db_session = scoped_session(sessionmaker(bind=engine))

    內部原理

    session對象包含了三個重要的部分:

    1. 標識映射(Identity Map)
    2. 對象的狀態 / 狀態跟蹤
    3. 事務

    標識映射

    標識映射是與ORM關聯的集合,通過標識映射保證了數據庫操作的準確性。

    具體的實現原理是:維護一個Python字典(IdentityMap),關聯這個Session對象到數據庫ID的映射,當應用程序想要獲取一個session對象時,若該對象不存在,標識映射會加載該對象並緩存,若該對象已存在,則直接獲取。這樣的好處是:

    1. 已經被請求過的session對象緩存下來,不需要連接加載多次,造成額外的開銷;
    2. 避免了數據不一致

    狀態跟蹤

    一個Session對象從創建到銷毀,依次經歷四種狀態,分別是:

    1. Transient:剛new出來的對象,還不在會話中,也沒有保存到數據庫。
    2. Pending:transient的對象調用add后,就會變成pending狀態,這時會加入sqlalchemy的監管範圍,數據並未更新到數據庫。
    3. Persistent:該狀態表明數據庫里已經記錄了該對象,在兩種情況下對象處於該狀態:一是通過flush()方法刷新pending對象,二是從數據庫query()得到對象。
    4. Detached:在會話中的事務提交之後,所有的對象都將是Detached狀態。

    所謂的狀態跟蹤,就是跟蹤以上四個狀態,保證數據的準確性並在合理的時機丟棄對象以保證合理開銷,那麼具體是怎麼實現的呢?

    我們可以看到,只有在pending狀態時,對象的內存數據和數據庫中的數據不一致,在Persistent狀態時,內存數據和數據庫數據已經一致,那麼此後任意時刻丟棄該對象數據都是可以的,這時就需要找個合適的時機丟棄對象,過早或過晚都有其缺陷。於是,就讓垃圾回收器來做決定,在內存不夠的時候釋放對象,回收內存。

    Session對象採用了弱引用機制,所謂弱引用,就是說,在保存了對象的引用的情況下,對象仍然可能被垃圾回收器回收。在某一時刻通過引用訪問對象時,對象可能存在也可能不存在,如果對象不存在,就重新從數據庫中加載對象。而如果不希望對象被回收,只需要另外保存一個對象的強引用即可 。

    session對象包括三個屬性:

    1. new:剛加入會話的對象
    2. dirty:剛被修改的對象
    3. deleted:在會話中被刪除的對象

    三個屬性共同的特點就是內存的數據和數據庫數據不一致,也就是對象處於pending狀態,這也就表明了session保存了所有對象處於pending狀態的強引用。

    以上。

    代碼可參照:

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

    【其他文章推薦】

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

    花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

    花一天時間試玩vsphere6.7(EXSI)服務器版的vmware

    要註冊賬號(2019年11月14註冊):

    登陸網址:https://my.vmware.com/cn/group/vmware/home
    賬號:haha@grr.la
    密碼:0nV+SJ8fZbdE8g==

    看了下。不管是標準版,企業版,測試版的6.7下載的軟件包都是同一個,區別應該在於激活密鑰

    主要有兩個鏡像:EXXI鏡像,VCenter鏡像

    EXSI和VMware有點像,不過可以直接裝在裸機上,Vcenter需要裝在windows server上,管理EXSI平台

    鏈接:https://pan.baidu.com/s/1x8K4dnMdhg7uz11Hyi7v2A
    提取碼:tqaw

    VMware vSphere 6 Enterprise Plus
    0A65P-00HD0-3Z5M1-M097M-22P7H

    參考文檔:https://pan.baidu.com/s/18Cq9marptM-Rbym9l7RvtQ

    這個是新的文檔:https://www.lanzous.com/i7ewj1i

    上面如果失效:https://blog.csdn.net/techgroup/article/details/100053477

    一、安裝EXSI參考:https://blog.csdn.net/weixin_42758707/article/details/100525596

    需要注意的地方:不需要DHCP服務器,路由器分配IP就行,ip最好設置為固定IP,可以開啟ssh

    填寫密鑰的地方:

    開啟ssh后可以使用ssh登陸

    二、創建虛擬機根vmware一樣,要先上傳鏡像再創建,可以創建Linux,MacOS,windows

    也可以從ovf導入

    三、其他功能

    支持虛擬機資源監控,克隆虛擬機,建立快照,導出為模版等功能

    支持用VMware連ESXI平台(CTRL+L),連接之後可以創建或刪除虛擬機,還可以對虛擬機開關機

    四、VMware vSphere Client6.0(看樣子官方不再長期支持了)

    https://yq.aliyun.com/articles/636965

    https://wsgzao.github.io/post/vmware-vsphere-client/

    五、解決ssh無法密碼登陸的問題(提示密鑰登陸)

    CTRL+ALT+F1進入命令行,修改/etc/ssh/sshd_config 重啟services.sh

    [root@localhost:~] vi /etc/ssh/sshd_config 
    [root@localhost:~] grep PasswordAuth /etc/ssh/sshd_config
    PasswordAuthentication yes
    [root@localhost:~] services.sh restart

    六、安裝vcenter

    安裝到windows server2016中,應該還有其他辦法

    安裝文檔:https://www.lanzous.com/i7eh24j

    安裝很簡單,整個安裝過程比較慢,可能要半個小時甚至更長

    牛逼,8G,不搞了

    換了個電腦,繼續實驗

    七、vcenter管理ESXI

    vcenter地址:vcenter.jd.com(172.18.3.252)

    exsi1地址:172.18.3.151

    exsi2地址:172.18.3.255

    步驟:先創建數據中心,然後數據中心中添加主機(exsi節點)

    管理參考:https://www.cnblogs.com/djlsunshine/p/11372482.html

    新建數據中心:

    添加主機(添加exsi節點)

    設置是否啟用鎖定模式,如果啟用了鎖定模式,管理員就不能夠使用vSphere客戶端直接登錄到ESXI主機,只能通過vCenter Server對主機進行管理。在這裏不啟用鎖定模式

    激活參考:https://www.lanzous.com/i7eikla

    激活碼複製粘貼全部導入了。一個機器一個激活碼:https://blog.csdn.net/lizhiyuan_eagle/article/details/79989216

    然後就可以看到exsi中的虛擬機:

    遇到的小問題,我克隆的第一個exsi變成第二個exsi,被識別數來了,只能再裝一台:

    vcenter同樣支持管理虛擬機,連接虛擬機

    八、遷移exsi1的虛擬機到exsi2

    冷遷移,直接遷

    取消掛載cdrom再遷移

    熱遷移,要添加虛擬交換機在每個exsi網絡上

    主機—配置—虛擬交換機—添加網絡:

    exsi2一樣,添加個虛擬交換機,ip不能一樣

    然後就可以遷移了

    整個遷移過程網絡沒有丟包,ssh也沒有中斷

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

  • spring 是如何注入對象的和bean 創建過程分析

    文章目錄:

    1. 【本文】spring 是如何注入對象的

    首先需要知道一個大致實現

    • 這個注入過程肯定是在 BeanPostProcessor 中實現的

    • spring 是在 beanFactory.getBean 進行 bean 實例化的,即懶加載

    • 根據第二條,也就是說在 getBean 的時候才會去調用所有 BeanPostProcessor

    • 第二篇文章說到,BeanFactory 的 refresh 過程只是註冊 BeanPostProcessor,真正執行在 getBean 方法中

    • MergedBeanDefinitionPostProcessor 也是一種 BeanPostProcessor 它重新弄了個一個生命周期函數,替代了 BeanPostProcessor 默認的生命周期函數,這麼看吧,我貼一小段源碼

      for (BeanPostProcessor bp : getBeanPostProcessors()) {
          if (bp instanceof MergedBeanDefinitionPostProcessor) {
              MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
              bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
          }
      }

      它允許你在非 BeanFactoryProcess 中去修改 Bean 定義

    • InstantiationAwareBeanPostProcessor 也是一種 BeanPostProcessor 它也重新定義了一個生命周期函數,它允許把屬性值注入到屬性對象中

    @Autowired 加載定義的過程

    我們先不看 bean 的創建過程,就看 MergedBeanDefinitionPostProcessor 的實現子類,這裏看名字猜測 AutowiredAnnotationBeanPostProcessor 應該就是干這件事的,所以我們接下來可以直接看 AutowiredAnnotationBeanPostProcessor 的 postProcessMergedBeanDefinition 方法的代碼。

    順着方法的調用,可以知道在 buildAutowiringMetadata 是真正查找這些註解的地方,最後 checkConfigMembersMember 註冊進了 bean 定義,具體如何查找的讀者自行查看源碼。

    這裏只是將 Member 註冊進了 bean 定義,真正實例化在填充 Bean 的過程中,下面說到 bean 的創建過程可以知道是何時注入的。

    Bean 的創建過程

    前面說到 spring 是在 getBean 的過程中進行 Bean 創建的,創建 bean 分為幾個步驟

    1. 獲取 bean 定義
    2. new Bean()
    3. 執行生命周期函數 (前)
    4. 創建依賴項
    5. 填充 bean
    6. 執行生命周期函數(后)

    入口為 BeanFactory.getBean ,BeanFactory 的實現類為 DefaultListableBeanFactory 這些你可以在 BeanFactory 的 refresh 過程中找到

    根據源碼,如果 bean 還不存在時,就會執行 bean 的創建流程

    獲取 bean 定義在這段源碼中

    final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

    緊跟着,根據 Bean 定義搜索其依賴項,並創建 bean ,可以看出是遞歸創建 bean

    String[] dependsOn = mbd.getDependsOn();
    for (String dep : dependsOn) {
        getBean(dep);
    }

    然後就創建 bean 了

    if (mbd.isSingleton()) {
        createBean(beanName, mbd, args);
    }
    
    // 真正的執行在 doCreateBean 過程中
    Object beanInstance = doCreateBean(beanName, mbdToUse, args);

    創建 bean 第一步 new Bean

    if (instanceWrapper == null) {
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }

    創建 bean 第二步,執行所有的 processor ,包含 MergedBeanDefinitionPostProcessor ,所以在這一步註冊注入選項

    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

    創建 bean 第三步,填充 bean ,這裏做的 @Autowired 注入

    populateBean(beanName, mbd, instanceWrapper);

    最終的處理過程在 AutowiredAnnotationBeanPostProcessor 的 postProcessPropertyValues 函數中

    metadata.inject(bean, beanName, pvs);

    因為在前面已經獲取過依賴項,並且把其丟進了容器,所以這裡是直接用反射寫進去就可以了

    創建 bean 第四步,初始化 bean ,這裡有一個方法注入,方法注入原來發生在初始化 bean 過程中,還有就是生命周期函數執行了,包含 BeanPostProcessor 的前置後置生命周期,初始化方法等

    小說明 :AutowiredAnnotationBeanPostProcessor 即是 一個 MergedBeanDefinitionPostProcessor 也是一個 InstantiationAwareBeanPostProcessor

    一點小推廣

    創作不易,希望可以支持下我的開源軟件,及我的小工具,歡迎來 gitee 點星,fork ,提 bug 。

    Excel 通用導入導出,支持 Excel 公式
    博客地址:
    gitee:

    使用模板代碼 ,從數據庫生成代碼 ,及一些項目中經常可以用到的小工具
    博客地址:
    gitee:

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • ES6學習筆記01 — 暫時性死區 ( temporal dead zone )

    參考文檔:   

           

           

    注:文中代碼僅作示意,複製運行時需要適當調整

      
    ES6 規定,如果代碼區塊中存在 let  const 命令聲明的變量,這個區塊對這些變量從一開始就形成了封閉作用域,直到聲明語句完成,這些變量才能被訪問(獲取或設置),否則會報錯ReferenceError。這在語法上稱為“暫時性死區”(英temporal dead zone,簡 TDZ),即代碼塊開始到變量聲明語句完成之間的區域。
      通過 var 聲明的變量擁有變量提升、沒有暫時性死區,作用於函數作用域:

      • 當進入變量的作用域(包圍它的函數),立即為它創建(綁定)存儲空間,立即被初始化並被賦值為 undefined   
      • 當執行到變量的聲明語句時,如果變量定義了值則會被賦值
        (function fn() {  //函數作用域開始
            console.log(temp)  //undefined
            //聲明
            var temp 
            console.log(temp)  //undefined
            //賦值
            temp = 123
            console.log(temp)  //123
        })()
        //在函數作用域外訪問
        console.log(temp)  //ReferenceError: temp is not defined

     

      通過 let 聲明的變量沒有變量提升、擁有暫時性死區,作用於塊級作用域:

      • 當進入變量的作用域(包圍它的語法塊),立即為它創建(綁定)存儲空間,不會立即初始化,也不會被賦值
      • 訪問(獲取或設置)該變量會拋出異常 ReferenceError
      • 當執行到變量的聲明語句時,如果變量定義了值則會被賦值,如果變量沒有定義值,則被賦值為undefined
            {  //函數作用域開始,TDZ開始
                console.log(temp)  //ReferenceError: temp is not defined
                //聲明
                let temp  
                console.log(temp)  //ReferenceError: Cannot access 'temp' before initialization
                //賦值
                temp = 345  //TDZ結束
                console.log(temp)  //345
                //塊級作用域結束
            }
            //在塊級作用域外訪問
            console.log(temp)  //ReferenceError: temp is not defined

     

      通過 const 聲明的常量,需要在定義的時候就賦值,並且之後不能改變,暫時性死區與 let 類似。

            {   //作用域開始,TDZ開始
                console.log(temp)  //ReferenceError: temp is not defined
                //聲明並賦值
                const temp = 789  //TDZ結束
                console.log(temp)  //789 
                //給常量賦值
                temp = 987  //TypeError: Assignment to constant variable
                //作用域結束
            }   
            //在作用域外訪問
            console.log(temp)  //ReferenceError: temp is not defined

     

      
    一句話總結:在塊級作用域中, let  const 聲明的變量、常量在聲明語句執行完成之前不能訪問(包括聲明語句本身)
      另外,容易因為 暫時性死區 而出錯的細節代碼在此不展開舉例,參考文檔中有詳情舉例。  
      附:第一次寫學習筆記,寫隨筆花費的時間比學習相關內容的時間還要長,感覺有點本末倒置,不過以後回頭看應該會覺得有所值得吧!  

      

      

     

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

  • 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;
    *
    *
    *
    *
    */

     

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

    【其他文章推薦】

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

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

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

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

  • 特斯拉:兩年後你的車就能「自己」來找你

    特斯拉於上週六(9日)發佈了最新車載作業系統Version 7.1,此次升級對自動駕駛儀的多款主要功能進行了升級。最重要的就是「召喚」功能,即在無需司機駕駛的情況下,汽車可以自主進入或退出停車位或車庫。

    特斯拉的軟體升級是在2016年CES消費電子展之後進行的,今年展會上自動駕駛汽車和更先進的車載軟體成為汽車製造商中的兩大熱門主題。馬斯克(Elon Musk)認為,從技術上看,自動駕駛汽車將在未來24個月到36個月之間準備就緒。

    至於當前的「召喚」功能,其所能執行的任務還相當有限。馬斯克稱當前的反覆運算更像是遙控功能,而非自動駕駛功能。當前的「召喚」功能要求司機與汽車距離不超過10米。在使用這個功能時,司機需要持續監控和維持對汽車的控制。此外,特斯拉要求司機只能在地形平坦的私人停車位使用「召喚」功能。

    與此同時,Version 7.1最新升級還可讓特斯拉電動汽車自我泊車,無論是在平行還是垂直位置。特斯拉自動駕駛儀的自動引導功能也增加了更多限制,比如在居民區或沒有中央分隔線的公路上,速度更慢。而在其他公路上,自動引導功能也將車速限制為時速8公里或10公里以內。馬斯克表示,為了保證汽車安全行駛,這些新的限制完全合理。

    此外,特斯拉還添加了新的安全功能,比如曲線速度自我調整功能,汽車可以掃描前面公路上的曲線,自動駕駛儀可根據所得資訊自動調整速度。

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

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

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

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

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

  • 《中國電動汽車標準化工作線圖》將於近日發佈

    1月11日,《中國電動汽車標準化工作路線圖》評審會在北京召開。《路線圖》由中國汽車技術研究中心等單位聯合制定,將於近日發佈。

    路線圖的定位

    本版路線圖的起止階段為2015年至2025年,通過對2015年至2025年電動汽車及其相關產業的技術發展、產業化和市場化發展的判斷和預測,制定2015年至2025年中國電動汽車標準化工作的具體目標和工作計畫。在對國內外電動汽車標準和法規進行總結和歸納的基礎上,著重分析和研究中國電動汽車在未來的10年中,電動汽車及其相關產業的技術發展、產業化和市場化發展的標準需求,以此作為中國電動汽車快速健康發展的主要技術支撐。路線圖中標準化工作實施期限分為:緊急(2015年1月至2015年12月)、短期(2016年1月至2017年12月)、中期(2018年1月至2020年12月)和長期(2021年1月至2025年12月)共4個階段。由上述內容構成的本路線圖,將成為指導從2015年至2025年中國電動汽車標準化工作的綱領性檔。

    路線圖的範圍

    a)電動車輛:純電動汽車、混合動力電動汽車(包括插電式和增程式)、燃料電池電動汽車以及電動車輛相關零部件等;

    b)基礎設施:充電樁、充電站、換電站和加氫站等;

    c)相關產業:電動汽車及電池的運輸、回收利用、教育培訓、搶險救援等。

    d) 本路線圖覆蓋基礎設施和相關產業的建設、運營、管理等。

    路線圖的目標

    路線圖的目標是有目的、有計劃、有步驟地建立起聯繫緊密、相互協調、層次分明、構成合理、相互支持、滿足應用需求的整體性、系統性、開放性的電動汽車標準體系,加速制定一系列由標準體系確定的具體標準,從而降低研究、生產、使用、維護及管理的成本和風險,使標準化工作發揮最佳效益,支撐和引導我國電動汽車產業的技術創新和快速發展,即:

    ——提出系統、科學的電動汽車標準體系;

    ——提出未來十年需要制修訂的標準專案;

    ——提出我國電動汽車標準及體系建設的實施步驟;

    ——促進科技創新;

    ——改變能源結構和推動節能減排;

    ——促進電動汽車大規模產業化;

    ——滿足科研、產業化、市場化運行和政府管理的需要;

    ——積極參與國際標準化工作,爭取中國標準走向世界。

    路線圖的實施

    通過對國內外電動汽車標準化工作的現狀的分析,為了滿足電動汽車產業的發展,未來標準的缺項進行了梳理,路線圖將通過表格和圖形的形式,對標準缺項進行系統的整理,按照時間序列來闡述從2015年1月至2025年12月共11年的標準制定計劃,計畫為4個階段(優先順序),分為緊急(2015年1月至2015年12月)、短期(2106年1月至2017年12月、中期(2018年1月至2020年12月)、長期(2021年1月至2025年12月)。

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

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

    ※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

    ※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

  • 電動摺疊腳踏車、滑板車搶攻最後一哩交通需求

    電動摺疊腳踏車、滑板車搶攻最後一哩交通需求

    傳統交通工具汽機車造成許多空氣污染與碳排放,許多廠商認為解決方案是電動車、電動機車,不過,也有人提出另一個想法,那就是何不更充分利用大眾運輸工具,只要解決捷運站到目的地的「最後一哩」交通需求即可鼓勵許多人不用自己開車、騎機車,而願意搭乘捷運。在 CES 2016 上,許多廠商都推出類似概念的產品。

    Cycle Board 推出「街道衝浪者」(Street Surfer)電動滑板三輪車,這輛滑板車的前端有兩輪,連接把手,負責轉向,較大的雙前輪也提供在人行道等不平坦路面上的穩定性,後端有一個小輪,把手可伸縮配合使用者身高,也可收疊起來方便攜帶,把手上除了剎車等基本控制,還可裝上手機。「街道衝浪者」充電一次可行駛 15 到 20 英里(24.1 到 32.2 公里),最高時速 20 英里(32.2 公里)。

    ▲ Street Surfer(Source:) Urban626 則推出 Urb-e 折疊式電動腳踏車,結構像是一把折疊刀,設計師宣稱可快速折疊,實測大約 1 秒鐘可折疊起來,便於帶電車車廂,或是裝進汽車後車廂,骨架以鋁打造,總重 35 英磅(15.876 公斤),時速最高 24 公里,充電 4 小時充飽後,可以行駛 32 公里。   由 Smart Rhino 推出的 Xcooter 同樣是電動折疊式腳踏車,以 X 形狀骨架收合,充電 3 小時可行駛 28 公里,最高時速 80 公里,重量 18 公斤。這些可折疊的電動腳踏車或許是解決捷運站到目的地交通問題的解決方案,不過售價可不便宜,Urb-e 售價 1,500 美元,將近 5 萬元新台幣,Xcooter 預售價 1,499 美元,而 2016 年 4 月正式上市時售價將為 1,799 美元,將近 6 萬元新台幣。

    (本文授權轉載自《》─〈〉)

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

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    ※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

    ※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

    ※評比南投搬家公司費用收費行情懶人包大公開

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

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

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

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

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

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

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

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

    【其他文章推薦】

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

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

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

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