Dubbo 新編程模型之外部化配置

来源:https://www.cnblogs.com/tpniu/archive/2018/01/18/8309170.html
-Advertisement-
Play Games

在Dubbo 註解驅動例子中,無論是服務提供方,還是服務消費方,均需要轉配相關配置Bean: ...


外部化配置(External Configuration)

Dubbo 註解驅動例子中,無論是服務提供方,還是服務消費方,均需要轉配相關配置Bean:

@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
       applicationConfig.setName("dubbo-annotation-consumer");
return applicationConfig;
}

雖然實現類似於 ProviderConfiguration 和 ConsumerConfiguration 這樣的 Spring@Configuration Bean 成本並不高,不過通過 Java Code 的方式定義配置 Bean,或多或少是一種 Hard Code(硬編碼)的行為,缺少彈性。

儘管在 Spring 應用中,可以通過 @Value 或者 Environment 的方式獲取外部配置,其代碼簡潔性以及類型轉換靈活性存在明顯的不足。因此,Spring Boot 提出了外部化配置(External Configuration)的感念,即通過程式以外的配置源,動態地綁定指定類型。

隨著 Spring Boot / Spring Cloud 應用的流行,開發人員逐漸地接受並且使用 Spring Boot 外部化配置(External Configuration),即通過 application.properties 或者bootstrap.properties 裝配配置 Bean。

下列表格記錄了 Dubbo 內置配置類:

images/Ra6bYWCT7j34WZy3sSrfHd4btx4RD6Ky.jpg

通過申明對應的 Spring 擴展標簽,在 Spring 應用上下文中將自動生成相應的配置 Bean。

在 Dubbo 官方用戶手冊的“屬性配置”章節中, dubbo.properties 配置屬性能夠映射到ApplicationConfig 、 ProtocolConfig 以及 RegistryConfig 的欄位。從某種意義上來說, dubbo.properties 也是 Dubbo 的外部化配置。

其中,引用“映射規則”的內容:

映射規則

將 XML 配置的標簽名,加屬性名,用點分隔,多個屬性拆成多行

比如: dubbo.application.name=foo等價於
<dubbo:applicationname="foo"/> 

比如: dubbo.registry.address=10.20.153.10:9090等價於
<dubbo:registryaddress="10.20.153.10:9090"/>

如果 XML 有多行同名標簽配置,可用 id 號區分,如果沒有 id 號將對所有同名標簽生效

比如: dubbo.protocol.rmi.port=1234等價於 
<dubbo:protocolid="rmi"name="rmi"port="1099"/>2

比如: dubbo.registry.china.address=10.20.153.10:9090等價於 
<dubbo:registryid="china"address="10.20.153.10:9090"/>

下麵是 dubbo.properties 的一個典型配置:

dubbo.application.name=foo
dubbo.application.owner=bar
dubbo.registry.address=10.20.153.10:9090

根據“映射規則”,Dubbo 即支持單配置 Bean 映射,也支持多 Bean 映射。綜合以上需求,既要相容 Dubbo 已有的一個或多個 Bean 欄位映射綁定,也支持外部化配置。

特別提醒:外部化配置(External Configuration)並非 Spring Boot 特有,即使在 Spring Framework 場景下亦能支持。也就是說 Dubbo 外部化配置即可在 Spring Framework 中工作,也能在 Spring Boot 中運行。

Dubbo 外部化配置(External Configuration) 支持起始版本為: 2.5.8

@EnableDubboConfig

起始版本: 2.5.8

使用說明

@EnableDubboConfig 定義

public @interface EnableDubboConfig {
/**
    * It indicates whether binding to multiple Spring Beans.
    *
    * @return the default value is <code>false</code>
    * @revised 2.5.9
    */
boolean multiple() default false;
}
  • multiple : 表示是否支持多Dubbo 配置 Bean 綁定。預設值為 false ,即單 Dubbo 配置 Bean 綁定

單 Dubbo 配置 Bean 綁定

為了更好地向下相容, @EnableDubboConfig 提供外部化配置屬性與 Dubbo 配置類之間的綁定,其中映射關係如下:

images/RizY8TpZtaeGQKpXbYzdJeznyKThPdnx.jpg

當標註 @EnableDubboConfig 的類被掃描註冊後,同時 Spring(Spring Boot)應用配置( PropertySources)中存在 dubbo.application.* 時, ApplicationConfigBean 將被註冊到在 Spring 上下文。否則,不會被註冊。如果出現 dubbo.registry.*的配置,那麼, RegistryConfig Bean 將會創建,以此類推。即按需裝配 Dubbo 配置 Bean。

