澳洲東西部爆發數十起野火 高溫預報不利救災

摘錄自2019年11月17日中央通訊社澳洲報導

澳洲東部和西部今天(17日)共有數十起野火焚燒,散布在寬闊帶狀區域。由於未來幾天氣溫預料將升高,風勢也將更強勁,消防人員正緊急強化防火措施。

澳洲西部部分地區18日氣溫預測將超越攝氏40度,且高溫預料下週擴大至東部,恐令新南威爾斯省(New South Wales)和昆士蘭省(Queensland)氣候環境更不利。這2個省分已飽受叢林野火肆虐之苦。澳洲叢林大火季今年提前在南半球春天爆發,9日至今已在新南威爾斯省造成4人死亡,摧毀303間房屋。

其中哥斯伯斯山(Gospers Mountain)火災在雪梨西北方郊區附近延燒超過4萬4800公頃,消防人員用「引火回燒」(back burn)方式強化防火線,但火勢仍尚未獲得控制。引火回燒是刻意放火來清除乾燥易燃的矮木叢。

新南威爾斯省環境暨遺產局(NSW Office of Environment and Heritage)在推特發文表示,由於火災危險程度仍處於非常高至嚴重等級,省內中部至北部沿海的國家公園大多將維持關閉,包括藍山(Blue Mountains)北部的國家公園,直到發布新通知。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

Angular 從入坑到挖坑 – 模塊簡介

一、Overview

Angular 入坑記錄的筆記第七篇,介紹 Angular 中的模塊的相關概念,了解相關的使用場景,以及知曉如何通過特性模塊來組織我們的 Angular 應用

對應官方文檔地址:

  • NgModule 簡介
  • NgModules
  • JavaScript 模塊 vs. NgModule
  • 使用根模塊啟動應用
  • 常用模塊
  • 特性模塊

二、Contents

  1. Angular 從入坑到棄坑 – Angular 使用入門
  2. Angular 從入坑到挖坑 – 組件食用指南
  3. Angular 從入坑到挖坑 – 表單控件概覽
  4. Angular 從入坑到挖坑 – HTTP 請求概覽
  5. Angular 從入坑到挖坑 – Router 路由使用入門指北
  6. Angular 從入坑到挖坑 – 路由守衛連連看
  7. Angular 從入坑到挖坑 – 模塊簡介

三、Knowledge Graph

四、Step by Step

4.1、前端模塊化

前端模塊化是指將程序中一組相關的功能按照一定的規則組織在一塊,整個模塊內部的數據和功能實現是私有的,通過 export 暴露其中的一些接口(方法)與系統中的別的模塊進行通信

NgModule 簡介

在 Angular 應用中,至少會存在一個 NgModule,也就是應用的根模塊(AppModule),通過引導這個根模塊就可以啟動整個項目

像開發中使用到 FormsModule、HttpClientModule 這種 Angular 內置的庫也都是一個個的 NgModule,在開發中通過將組件、指令、管道、服務或其它的代碼文件聚合成一個內聚的功能塊,專註於系統的某個功能模塊

常見的 NgModule 模塊
模塊名稱 模塊所在文件 功能點
BrowserModule @angular/platform-browser 用於啟動和運行瀏覽器應用的的基本服務
CommonModule @angular/common 使用 NgIf、NgFor 之類的內置指令
FormsModule @angular/forms 使用 NgModel 構建模板驅動表單
ReactiveFormsModule @angular/forms 構建響應式表單
RouterModule @angular/router 使用前端路由
HttpClientModule @angular/common/http 發起 http 請求
JavaScript 模塊與 NgModule

在 JavaScript 中,每一個 js 文件就是一個模塊,文件中定義的所有對象都從屬於那個模塊。 通過 export 關鍵字,模塊可以把其中的某些對象聲明為公共的,從而其它 JavaScript 模塊可以使用 import 語句來訪問這些公共對象

例如下面的示例代碼中,別的 javascript 模塊可以通過導入這個 js 文件來直接使用暴露的 getRolesgetUserInfo 方法

function getRoles() {
    // ...
}

function getUserInfo() {
    // ...
}

export {
    getRoles,
    getUserInfo
}

