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物件 。
相關文章
- java static 與 static靜態程式碼塊Java
- 全域性獲取HttpContextHTTPContext
- javascript使用class獲取元素物件程式碼JavaScript物件
- 控制程式碼表篇——全域性控制程式碼表
- [JAVA] 只知物件屬性,不知類屬性?就算類答應,static都不答應Java物件
- [Java物件導向]static方法Java物件
- .NET Core如何全域性獲取使用者資訊?
- 使用互斥物件讓程式只執行一次 (轉)物件
- JavaScript使用name屬性值獲取元素物件JavaScript物件
- 使用WebBrowser控制元件獲取網頁原始碼的方法Web控制元件網頁原始碼
- java 獲取物件大小Java物件
- java lambda list集合中物件某屬性重複,只取第一個物件Java物件
- git只拉取github部分程式碼的方法Github
- static變數,static程式碼塊,建構函式,程式碼塊等的載入順序變數C程式函式
- 解決多個路由繫結同一個元件 獲取引數只獲取一次的方法路由元件
- node 全域性物件和全域性變數物件變數
- Js全域性物件JS物件
- PHP物件導向程式設計中獲取物件屬性的3種方法例項分析PHP物件程式設計
- static程式碼塊、構造程式碼塊、建構函式以及Java類初始化順序C程式函式Java
- js獲取事件源物件程式碼例項JS事件物件
- 使用cookie讓彈窗只出現一次程式碼Cookie
- 根據dom物件或其id獲取物件位置的程式碼物件
- 關於Static程式碼塊、匿名程式碼塊、構造器的小擴充C程式
- QT 全域性變數使用方法QT變數
- 獲取物件DDL語句的方法物件
- 獲取 Class 物件的 3 種方法物件
- SpringBoot static 靜態方法獲取 yml 配置檔案Spring Boot
- jQuery獲取選中核取方塊的值程式碼例項jQuery
- Flask0.1原始碼(1)-五個全域性物件Flask原始碼物件
- php,java獲取天氣預報程式碼PHPJava
- 微信小程式獲取使用者資訊方法微信小程式
- PHP通過lock控制程式只執行一次PHP
- 一次性帶你弄懂java中的static關鍵字Java
- vue2.0全域性路由守衛(全域性控制登入)Vue路由
- 物件獲取原型物件物件原型
- 物件與引用,static關鍵字,程式碼塊,包,訪問許可權修飾符物件訪問許可權
- js獲取checkbox核取方塊checked屬性值為true核取方塊JS
- java 程式碼塊Java