如果需要指定配置 Bean的 id,可通過 **.id 屬性設置,以 dubbo.application 為例:

## application
dubbo.application.id = applicationBean
dubbo.application.name = dubbo-demo-application

以上配置等同於以下 Java Config Bean:

@Bean("applicationBean")
public ApplicationConfig applicationBean() {
ApplicationConfig applicationConfig = new ApplicationConfig();
       applicationConfig.setName("dubbo-demo-application");
return applicationConfig;
}

大致上配置屬性與配置類綁定模式 - dubbo.application.* 映射到ApplicationConfig 中的欄位。

註:當配置屬性名稱無法在配置類中找到欄位時,將會忽略綁定

多 Dubbo 配置 Bean 綁定

Dubbo @Service 和 @Reference 允許 Dubbo 應用關聯 ApplicationConfig Bean 或者指定多個 RegistryConfig Bean 等能力。換句話說,Dubbo 應用上下文中可能存在多個 ApplicationConfig 等 Bean定義。

為了適應以上需要,因此從Dubbo 2.5.9 開始, @EnableDubboConfig 支持多 Dubbo 配置 Bean 綁定,同時按照業界規約標準,與單 Dubbo 配置 Bean 綁定約定不同,配置屬性首碼均為英文複數形式:

詳情請參考 : https://github.com/alibaba/dubbo/issues/1141

dubbo.applications
dubbo.modules
dubbo.registries
dubbo.protocols
dubbo.monitors
dubbo.providers
dubbo.consumers

以 dubbo.applications 為例,基本的模式如下:

dubbo.applications.${bean-name}.property-name = ${property-value}

在單 Dubbo 配置 Bean 綁定時,可以通過指定 id 屬性的方式,定義ApplicationConfig Bean 的ID,即 dubbo.application.id

而在多 Dubbo 配置 Bean 綁定時,Bean ID 則由 dubbo.applications.與屬性欄位名稱( .property-name)之間的字元來表達。

如下配置:

# multiple Bean definition
dubbo.applications.applicationBean.name = dubbo-demo-application
dubbo.applications.applicationBean2.name = dubbo-demo-application2
dubbo.applications.applicationBean3.name = dubbo-demo-application3

該配置內容中,綁定了三個 ApplicationConfig Bean,分別是 applicationBeanapplicationBean2以及 applicationBean3

示例說明

@EnableDubboConfig 的使用方法很簡答, 再次強調一點,當規約的外部配置存在時,相應的 Dubbo 配置類 才會提升為 Spring Bean。簡言之,按需裝配。

單 Dubbo 配置 Bean 綁定

外部化配置文件

將以下內容的外部化配置文件物理路徑為: classpath:/META-INF/config.properties:

# 單 Dubbo 配置 Bean 綁定
## application
dubbo.application.id = applicationBean
dubbo.application.name = dubbo-demo-application
## module
dubbo.module.id = moduleBean
dubbo.module.name = dubbo-demo-module
## registry
dubbo.registry.address = zookeeper://192.168.99.100:32770
## protocol
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## monitor
dubbo.monitor.address = zookeeper://127.0.0.1:32770
## provider
dubbo.provider.host = 127.0.0.1
## consumer
dubbo.consumer.client = netty

@EnableDubboConfig 配置 Bean

/**
* Dubbo 配置 Bean
*
* @author <a href="mailto:[email protected]">Mercy</a>
*/
@EnableDubboConfig
@PropertySource("META-INF/config.properties")
@Configuration
public class DubboConfiguration {
}

實現引導類

/**
* Dubbo 配置引導類
*
* @author <a href="mailto:[email protected]">Mercy</a>
*/
public class DubboConfigurationBootstrap {
public static void main(String[] args) {
// 創建配置上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 註冊當前配置 Bean
       context.register(DubboConfiguration.class);
       context.refresh();
// application
ApplicationConfig applicationConfig = context.getBean("applicationBean", ApplicationConfig.class);
System.out.printf("applicationBean.name = %s \n", applicationConfig.getName());
// module
ModuleConfig moduleConfig = context.getBean("moduleBean", ModuleConfig.class);
System.out.printf("moduleBean.name = %s \n", moduleConfig.getName());
// registry
RegistryConfig registryConfig = context.getBean(RegistryConfig.class);
System.out.printf("registryConfig.name = %s \n", registryConfig.getAddress());
// protocol
ProtocolConfig protocolConfig = context.getBean(ProtocolConfig.class);
System.out.printf("protocolConfig.name = %s \n", protocolConfig.getName());
System.out.printf("protocolConfig.port = %s \n", protocolConfig.getPort());
// monitor
MonitorConfig monitorConfig = context.getBean(MonitorConfig.class);
System.out.printf("monitorConfig.name = %s \n", monitorConfig.getAddress());
// provider
ProviderConfig providerConfig = context.getBean(ProviderConfig.class);
System.out.printf("providerConfig.name = %s \n", providerConfig.getHost());
// consumer
ConsumerConfig consumerConfig = context.getBean(ConsumerConfig.class);
System.out.printf("consumerConfig.name = %s \n", consumerConfig.getClient());
}
}