NgModule 是一個帶有 @NgModule 裝飾器的類,通過函數的參數來描述這個模塊,例如在上節筆記中創建的 CrisisModule,定義了我們在該特性模塊中創建的組件,以及需要使用到的其它模塊

在使用 @NgModule 裝飾器時,通常會使用到下面的屬性來定義一個模塊

  • declarations:當前模塊中的組件、指令、管道

  • imports:當前模塊所需的其它 NgModule 模塊

  • exports:其它模塊中可以使用到當前模塊可聲明的對象

  • providers:當前模塊向當前應用中其它應用模塊暴露的服務

  • bootstrap:用來定義整個應用的根組件,是應用中所有其它視圖的宿主,只有根模塊中才會存在

4.2、應用的根模塊

根模塊是用來啟動此 Angular 應用的模塊, 按照慣例,它通常命名為 AppModule

通過 Angular CLI 新建一個應用后,默認的根模塊代碼如下,通過使用 @NgModule 裝飾器裝飾 AppModule 類,定義了這個模塊的一些屬性特徵,從而告訴 Angular 如何編譯和啟動本應用

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
declarations

declarations 數組告訴 Angular 哪些組件屬於當前模塊。 當創建新的組件時,需要將它們添加到 declarations 數組中。每個組件都只能聲明在一個 NgModule 類中,同時,如果你使用了未聲明過的組件,Angular 將會報錯

同樣的,對於當前模塊使用到的自定義指令、自定義管道,也需要在 declarations 數組中進行聲明

imports

imports 數組表明當前模塊正常工作時需要引入哪些的模塊,例如這裏使用到的 BrowserModuleAppRoutingModule 或者是我們使用雙向數據綁定時使用到的 FormsModule,它表現出當前模塊的一個依賴關係

providers

providers 數組定義了當前模塊可以提供給當前應用其它模塊的各項服務,例如一個用戶模塊,提供了獲取當前登錄用戶信息的服務,因為應用中的其它地方也會存在調用的可能,因此,可以通過添加到 providers 數組中,提供給別的模塊使用

bootstrap

Angular 應用通過引導根模塊來啟動的,因為會涉及到構建組件樹,形成實際的 DOM,因此需要在 bootstrap 數組中添加根組件用來作為組件樹的根

4.3、特性模塊

特性模塊是用來將特定的功能或具有相關特性的代碼從其它代碼中分離出來,聚焦於特定應用需求。特性模塊通過它提供的服務以及共享出的組件、指令和管道來與根模塊和其它模塊合作

在上一章中,定義了一個 CrisisModule 用來包括包含與危機有關的功能模塊,創建特性模塊時可以通過 Angular CLI 命令行進行創建

-- 創建名為 xxx 的特性模塊
ng new component xxx
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { CrisisRoutingModule } from './crisis-routing.module';

import { FormsModule } from '@angular/forms';

import { CrisisListComponent } from './crisis-list/crisis-list.component';
import { CrisisDetailComponent } from './crisis-detail/crisis-detail.component';


@NgModule({
  declarations: [
    CrisisListComponent,
    CrisisDetailComponent
  ],
  imports: [
    CommonModule,
    FormsModule,
    CrisisRoutingModule
  ]
})
export class CrisisModule { }

當創建完成后,為了將該特性模塊包含到應用中,需要和 BrowserModuleAppRoutingModule 一樣,在根模塊中 imports 引入

默認情況下,NgModule 都是急性加載的,也就是說它會在應用加載時儘快加載,所有模塊都是如此,無論是否立即要用。對於帶有很多路由的大型應用,考慮使用惰性加載的模式。惰性加載可以減小初始包的尺寸,從而減少程序首次的加載時間

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { FormsModule } from '@angular/forms';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

// 添加自定義的模塊
import { CrisisModule } from './crisis/crisis.module';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    CrisisModule, // 引入自定義模塊
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

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

【【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

另闢財源!特斯拉開賣 Model S 二手車

