亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

值得收藏的SpringBoot 實用的小技巧

 更新時間:2018年10月15日 08:30:00   作者:crossoverJie  
最近分享的一些源碼、框架設計的東西。我發(fā)現(xiàn)大家熱情不是特別高,想想大多數(shù)應該還是正兒八經(jīng)寫代碼的居多;這次就分享一點接地氣的: SpringBoot 使用中的一些小技巧 ,需要的朋友可以參考下

前言

最近分享的一些源碼、框架設計的東西。我發(fā)現(xiàn)大家熱情不是特別高,想想大多數(shù)應該還是正兒八經(jīng)寫代碼的居多;這次就分享一點接地氣的: SpringBoot 使用中的一些小技巧。

算不上多高大上的東西,但都還挺有用。

屏蔽外部依賴

第一個是屏蔽外部依賴,什么意思呢?

比如大家日常開發(fā)時候有沒有這樣的煩惱:

項目是基于 SpringCloud 或者是 dubbo 這樣的分布式服務,你需要依賴許多基礎服務。

比如說某個訂單號的生成、獲取用戶信息等。

由于服務拆分,這些功能都是在其他應用中以接口的形式提供,單測還好我還可以利用 Mock 把它屏蔽掉。

但如果自己想把應用啟動起來同時把自己相關的代碼跑一遍呢?

通常有幾種做法:

•本地把所有的服務都啟動起來。
•把注冊中心換為開發(fā)環(huán)境,依賴開發(fā)環(huán)境的服務。
•直接把代碼推送到開發(fā)環(huán)境自測。

看起來三種都可以,以前我也是這么干的。但還是有幾個小問題:

•本地啟動有可能服務很多,全部起來電腦能不能撐住還兩說,萬一服務有問題就進行不下去了。
•依賴開發(fā)環(huán)境的前提是網(wǎng)絡打通,還有一個問題就是開發(fā)環(huán)境代碼很不穩(wěn)定很大可能會影響你的測試。
•推送到開發(fā)環(huán)境應該是比較靠譜的方案,但如果想調(diào)試只有日志大法,沒有本地 debug 的效率高效。

那如何解決問題呢?既可以在本地調(diào)試也不用啟動其他服務。

其實也可以利用單測的做法,把其他外部依賴 Mock 掉就行了。

大致的流程分為以下幾步:

•SpringBoot 啟動之后在 Spring 中找出你需要屏蔽的那個 API 的 bean(通常情況下這個接口都是交給 Spring 管理的)。
•手動從 bean 容器中刪除該 bean。
•重新創(chuàng)建一個該 API 的對象,只不過是通過 Mock 出來的。
•再手動注冊進 bean 容器中。

以下面這段代碼為例:

 @Override
 public BaseResponse<OrderNoResVO> getUserByHystrix(@RequestBody UserReqVO userReqVO) {

  OrderNoReqVO vo = new OrderNoReqVO();
  vo.setAppId(123L);
  vo.setReqNo(userReqVO.getReqNo());
  BaseResponse<OrderNoResVO> orderNo = orderServiceClient.getOrderNo(vo);
  return orderNo;
 }

這是一個 SpringCloud 應用。

它依賴于 orderServiceClient 獲取一個訂單號。

其中的 orderServiceClient 就是一個外部 API,也是被 Spring 所管理。

替換原有的 Bean

下一步就是替換原有的 Bean。

@Component
public class OrderMockServiceConfig implements CommandLineRunner {

 private final static Logger logger = LoggerFactory.getLogger(OrderMockServiceConfig.class);

 @Autowired
 private ApplicationContext applicationContext;

 @Value("${excute.env}")
 private String env;

 @Override
 public void run(String... strings) throws Exception {

  // 非本地環(huán)境不做處理
  if ("dev".equals(env) || "test".equals(env) || "pro".equals(env)) {
   return;
  }

  DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();

  OrderServiceClient orderServiceClient = defaultListableBeanFactory.getBean(OrderServiceClient.class);
  logger.info("======orderServiceClient {}=====", orderServiceClient.getClass());

  defaultListableBeanFactory.removeBeanDefinition(OrderServiceClient.class.getCanonicalName());

  OrderServiceClient mockOrderApi = PowerMockito.mock(OrderServiceClient.class,
    invocationOnMock -> BaseResponse.createSuccess(DateUtil.getLongTime() + "", "mock orderNo success"));

  defaultListableBeanFactory.registerSingleton(OrderServiceClient.class.getCanonicalName(), mockOrderApi);

  logger.info("======mockOrderApi {}=====", mockOrderApi.getClass());
 }
}

其中實現(xiàn)了 CommandLineRunner 接口,可以在 Spring 容器初始化完成之后調(diào)用 run() 方法。

代碼非常簡單,簡單來說首先判斷下是什么環(huán)境,畢竟除開本地環(huán)境其余的都是需要真正調(diào)用遠程服務的。

之后就是獲取 bean 然后手動刪除掉。

關鍵的一步:

OrderServiceClient mockOrderApi = PowerMockito.mock(OrderServiceClient.class,
    invocationOnMock -> BaseResponse.createSuccess(DateUtil.getLongTime() + "", "mock orderNo success"));
defaultListableBeanFactory.registerSingleton(OrderServiceClient.class.getCanonicalName(), mockOrderApi);

創(chuàng)建了一個新的 OrderServiceClient 對象并手動注冊進了 Spring 容器中。

第一段代碼使用的是 PowerMockito.mock 的 API,他可以創(chuàng)建一個代理對象,讓所有調(diào)用 OrderServiceClient 的方法都會做默認的返回。

BaseResponse.createSuccess(DateUtil.getLongTime() + "", "mock orderNo success"))