執行結果

applicationBean.name = dubbo-demo-application 
moduleBean.name = dubbo-demo-module 
registryConfig.name = zookeeper://192.168.99.100:32770 
protocolConfig.name = dubbo 
protocolConfig.port = 20880 
monitorConfig.name = zookeeper://127.0.0.1:32770 
providerConfig.name = 127.0.0.1 
consumerConfig.name = netty

不難發現, @EnableDubboConfig 配置 Bean 配合外部化文件 classpath:/META-INF/config.properties,與執行輸出內容相同。

多 Dubbo 配置 Bean 綁定

外部化配置文件

將以下內容的外部化配置文件物理路徑為: classpath:/META-INF/multiple-config.properties:

# 多 Dubbo 配置 Bean 綁定
## dubbo.applications
dubbo.applications.applicationBean.name = dubbo-demo-application
dubbo.applications.applicationBean2.name = dubbo-demo-application2
dubbo.applications.applicationBean3.name = dubbo-demo-application3

@EnableDubboConfig 配置 Bean(多)

@EnableDubboConfig(multiple = true)
@PropertySource("META-INF/multiple-config.properties")
private static class DubboMultipleConfiguration {
}

實現引導類

/**
* Dubbo 配置引導類
*
* @author <a href="mailto:[email protected]">Mercy</a>
*/
public class DubboConfigurationBootstrap {
public static void main(String[] args) {
// 創建配置上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 註冊當前配置 Bean
       context.register(DubboMultipleConfiguration.class);
       context.refresh();
// 獲取 ApplicationConfig Bean:"applicationBean"、"applicationBean2" 和 "applicationBean3"
ApplicationConfig applicationBean = context.getBean("applicationBean", ApplicationConfig.class);
ApplicationConfig applicationBean2 = context.getBean("applicationBean2", ApplicationConfig.class);
ApplicationConfig applicationBean3 = context.getBean("applicationBean3", ApplicationConfig.class);
System.out.printf("applicationBean.name = %s \n", applicationBean.getName());
System.out.printf("applicationBean2.name = %s \n", applicationBean2.getName());
System.out.printf("applicationBean3.name = %s \n", applicationBean3.getName());
}
}

執行結果

applicationBean.name = dubbo-demo-application 
applicationBean2.name = dubbo-demo-application2 
applicationBean3.name = dubbo-demo-application3

@EnableDubboConfig(multiple=true) 執行後,運行結果說明 ApplicationConfigBean 以及 ID 的定義方式。

@EnableDubboConfigBinding & @EnableDubboConfigBindings

@EnableDubboConfig適合絕大多數外部化配置場景,然而無論是單 Bean 綁定,還是多 Bean 綁定,其外部化配置屬性首碼是固化的,如 dubbo.application 以及dubbo.applications 。

當應用需要自定義外部化配置屬性首碼, @EnableDubboConfigBinding能提供更大的彈性,支持單個外部化配置屬性首碼( prefix) 與 Dubbo 配置 Bean 類型(AbstractConfig 子類)綁定,如果需要多次綁定時,可使用@EnableDubboConfigBindings

儘管 Dubbo 推薦使用 Java 8 ,然而實際的情況,運行時的 JDK 的版本可能從 6到8 均有。因此,  @EnableDubboConfigBinding 沒有實現java.lang.annotation.Repeatable,即允許實現類不支持重覆標註 @EnableDubboConfigBinding

@EnableDubboConfigBinding 在支持外部化配置屬性與 Dubbo 配置類綁定時,與 Dubbo 過去的映射行為不同,被綁定的 Dubbo 配置類將會提升為 Spring Bean,無需提前裝配 Dubbo 配置類。同時,支持多 Dubbo 配置Bean 裝配。其 Bean 的綁定規則與@EnableDubboConfig一致。

起始版本: 2.5.8

使用說明

@EnableDubboConfigBinding 定義