電動車大廠特斯拉(Tesla)開始在官網銷售 Model S 二手車,跨出從新創公司轉變成主流車商的重要一步。特斯拉大約在一周前悄悄推出認證二手車方案,讓消費者可以買到價格比新車便宜的特斯拉電動車,並提供 4 年或 5 萬英里保修方案。   特斯拉發言人說,第一批二手車來源主要是一些車主淘汰舊車、添購去年底上市的四輪傳動 Model S。此外,特斯拉在 2012 年推出租車方案,租期通常為 3 年,這些車將在今年開始歸還給特斯拉。   特斯拉並不運用獨立經銷商通路,所以可以保有賣二手車的全部營收。不過,因特斯拉的二手車供應量有限,目前特斯拉網站只在美國 11 個大都會區提供二手車。特斯拉發言人說,這些二手車將分組存放,未必會存放在零售門市。客戶訂購二手車後,可以赴各地區的存放地點取車,或要求特斯拉把車運送到府。

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

【【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

看好電動車市場 大同及東元積極卡位

東元及大同看好電動車市場忙卡位布局。東元在菲律賓蘇比克灣設電動車廠,預計第 2 季完工、第 3 季投產。大同集團旗下尚志精密化學將磷酸鋰鐵正極材料打入日本及韓國等電池市場後,大同也以傳動馬達與動力系統廠商、車輛業談合作打入國外電動車市場供應鏈。   東元去年底董事會通過斥資 270 萬美元,3 月已在菲律賓蘇比克灣正式成立東元電動車公司,其特種電動三輪車及電動小巴的底盤是由東元與供應商共同開發;電控系統及馬達由東元負責供應;電池則是菲律賓當地供應,東元未來還打算跨足電動貨車領域。   大同集團旗下尚志精密化學生產磷酸鋰鐵正極材料,先後打入日本及韓國電動車電池市場後,大同開發各式高效率專業用電動車的傳動馬達,應用在電動高爾夫球車、電動貨卡車、電動堆高車、電動沙灘車、電動垃圾車壓縮系統、果菜市場電動搬運車及電動巴士。目前也積極與動力系統廠商、車輛業洽談合作,希望打入國外電動車市場供應鏈。

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

【【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

LG 化學將為長城汽車供應電動車電池

據 LG 化學 17 日公布的消息指出,近日該公司與中國最大 SUV (運動型多用途汽車) 和皮卡制造商簽署了電動車電池供應合約。根據合約,LG 化學將為長城汽車自 2017 年起量產的插電式混合動力車 (phev) 車型提供電池。   由此,LG 化學將為中國 20 萬輛電動車提供電池,在中國市場搶占先機,並奠定進入中國 SUV 市場的堅實基礎。2014 年中國 SUV 銷量約達 410 萬輛,預計在 2016 年將達 620 萬輛。

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

【【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

見證大火中的滅絕 大型農企開發摧殘亞馬遜雨林 有如殖民故事翻版

環境資訊中心外電;鄭景文 翻譯;彭瑞祥 審校;稿源:Mongabay

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

app自動化測試環境配置:adb環境配置、monkey環境配置、appium環境配置大全

1. 安裝jdk

安裝參考鏈接:https://www.cnblogs.com/erweimalaoshi/p/13204509.html

2. 安裝配置Andriod sdk

  安裝Andriod sdk前首先需要安裝配置好jdk環境。

  然後安裝Android sdk

  安裝完成后需要配置環境變量:ANDROID_HOME。

  (1)直接將Android sdk解壓到對應文件路徑下,比如我解壓到c盤根目錄andriod文件夾下

 

  (2)配置環境變量,系統變量裏面添加變量名 ANDROID_HOME 路徑為實際存放SDk的路徑

 

  (3)其他幾個路徑添加到系統環境變量Path中如下圖所示:

    第一個path

 

 

    第二個path

 

 

    第三個path

 

  (4)配置好后檢查一下

    在cmd中輸入adbaapt來判斷安裝是否成功

 

3.  模擬器的安裝夜神

  (1)默認快速安裝,安裝后打開夜神模擬器設置

 

  (2)還可以多開創建一個新的模擬器

 