測試一下,當我們沒有替換時調(diào)用剛才那個接口并且本地也沒有啟動 OrderService:

因為沒有配置 fallback 所以會報錯,表示找不到這個服務。

替換掉 bean 時:

再次請求沒有報錯,并且獲得了我們默認的返回。

通過日志也會發(fā)現(xiàn) OrderServiceClient 最后已經(jīng)被 Mock 代理了,并不會去調(diào)用真正的方法。

配置加密

下一個則是配置加密,這應該算是一個基本功能。

比如我們配置文件中的一些賬號和密碼,都應該是密文保存的。

因此這次使用了一個開源組件來實現(xiàn)加密與解密,并且對 SpringBoot 非常友好只需要幾段代碼即可完成。

•首先根據(jù)加密密碼將需要加密的配置加密為密文。
•替換原本明文保存的配置。
•再使用時進行解密。

使用該包也只需要引入一個依賴即可:

<dependency>
 <groupId>com.github.ulisesbocchio</groupId>
 <artifactId>jasypt-spring-boot-starter</artifactId>
 <version>1.14</version>
</dependency>

同時寫一個單測根據(jù)密碼生成密文,密碼也可保存在配置文件中:

jasypt.encryptor.password=123456

接著在單測中生成密文。

 @Autowired
 private StringEncryptor encryptor;

 @Test
 public void getPass() {
  String name = encryptor.encrypt("userName");
  String password = encryptor.encrypt("password");
  System.out.println(name + "----------------");
  System.out.println(password + "----------------");
 }

之后只需要使用密文就行。

由于我這里是對數(shù)據(jù)庫用戶名和密碼加密,所以還得有一個解密的過程。

利用 Spring Bean 的一個增強接口即可實現(xiàn):

@Component
public class DataSourceProcess implements BeanPostProcessor {


 @Autowired
 private StringEncryptor encryptor;

 @Override
 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  return bean;
 }

 @Override
 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

  if (bean instanceof DataSourceProperties){
   DataSourceProperties dataSourceProperties = (DataSourceProperties) bean;
   dataSourceProperties.setUsername(encryptor.decrypt(dataSourceProperties.getUsername())) ;
   dataSourceProperties.setPassword(encryptor.decrypt(dataSourceProperties.getPassword()));
   return dataSourceProperties ;
  }
  return bean;
 }
}

這樣就可以在真正使用時還原為明文。

同時也可以在啟動命令中配置剛才的密碼:

java -Djasypt.encryptor.password=password -jar target/jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar

總結

上文的一些實例代碼可以在這里找到:

https://github.com/crossoverJie/springboot-cloud

以上所述是小編給大家介紹的值得收藏的SpringBoot 實用的小技巧,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • java設計模式--策略模式詳解

    java設計模式--策略模式詳解

    這篇文章主要介紹了Java經(jīng)典設計模式之策略模式,簡單說明了策略模式的概念、原理并結合實例形式分析了java策略模式的具有用法與相關注意事項,需要的朋友可以參考下
    2021-07-07
  • Java實現(xiàn)文件及文件夾的刪除

    Java實現(xiàn)文件及文件夾的刪除

    這篇文章主要為大家詳細介紹了Java實現(xiàn)文件及文件夾的刪除,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • maven打包失敗踩坑的解決方式詳解

    maven打包失敗踩坑的解決方式詳解

    最近因為新項目有很多自定義的jar包,而且占內(nèi)存很多,就直接拷貝過來,新開了一個maven倉庫,用的時候沒有問題,但是打包一直編譯不通過,下面這篇文章主要給大家介紹了關于maven打包失敗踩坑的解決方式,需要的朋友可以參考下
    2023-05-05
  • 簡單了解JAVA變量類型及代碼實例

    簡單了解JAVA變量類型及代碼實例

    這篇文章主要介紹了簡單了解JAVA變量類型及代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • java創(chuàng)建一個類實現(xiàn)讀取一個文件中的每一行顯示出來

    java創(chuàng)建一個類實現(xiàn)讀取一個文件中的每一行顯示出來

    下面小編就為大家?guī)硪黄猨ava創(chuàng)建一個類實現(xiàn)讀取一個文件中的每一行顯示出來的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Spring Boot兩種全局配置和兩種注解的操作方法

    Spring Boot兩種全局配置和兩種注解的操作方法

    Spring Boot使用一個application.properties或者application.yaml的文件作為全局配置文件,本文重點給大家介紹Spring Boot兩種全局配置和兩種注解的配置方法,感興趣的朋友一起看看吧
    2021-06-06
  • Java基礎教程之數(shù)組的定義與使用

    Java基礎教程之數(shù)組的定義與使用

    Java語言的數(shù)組是一個由固定長度的特定類型元素組成的集合,它們的數(shù)據(jù)類型必須相同,聲明變量的時候,必須要指定參數(shù)類型,這篇文章主要給大家介紹了關于Java基礎教程之數(shù)組的定義與使用的相關資料,需要的朋友可以參考下
    2021-09-09
  • Java開發(fā)必會的Linux命令

    Java開發(fā)必會的Linux命令

    這篇文章主要介紹了Java開發(fā)必會的Linux命令,幫助大家更好地進行java開發(fā),感興趣的小伙伴們可以參考一下
    2015-12-12
  • Java中 ? extends T 和 ? super T的理解

    Java中 ? extends T 和 ? super&nb

    本文主要介紹了Java中 ? extends T 和 ? super T的理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Java中的源文件、字節(jié)碼文件解讀

    Java中的源文件、字節(jié)碼文件解讀

    這篇文章主要介紹了Java中的源文件、字節(jié)碼文件,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03

最新評論