public @interface EnableDubboConfigBinding {
/**
    * The name prefix of the properties that are valid to bind to {@link AbstractConfig Dubbo Config}.
    *
    * @return the name prefix of the properties to bind
    */
String prefix();
/**
    * @return The binding type of {@link AbstractConfig Dubbo Config}.
    * @see AbstractConfig
    * @see ApplicationConfig
    * @see ModuleConfig
    * @see RegistryConfig
    */
Class<? extends AbstractConfig> type();
/**
    * It indicates whether {@link #prefix()} binding to multiple Spring Beans.
    *
    * @return the default value is <code>false</code>
    */
boolean multiple() default false;
}
  • prefix() : 指定待綁定 Dubbo 配置類的外部化配置屬性的首碼,比如dubbo.application 為 ApplicationConfig 的外部化配置屬性的首碼。prefix() 支持占位符(Placeholder), 並且其關聯首碼值是否以"." 作為結尾字元是可選的,即 prefix()="dubbo.application" 與prefix()="dubbo.application."效果相同

  • type() : 指定 Dubbo 配置類,所有 AbstractConfig 的實現子類即可,如ApplicationConfig 、 RegistryConfig 以及 ProtocolConfig 等

  • multiple() : 表明是否需要將 prefix() 作為多個 type() 類型的 Spring Bean 外部化配置屬性。預設值為 false,即預設支持單個類型的 Spring 配置 Bean

假設標註 @EnableDubboConfigBinding 的實現類被 Spring 應用上下文掃描並且註冊後,其中 prefix() = dubbo.app 、 type() = ApplicationConfig.class ,且外部配置內容為:

dubbo.app.id = applicationBean
dubbo.app.name = dubbo-demo-application

Spring 應用上下文啟動後,一個 ID 為 "applicationBean" 的 ApplicationConfig Bean 被初始化,其 name 欄位被設置為 "dubbo-demo-application"。

EnableDubboConfigBindings 定義

public @interface EnableDubboConfigBindings {
/**
    * The value of {@link EnableDubboConfigBindings}
    *
    * @return non-null
    */
EnableDubboConfigBinding[] value();
}
  • value : 指定多個 EnableDubboConfigBinding,用於實現外部化配置屬性首碼(prefix) 與 Dubbo 配置 Bean 類型( AbstractConfig 子類)綁定。

示例說明

外部化配置文件

將以下內容的外部化配置文件物理路徑為: classpath:/META-INF/bindings.properties

# classpath:/META-INF/bindings.properties
## 占位符值 : ApplicationConfig 外部配置屬性首碼
applications.prefix = dubbo.apps.
## 多 ApplicationConfig Bean 綁定
dubbo.apps.applicationBean.name = dubbo-demo-application
dubbo.apps.applicationBean2.name = dubbo-demo-application2
dubbo.apps.applicationBean3.name = dubbo-demo-application3
## 單 ModuleConfig Bean 綁定
dubbo.module.id = moduleBean
dubbo.module.name = dubbo-demo-module
## 單 RegistryConfig Bean 綁定
dubbo.registry.address = zookeeper://192.168.99.100:32770

EnableDubboConfigBindings 配置 Bean

DubboConfiguration 作為 Dubbo 配置 Bean,除通過 @EnableDubboConfigBinding綁定之外,還需要 @PropertySource 指定外部化配置文件( classpath:/META-INF/bindings.properties):

/**
* Dubbo 配置 Bean
*
* @author <a href="mailto:[email protected]">Mercy</a>
*/
@EnableDubboConfigBindings({
@EnableDubboConfigBinding(prefix = "${applications.prefix}",
               type = ApplicationConfig.class, multiple = true), // 多 ApplicationConfig Bean 綁定
@EnableDubboConfigBinding(prefix = "dubbo.module", // 不帶 "." 尾碼
               type = ModuleConfig.class), // 單 ModuleConfig Bean 綁定
@EnableDubboConfigBinding(prefix = "dubbo.registry.", // 帶 "." 尾碼
               type = RegistryConfig.class) // 單 RegistryConfig Bean 綁定
})
@PropertySource("META-INF/bindings.properties")
@Configuration
public class DubboConfiguration {
}

實現引導類

通過之前的使用說明,當 EnableDubboConfigBinding 將外部配置化文件classpath:/META-INF/dubbo.properties 綁定到 ApplicationConfig後,其中 Spring Bean "applicationBean" 的 name 欄位被設置成 "dubbo-demo-application"。同時, EnableDubboConfigBinding 所標註的 DubboConfiguration 需要被 Sring 應用上下文註冊:

/**
* Dubbo 配置引導類
*
* @author <a href="mailto:[email protected]">Mercy</a>
*/
public class DubboConfigurationBootstrap {
public static void main(String[] args) {
// 創建配置上下文
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// 註冊當前配置 Bean
       context.register(DubboConfiguration.class);
       context.refresh();
// 獲取 ApplicationConfig Bean:"applicationBean"、"applicationBean2" 和 "applicationBean3"
ApplicationConfig applicationBean = context.getBean("applicationBean", ApplicationConfig.class);
ApplicationConfig applicationBean2 = context.getBean("applicationBean2", ApplicationConfig.class);
ApplicationConfig applicationBean3 = context.getBean("applicationBean3", ApplicationConfig.class);
System.out.printf("applicationBean.name = %s \n", applicationBean.getName());
System.out.printf("applicationBean2.name = %s \n", applicationBean2.getName());
System.out.printf("applicationBean3.name = %s \n", applicationBean3.getName());
// 獲取 ModuleConfig Bean:"moduleBean"
ModuleConfig moduleBean = context.getBean("moduleBean", ModuleConfig.class);
System.out.printf("moduleBean.name = %s \n", moduleBean.getName());
// 獲取 RegistryConfig Bean
RegistryConfig registry = context.getBean(RegistryConfig.class);
System.out.printf("registry.address = %s \n", registry.getAddress());
}
}

運行結果

DubboConfigurationBootstrap 運行後控制台輸出:

applicationBean.name = dubbo-demo-application 
applicationBean2.name = dubbo-demo-application2 
applicationBean3.name = dubbo-demo-application3 
moduleBean.name = dubbo-demo-module 
registry.address = zookeeper://192.168.99.100:32770

輸出的內容與 classpath:/META-INF/bindings.properties 綁定的內容一致,符合期望。

作者:小馬哥

鏈接:Dubbo 新編程模型之外部化配置

更多參考內容:http://www.roncoo.com/article/index?tn=Dubbo


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在進行網站網頁設計製作的時候,經常需要用到不同的顏色的搭配,效果,網頁中標明顏色比較好的是用十六進位數據來進行標註,但是由於顏色很多,這些十六進位代碼數量龐大,所以blueslu整理了一些網站建設項目中網頁調色常用的顏色代碼,以備使用。 #9f0101 #67b55b #fff68f #ffd700 ...
  • Angular-搜索框及價格上下限 閑來無事,寫一個簡單的angular的搜索框。 1.要求: 利用 AngularJS 框架實現手機產品搜索功能,題目要求: 1)自行查找素材,按照原有數據格式將手機產品數據豐富到至少10個以上 2)自行設計頁面,需要包含“搜索條件部分”,“手機信息顯示部分” 3) ...
  • 先看background和background-color background:可以設置背景顏色,背景圖片,還有定位。預設background:no-repeat; background-color:只可以設置背景顏色。預設background:repeat; 設置透明度的方式有兩種: 第一種: ...
  • 這篇教程是由以太坊Mist瀏覽器的負責人撰寫,完整地介紹瞭如何開發一個標準的DApp。 ...
  • 新手跳坑。你寫的路徑路由是正確的,但是發現點擊了,一點反應也沒有,很可能是下下麵幾種原因: 1:你要跳轉的是tabBar中的頁面,需要用到專屬的跳轉方法switchtab 2:在app.js中沒有配置該頁面 3:頁面層級是不是超過五層了。可以用銷毀的跳轉方式 wx.navigateTo(OBJECT ...
  •   前前後後已經快寫了2年左右javaScript,剛開始只是簡單用於一些表單驗證和操作dom節點,並沒有深入的使用,隨著漸漸的深入,開始不想去寫重覆的代碼(懶的開始),從而寫簡單的繼承,封裝,抽象等等,最終效果寫重覆代碼少、可用性高(主要:迭代快、代碼可以持續使用, 加班 也少 ...
  • 1、示例代碼 2、解決this綁定問題 (1)最常用的是方法一 (2)箭頭函數:不夠理想,函數是匿名的;同時混淆了this綁定規則和詞法作用域規則。 ...
  • Simple Demo 假如我們設計一款RPG游戲,裡面有各種職階的角色可以選擇:劍士、弓箭手、槍兵、騎師等。 該游戲內部設計使用了標準的面向對象技術,設計了一個角色超類,並讓各種職階角色繼承該超類。子類先以劍士、槍兵為例。 現在突然有了一個需求:在玩家有一段時間沒有操作游戲角色後,游戲角色可以在等 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...