4.  元素獲取工具-UIAutomator

  (1)進入Android sdk安裝目錄,找到tools文件夾,找到uiautomatorviewer.bat點擊運行,使用它獲取元素

  (2)首先,檢查手機設備是否連接了電腦,在手機設置開發者選項中勾選usb調試,如果沒有開發者選項,在關於平板中連續點擊7次就可以彈出來

  (3)在手機中打開要獲取元素的app

  (4)點擊UIAutomator中的按鈕

  (5)然後可以獲取app元素的信息。這個是1.0版本,2.0版本是集成在appium中的

5.  啟用adb調試

  adb ( Android Debug Bridge)是一個通用命令行工具,它允許你與模擬器實例或連接的 Android 設備進行通信。它可為各種設備操作提供便利,如安裝和調試應用。

  在 android_sdk/platform-tools/ 中找到 adb 工具,然後根據其具體的路徑配置好環境變量(環境變量在2中已經配置過)。然後啟動cmd 輸入‘adb’即可查看是否配置成功。

6. Appium環境搭建

  請安裝新版本node.js

  node.js安裝

  下載地址:https://nodejs.org/en/download/releases/

  注意:Node.js版本要注意與Appium兼容,Appium版本是1.13.0,則選擇的Node.js版本為12.11.1

  默認下一步安裝

  雙擊安裝包

 

  安裝好后通過cmd去查看是否安裝成功,用node -v 查看版本,如果提示不是內部命令,可能是環境變量錯誤或者用管理員身份運行

  查看包管理工具,用命令npm -v相當於python中的pip

Appium的安裝

  Appium Server其實可以通過命令 npm install -g appium來安裝。不過由於眾所周知的網絡原因,直接使用這樣安裝會非常非常慢,甚至會安裝失敗,所以我們可以使用國內鏡像來安裝。

  選用的鏡像是 淘寶NPM鏡像https://npm.taobao.org

鏡像設置

  npm install -g cnpm –registry=https://registry.npm.taobao.org

  執行完成命令看到如下提示則表示設置完成

  鏡像設置好后,就可以進行appium的安裝了

  #安裝最新版本

  cnpm install -g appium

  #安裝指定版本

  cnpm install appium@1.13.0 -g

  檢查是否安裝成功,在控制台輸入命令 appium即可啟動appium服務,appium -v查看版本

  如果輸入appium后显示:“appium不是內部或外部命令,也不是可運行的程序或批處理文件” 可以將appium安裝的路徑 如: “C:\Users\m1877\AppData\Roaming\npm”配置到系統環境變量Path中

安裝Appium-desktop

  下載地址:https://github.com/appium/appium-desktop/releases

  Appium-desktop工具其實封裝了Appium server和Node.js依賴環境。

  appium-desktop是初學者最容易上手的工具

7.python環境安裝配置

  安裝成功之後輸入命令 python –version看到如下提示即可

 

8.安裝Appium-Python-Client

  安裝此項的前提是python安裝好,並且pip安裝好

  通過命令: pip.exe install Appium-Python-Client 進行安裝。

 

  安裝后可以通過如下命令來檢測是否安裝成功。

  輸入命令from appium import webdriver” 回車,如果控制台沒有報錯,則說明安裝成功。

  如果出現如下報錯,則說明安裝失敗

  ImportError: No module named ‘appium’

  ImportError: cannot import name “webdriver”

  說明:裝Appium-Python-Client安裝后的路徑一般為:

  {Python 安裝路徑}\Lib\site-packages\appium

9.安裝 appium-doctor

  appium-doctor可以檢測Appium整體依賴環境配置情況。

  先安裝工具C:\Users\m1877>cnpm install appium-doctor -g

   在控制台輸入命令:appium-doctor 看到如下提示說明整體環境配置成功。

  如果上面某一項显示為“X”則說明相關環境沒有配置好,需要重新安裝配置。

  如果都是√表示appium環境安裝配置已經好了。

附加:(以下工具可安裝也可以不安裝,自行選擇)

 opencv4nodejs安裝

  為什麼要安裝這個,請參考:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/image-comparison.md

  首先先裝好git。

  安裝opencv4nodejs:cnpm i -g opencv4nodejs

 ffmpeg安裝

  在官網下載好

  直接解壓到目錄中,然後通過bin目錄配置環境變量

  配置好后cmd中,輸入ffmpeg -version驗證是否安裝成功

