Java static方法塊只獲取一次物件控制程式碼供全域性使用
前言
說實話,以前沒碰見過必須只獲取一次物件供全域性使用的地方,或者說多重複例項化獲得新的控制程式碼對程式也沒什麼影響,但是這種習慣是非常很不好的,比如我最近在向hdfs寫入檔案的時候我希望FileSystem fs這個控制程式碼只獲得一次,後面所有的fs操作都用這一個物件就行,因為有kerberos的驗證,如果每次操作都需要獲取FileSystem fs這個控制程式碼一來浪費驗證的時間,二來會多佔用一點記憶體!
程式碼
package com.bodyproperty.util;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.security.UserGroupInformation;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* @Auther: kc
* @Date: 2018/12/19 11:22
* @Description:
*/
@Component
public class HdfsUtil {
static FileSystem fs;
static{
if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
// Windows系統
System.setProperty("java.security.krb5.conf", "C:/Program Files/MIT/Kerberos/krb5.ini");
} else {
// linux系統
System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
}
Configuration conf = new Configuration();
//這裡設定namenode新
conf.set("fs.defaultFS", "hdfs://test-da-shanghai:8020");
//需要增加hadoop開啟了安全的配置
conf.setBoolean("hadoop.security.authorization", true);
//配置安全認證方式為kerberos
conf.set("hadoop.security.authentication", "kerberos");
//設定namenode的principal
conf.set("dfs.namenode.kerberos.principal", "nn/test-da-shanghai@BIGDATA.COM");
//設定datanode的principal值為“hdfs/_HOST@YOU-REALM.COM”
conf.set("dfs.datanode.kerberos.principal", "dn/test-da-shanghai@BIGDATA.COM");
conf.set("dfs.support.append", "true");
conf.set("dfs.client.block.write.replace-datanode-on-failure.policy", "NEVER");
conf.set("dfs.client.block.write.replace-datanode-on-failure.enable", "true");
//通過hadoop security下中的 UserGroupInformation類來實現使用keytab檔案登入
UserGroupInformation.setConfiguration(conf);
//設定登入的kerberos principal和對應的keytab檔案,其中keytab檔案需要kdc管理員生成給到開發人員
try {
UserGroupInformation.loginUserFromKeytab("xxxx@BIGDATA.COM", "file:/usr/lihong/lihong.keytab");
} catch (Exception e) {
System.out.println("身份認證異常: " + e.getMessage());
e.printStackTrace();
}
try {
fs = FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
}
public static FileSystem getFs() {
return fs;
}
}
其實整個程式碼中間的驗證全部不用看,主要就是我用static程式碼塊將驗證的邏輯包圍起來,然後fs這個物件就只會生成一次了,每次呼叫getFs()方法獲得的都是同一個fs物件 。
相關文章
- 全域性獲取HttpContextHTTPContext
- 控制程式碼表篇——全域性控制程式碼表
- [Java物件導向]static方法Java物件
- [JAVA] 只知物件屬性,不知類屬性?就算類答應,static都不答應Java物件
- .NET Core如何全域性獲取使用者資訊?
- java lambda list集合中物件某屬性重複,只取第一個物件Java物件
- git只拉取github部分程式碼的方法Github
- static變數,static程式碼塊,建構函式,程式碼塊等的載入順序變數C程式函式
- PHP物件導向程式設計中獲取物件屬性的3種方法例項分析PHP物件程式設計
- static程式碼塊、構造程式碼塊、建構函式以及Java類初始化順序C程式函式Java
- SpringBoot static 靜態方法獲取 yml 配置檔案Spring Boot
- 關於Static程式碼塊、匿名程式碼塊、構造器的小擴充C程式
- 獲取 Class 物件的 3 種方法物件
- Java獲取Spring的各種物件JavaSpring物件
- QT 全域性變數使用方法QT變數
- Flask0.1原始碼(1)-五個全域性物件Flask原始碼物件
- 物件與引用,static關鍵字,程式碼塊,包,訪問許可權修飾符物件訪問許可權
- 物件獲取原型物件物件原型
- java 程式碼塊Java
- python如何只獲取日期Python
- vue2.0全域性路由守衛(全域性控制登入)Vue路由
- 一次性帶你弄懂java中的static關鍵字Java
- 物件屬性讀取(核心原始碼)物件原始碼
- 13、Node.js 全域性物件Node.js物件
- 核心物件&控制程式碼物件
- vue定義全域性變數和全域性方法Vue變數
- C#獲取某個物件的屬性值C#物件
- Java中獲取Class物件的三種方式Java物件
- android獲取控制元件的幾種方法Android控制元件
- Java - 26 程式碼塊Java
- lambda方法引用獲取欄位屬性
- wpf 捕獲全域性異常
- 獲取 NodeJS 程式退出碼NodeJS
- 為XHR物件所有方法和屬性提供鉤子 全域性攔截AJAX物件
- 微信小程式獲取使用者資訊方法微信小程式
- Java獲取Object中Value的方法JavaObject
- 記一次Android週期性控制程式碼洩漏的排查Android
- Java獲取Class物件的方式和例項化物件的方式Java物件