mjpeg-consumer安裝

  cnpm i -g mjpeg-consumer

bundletool.jar安裝

  下載地址:https://github.com/google/bundletool/releases/tag/0.9.0

  http://appium.io/docs/en/writing-running-appium/android/android-appbundle/

 

出處:https://home.cnblogs.com/u/erweimalaoshi/
歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

復育有望!首隻體外受精孵化的波多黎克鳳頭蟾蜍

摘錄自2019年11月25日自由時報德克薩斯州報導

美國研究人員多次嘗試復育瀕臨絕種的波多黎各鳳頭蟾蜍(Puerto Rican crested toad),日前沃思堡動物園(Fort Worth Zoo,Texas)利用從野外收集的冷凍精液通過體外受精首次成功地孵化了一隻蟾蜍。這次的成功也為全球僅存2400隻的波多黎各鳳頭蟾蜍復育計畫帶來一絲希望。

首隻由體外受精出生的蟾蜍雪寶(Olaf)。德州沃思堡動物園的外溫動物館長巴柏(Diane Barber)表示,園方通常不會為蟾蜍取名,但在經歷了多次的失敗後,雪寶的出生成為一個值得紀念的時刻。這隻蟾蜍是命名自冰雪奇緣(Frozen)中的角色雪寶,以紀念他來自冷凍精子。

波多黎各自然資源部(Department of Natural Resources)臨時秘書奧特羅(Armando Otero)表示,對於瀕臨滅絕的物種而言,這是一個重大進步,因為這項計畫將允許動物園、研究人員和其他保育人員擴大其遺傳種群,以增加總種群,同時又將蟾蜍留在其野生棲息地。

自2006年以來,沃斯堡動物園研究人員,配合執行波多黎各鳳頭蟾蜍保護計劃。 通過這項合作計劃,預計將300隻體外受精的蟾蜍,其中100隻透過圈養繁殖計劃送往其他動物園,其餘200頭蟾蜍將在12月通過聯邦快遞送往波多黎各以釋放到野外。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

奧迪拚轉型電動車 六年內裁員9500人

摘錄自2019年11月26日聯合新聞網報導

德國車廠奧迪(Audi)今(26日)宣布,計劃在2025年底前裁減9500個職位。這項行動包括在奧迪的大規模企業重組計畫內,目標在2029年底前省下數十億歐元成本。

屬於德國福斯汽車集團(Volkswagen Group)的奧迪,正在進行昂貴且痛苦的企業轉型,由發展內燃機引擎動力車轉向發展電動車。

奧迪表示,將透過優退方案和自然人力更替達成裁員目標,但同時也會在電動車和數位化領域繼續雇用新人。減少人力的行動將讓奧迪「在德國的兩座工廠產能最佳化」。

奧迪還說:「因此產生的60億歐元(約新台幣2018億元)經費,將確保達成公司策略鎖定的9%-11%報酬率區間,並投入電動化和數位化等未來計畫。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?

【String註解驅動開發】困擾了我很久的AOP嵌套調用終於解決了!

寫在前面

最近在分析Spring源碼時,在同一個類中寫了嵌套的AOP方法,測試時出現:Spring AOP在同一個類里自身方法相互調用時無法攔截。哎,怎麼辦?還能怎麼辦呢?繼續分析Spring源碼,解決問題唄。於是乎,有了本文。

項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

問題闡述

Spring AOP在同一個類里自身方法相互調用時無法攔截。比如下面的代碼:

public class SomeServiceImpl implements SomeService  {  
    public void someMethod()  {  
        someInnerMethod();  
    }  
    public void someInnerMethod(){  
    }  
} 

兩個方法經過AOP代理,執行時都實現系統日誌記錄。單獨使用someInnerMethod時,沒有任何問題。但someMethod就有問題了。someMethod里調用的someInnerMethod方法是原始的,未經過AOP增強的。我們期望調用一次someMethod會記錄下兩條系統日誌,分別是someInnerMethod和someMethod的,但實際上只能記錄下someMethod的日誌,也就是只有一條。在配置事務時也可能會出現問題,比如someMethod方法是REQUIRED,someInnerMethod方法是REQUIRES_NEW,someInnerMethod的配置將不起作用,與someMethod方法會使用同一個事務,不會按照所配置的打開新事務。

問題分析

由於java這個靜態類型語言限制,最後想到個曲線救國的辦法,出現這種特殊情況時,不要直接調用自身方法,而通過AOP代理后的對象。在實現里保留一個AOP代理對象的引用,調用時通過這個代理即可。例如下面的代碼。

//從beanFactory取得AOP代理后的對象  
SomeService someServiceProxy = (SomeService)beanFactory.getBean("someService");   

//把AOP代理后的對象設置進去  
someServiceProxy.setSelf(someServiceProxy);   

//在someMethod裏面調用self的someInnerMethod,這樣就正確了  
someServiceProxy.someMethod();  

但這個代理對象還要我們手動set進來。有沒有更好的方式解決呢?

問題解決

幸好SpringBeanFactory有BeanPostProcessor擴展,在bean初始化前後會統一傳遞給BeanPostProcess處理,繁瑣的事情就可以交給程序了,代碼如下,首先定義一個BeanSelfAware接口,實現了此接口的程序表明需要注入代理后的對象到自身。

public class SomeServiceImpl implements SomeService,BeanSelfAware{  
	//AOP增強后的代理對象  
    private SomeService self;
    //實現BeanSelfAware接口  
    public void setSelf(Object proxyBean){  
        this.self = (SomeService)proxyBean  
    }  
    public void someMethod(){  
        //注意這句,通過self這個對象,而不是直接調用的  
        someInnerMethod();
    }  
    public void someInnerMethod(){  
    }  
}  

再定義一個BeanPostProcessor,beanFactory中的每個Bean初始化完畢后,調用所有BeanSelfAware的setSelf方法,把自身的代理對象注入自身。

public class InjectBeanSelfProcessor implements BeanPostProcessor  {     
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{ 
        if(bean instanceof BeanSelfAware){  
            System.out.println("inject proxy:" + bean.getClass());  
            BeanSelfAware myBean = (BeanSelfAware)bean;  
            myBean.setSelf(bean);  
            return myBean;  
        }  
        return bean;  
    }  
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{  
        return bean;  
    }  
}

最後,在BeanFactory配置中組合起來,只需要把BeanPostProcesser加進去就可以了,比平常多一行配置而已。

<!-- 注入代理后的bean到bean自身的BeanPostProcessor... -->  
<bean class=" org.mypackage.InjectBeanSelfProcessor"></bean>  

<bean id="someServiceTarget" class="org.mypackage.SomeServiceImpl" />   

<bean id="someService" class="org.springframework.aop.framework.ProxyFactoryBean">  
    <property name="target">  
        <ref local="someServiceTarget" />  
    </property>  
    <property name="interceptorNames">  
        <list>  
            <value>someAdvisor</value>  
        </list>  
    </property>  
</bean>  
<!-- 調用spring的DebugInterceptor記錄日誌,以確定方法是否被AOP增強 -->  
<bean id="debugInterceptor" class="org.springframework.aop.interceptor.DebugInterceptor" />  

<bean id="someAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
    <property name="advice">  
        <ref local="debugInterceptor" />  
    </property>  
    <property name="patterns">  
        <list>  
            <value>.*someMethod</value>  
            <value>.*someInnerMethod</value>  
        </list>  
    </property>  
</bean>  

這裏的someService#someInnerMethod就表現出預期的行為了,無論怎樣,它都是經過AOP代理的,執行時都會輸出日誌信息。

注意事項

用XmlBeanFactory進行測試需要注意,所有的BeanPostProcessor並不會自動生效,需要執行以下代碼:

XmlBeanFactory factory = new XmlBeanFactory(...);  
InjectBeanSelfProcessor postProcessor = new InjectBeanSelfProcessor();  
factory.addBeanPostProcessor(postProcessor);  

好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!

項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

寫在最後

如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。

參考:iteye.com/blog/fyting-109236

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

【其他文章推薦】

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

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

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

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

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

※教你寫出一流的銷售文案?