需求及背景1:在Web|Service中通常会配置自己的服务地址,加入某一个配置文件中配置了一个地址,那怎么读取这个地址。

例如:文件wsaddress.properites下的服务配置地址:address=http://127.0.0.1:8080/realware/services/AsspFinanceService,500000,2015

业务逻辑中需要得到地址:String address = WSClientHander.getDefaultAddress();

getDefaultAddress()实现:

private static String getDefaultAddress() {String str = null;if (str != null)return DEFAULT_ADDRESS;InputStream in = null;Properties prop = new Properties();try {in = WSClientHander.class.getResourceAsStream("/wsaddress.properites");prop.load(in);} catch (Exception e) {throw new RuntimeException(WSClientHander.PBCS035, e);} finally {if (in != null)try {in.close();} catch (IOException e) {throw new RuntimeException(WSClientHander.PBCS036, e);}}str = prop.getProperty("address");String[] array = str.split(",");DEFAULT_ADDRESS = array[0];admDivCode = array[1];stYear = Integer.parseInt(array[2]);if (null == DEFAULT_ADDRESS || DEFAULT_ADDRESS.length() == 0)throw new RuntimeException(WSClientHander.PBCS031);return DEFAULT_ADDRESS;}

需求及背景2:配置文件里面有相当多的配置,各种类型的,那么怎么去取配置参数值。

配置文件evoucher.conf

#####################################################################################################
# evoucher.switch  电子凭证库开关
# '0'关闭,'1'打开
#####################################################################################################
#签名服务开关,非调试不可关闭
evoucher.switch.SignService=1
#消息中间件开关,非调试不可关闭
evoucher.switch.MessageService=1
#印章服务器开关,非调试不可关闭
evoucher.switch.EStampService=1
#资金凭证双证书校验开关
#发送资金凭证时,需检验是否包含两个不同签名、签章证书
evoucher.switch.EStampFund=0
#接收验证开关
#接收外部凭证时,检验凭证对应的签名、签章
evoucher.switch.ReceiveVerfy=1
#回调接口开关
#打开此接口回调自动任务将启动,若业务系统未开发回调接口,开关应关闭
evoucher.switch.CallBackFuction=1
#业务报文检查开关
#检查凭证原文字段与模板配置的字段是否一致以及字段值是否合法,联调开启,上线应关闭
evoucher.switch.VoucherFieldCheck=0
#OCX是否弹出错误提示框
evoucher.switch.ErrMsgModeFlag=0
#绿色通道同步发送消息开关
#打开开关会接收同步发送的数据,并向业务系统请求数据,若业务系统没有此需求或未提供请求服务,开关应关闭
evoucher.switch.requestData=1
#绿色通道异步发送消息开关
#打开开关会接收异步发送的数据,若业务系统没有此需求,开关应关闭
evoucher.switch.sendData=1
#打开开关 当有异步数据发送过来时会向业务系统通知数据,若业务系统没有此需求或未提供通知服务,开关应关闭
evoucher.switch.sendData.CallBackFuncton=1#####################################################################################################
#  evoucher.database 数据库配置
#####################################################################################################
# 'ORACLE'ORACLE数据库;'POSTGRES'postgreSql数据库;'DB2'DB2数据库;'SYBASE'sybase数据库
evoucher.model.DataBaseService=ORACLE
#设置数据库用户名
evoucher.database.user=ww
#设置数据库密码
evoucher.database.password=ww
#设置数据库ip
evoucher.database.ip=192.168.1.241
#设置数据库端口
evoucher.database.port=1521
#数据库实例名oracle是实例名、postgres是数据库名、sybase是数据库名
evoucher.database.databasename=orcl#####################################################################################################
# evoucher.service.sign  签名服务配置
######################################################################################################
# 'ZK'中科签名服务;'JD'吉大签名服务;'GEER'格尔签名服务;'JNKY'江南科友签名服务
evoucher.model.SignService=JD
#——————————————————————————————————————————————————
# evoucher.service.sign.zk  中科签名服务配置
#——————————————————————————————————————————————————
#中科签名服务地址
evoucher.service.sign.zk.ip=192.168.1.250
#中科签名服务端口号
evoucher.service.sign.zk.port=8017
#中科签名证书
evoucher.service.sign.zk.signCertId=04
#中科数字信封加密证书
evoucher.service.sign.zk.envelopCertId=500000|011:05+500000|001:05+500000|102:05
#——————————————————————————————————————————————————
# evoucher.service.sign.jd  吉大签名服务配置
#——————————————————————————————————————————————————
#吉大签名服务地址,格式:http://地址:端口号/signserver/service/xml
ServerURL=http://192.168.1.250:8000/signserver/service/xml
#数字信封加密证书 #格式:行政区划|机构类型:证书ID
AppID=500000|011:koal_env+500000|001:koal_env+500000|102:koal_env
#吉大签名服务器必须设置对应的签名证书
SignCertID=500000:04+500000:koal_sign+500000:01010001
#以下参数为吉大签名服务器默认配置,不可修改
#以下参数为吉大签名服务器默认配置,不可修改
DigestAlg=SHA1
#des3/scb2
EncAlg=scb2
CertBaseInfo = version;issuerdn;subjectdn
CertExtendInfo =
CertAlias =
BaseInfo =digestalg;plaindata
SendMsgFormat=0
HashActionPosition=0
PrintLog=false
Compatible=true
#——————————————————————————————————————————————————
# evoucher.service.sign.geer  格尔签名服务配置
#——————————————————————————————————————————————————
#格尔签名服务地址
estamp.sign.geEr.ip=192.168.1.249
#格尔签名服务端口
estamp.sign.geEr.port=6000
#格尔签名服务超时时间
estamp.sign.geEr.timeOut=10000
#格尔签名服务证书
estamp.sign.geEr.certDN=koal_sign
#格尔数字信封加密证书 #格式:行政区划|机构类型:证书ID
geErAppID=500000|MOF:koal_env+500000|PBC:koal_env+500000|102:koal_env
#——————————————————————————————————————————————————
# evoucher.service.sign.jnky  江南科友签名 服务配置
#——————————————————————————————————————————————————
#江南科友签名服务地址
estamp.sign.jnky.ipAddr=192.168.1.135
#江南科友签名服务端口
estamp.sign.jnky.port=20102
#江南科友签名服务证书
estamp.sign.jnky.certDN=01010001
#江南科友数字信封加密证书
estamp.sign.jnky.jnkyAppID=500000|MOF:01010002+500000|PBC:01010002+500000|102:01010002#####################################################################################################
# evoucher.service.msg  消息中间件服务配置
######################################################################################################
# 'MQ'MQ消息中间件;'TLQ'TLQ消息中间件
evoucher.model.MessageService=MQ
#——————————————————————————————————————————————————
# evoucher.service.msg.mq  MQ消息中间件服务配置
#——————————————————————————————————————————————————
#MQ服务地址
evoucher.service.msg.mq.HostName=127.0.0.1
#MQ监听端口号
evoucher.service.msg.mq.Port=6001
#MQ队列管理器名称
evoucher.service.msg.mq.QMgr=wfc1
#MQ服务器连接通道名称
evoucher.service.msg.mq.Channel=service
#MQ字符集
#一般Unix、Linux平台中MQ默认的字符集为819,而Windows平台为1381
evoucher.service.msg.mq.CCSID=1381#——————————————————————————————————————————————————
# evoucher.service.msg.tlq  TLQ消息中间件服务配置
#——————————————————————————————————————————————————
#TLQ服务地址
evoucher.service.msg.tlq.HostName=192.168.1.38
#TLQ的JMS代理端口号
evoucher.service.msg.tlq.JMSPort=10024#####################################################################################################
# evoucher.service.estamp  印章服务配置
######################################################################################################
# 'ZK'中科印章服务;'JD'吉大电子印章服务
evoucher.model.EStampService=ZK
#——————————————————————————————————————————————————
# evoucher.service.estamp.zk  中科印章服务配置
#——————————————————————————————————————————————————
#中科印章服务地址及端口,格式:http://地址:端口号/realware/services/AsspEStampService
evoucher.service.estamp.zk.address=http://192.168.1.42:8001/realware/services/AsspEStampService
#——————————————————————————————————————————————————
# evoucher.service.estamp.jd  吉大印章服务配置
#——————————————————————————————————————————————————
#吉大印章服务地址及端口,格式:http://地址:端口号
evoucher.service.estamp.jd.address=http://192.168.1.250:8000#####################################################################################################
# evoucher.service.business.system  业务系统服务配置
#####################################################################################################
#—————————————————————————————————————————————————————————————————————————
# evoucher.service.callback  回调业务系统服务地址及端口(voucherArrivedNotify)
#—————————————————————————————————————————————————————————————————————————
#格式:区划1&凭证类型1$凭证类型2&服务地址2||区划2&凭证类型1$凭证类型2&服务地址2
#不设置凭证类型表示此区划全部凭证类型均对应此地址,如:区划2&&服务地址1|区划2&&服务地址2 表示此区划的全部凭证类型
#服务地址格式:http://地址:端口号/realware/service
#evoucher.service.callback.address=500000&&http://192.168.1.179:8090/realware_callback/services/TestService
evoucher.service.callback.address=500000&1102&http://127.0.0.1:8090/realwareCallback_signTest/services/TestService#—————————————————————————————————————————————————————————————————————————
# evoucher.service.requestData  数据请求、通知服务地址及端口
#—————————————————————————————————————————————————————————————————————————
#服务地址格式:区划1&http://地址1:端口号1/realware/service1+区划2&http://地址2:端口号2/realware/service2
evoucher.service.requestData.address=500000&http://192.168.1.200:8080/realware_callback/services/TestService####################################################################################################
# evoucher.properties  凭证库运行参数配置
####################################################################################################
#自动解析线程间歇时间
#既待解析的接收凭证为空时下一次轮询等待时间,参数值为整型,精确到毫秒级
evoucher.model.ParsePause=5000
#凭证到达通知线程数(回调接口)
evoucher.service.callback.thread.count=20
#接收凭证消息线程数 ,默认5个
evoucher.download.thread.count=5
#数据请求超时时间配置(单位:毫秒)(开发编写,其他人员不建议修改)
evoucher.requestData.receiveTimeout=240000
#数据请求消息失效时间 (单位:毫秒)(开发编写,其他人员不建议修改)
evoucher.requestData.timeToLive=40000
#接收数据消息线程数(绿色通道异步数据发送)
evoucher.sendData.onMessage.concurrentConsumers=1
#原文被篡改错误编码配置(开发编写,其他人员不建议修改)
evoucher.verfiySignStamp.code=50041,10702005,100100

怎么从配置文件中获取需要的配置

1)导入配置文件获得配置文件的实例evoucherConfPro  2)通过HashMap存储好我们需要的配置的Key,写死的,我们只需要些配置  3)通过getEVConfValue获得需要的配置

public class PropertiesHander {private static final Logger logger = Logger.getLogger(PropertiesHander.class);private static HashMap<String, String> File_MAPPINGS = new HashMap<String, String>();private static final Properties evoucherConfPro = PropertiesHander.getProByCustomPath("/", BIZConstant.FILE_NAME_EVOUCHER_CONF);static {// 注册类字段与配置字段的映射关系File_MAPPINGS.put("M_SIGN_SERVICE", "evoucher.model.SignService");File_MAPPINGS.put("M_MESSAGE_SERVICE", "evoucher.model.MessageService");File_MAPPINGS.put("M_ESTAMP_SERVICE", "evoucher.model.EStampService");File_MAPPINGS.put("M_DATABASE_SERVICE","evoucher.model.DataBaseService");File_MAPPINGS.put("M_PARSE_PAUSE", "evoucher.model.ParsePause");File_MAPPINGS.put("M_CALL_BACK_PARAMETER","evoucher.service.callback.address");File_MAPPINGS.put("M_REQUEST_NOTIFY", "evoucher.service.requestData.address"); File_MAPPINGS.put("M_CALL_BACK_THREAD_COUNT", "evoucher.service.callback.thread.count");File_MAPPINGS.put("S_SIGN_SERVICE", "evoucher.switch.SignService");File_MAPPINGS.put("S_MESSAGE_SERVICE", "evoucher.switch.MessageService");File_MAPPINGS.put("S_ESTAMP_SERVICE", "evoucher.switch.EStampService");File_MAPPINGS.put("S_ESTAMP_ALLSIGN", "evoucher.switch.EStampAllSign");File_MAPPINGS.put("S_ESTAMP_FUND", "evoucher.switch.EStampFund");File_MAPPINGS.put("S_RECEIVE_VIERFY", "evoucher.switch.ReceiveVerfy");File_MAPPINGS.put("S_READ_IS_RETURN", "evoucher.switch.IsReturn");File_MAPPINGS.put("S_CHECK_IS", "evoucher.switch.VoucherFieldCheck");File_MAPPINGS.put("S_CALL_BACK_FUNCTION","evoucher.switch.CallBackFuction");File_MAPPINGS.put("S_ERROR_MSG_MODEL_FLAG", "evoucher.switch.ErrMsgModeFlag");File_MAPPINGS.put("S_RECEIVE_MSG_REQUESTDATA_FLAG", "evoucher.switch.requestData");File_MAPPINGS.put("S_RECEIVE_MSG_SENDDATA_FLAG", "evoucher.switch.sendData");File_MAPPINGS.put("S_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG", "evoucher.switch.sendData.CallBackFuncton");/** 凭证库服务版本号 */File_MAPPINGS.put("EVOUCHER_SERVICE_VERSION", "evoucher.service.version");//原文篡改编码File_MAPPINGS.put("M_EVOUCHER_VERFIY_SIGN_CODE", "evoucher.verfiySignStamp.code");}public static String getEVConfValue(String key) {if(File_MAPPINGS.containsKey(key))key=File_MAPPINGS.get(key);return evoucherConfPro.getProperty(key);}/*** 获取自定义包路径的配置文件* * @param customPath*            自定义路径* @param fileName*            文件名* @return*/public static Properties getProByCustomPath(String customPath,String fileName) {InputStream in = null;Properties prop = new Properties();try {in = PropertiesHander.class.getResourceAsStream(customPath+ fileName);prop.load(in);} catch (Exception e) {throw new EVoucherException(ExceptionConstant.EVS601 + "获取文件["+ fileName + "]失败", e);} finally {if (in != null)try {in.close();} catch (IOException e) {logger.warn("关闭流失败", e);}}return prop;}}

第三种情况:对于一些配置文件可以直接放在代码里面,例如:Boolean型的【可以作为开关】,设置其变量状态,然后初始化,在业务逻辑代码中去取【这样就实现了配置的作用】如下:

public class ControlParamsHandler {/** 签名服务器开关-:[true]打开 [false]关闭 */private  static boolean S_SIGN_SERVICE = false;/** 签名服务器---:[JD]吉大[ZK]中科 */private static String M_SIGN_SERVICE = null;/** 消息中间件开关-:[true]打开 [false]关闭 */private static boolean S_MESSAGE_SERVICE = false;/** 消息中间件服务-:[TLQ] TLQ [MQ]MQ MQ */private static String M_MESSAGE_SERVICE = null;/** 印章服务器开关-:[true]打开 [false]关闭 */private static boolean S_ESTAMP_SERVICE = false;/** 印章服务器-:[ZK]中科[JD]吉大 */private static String M_ESTAMP_SERVICE = null;/** 自动解析线程间歇时间 既待解析的接收凭证为空时下一次轮询等待时间:int型毫秒级 */private static int M_PARSE_PAUSE = 0;/** 资金凭证发送校验开关:[OPEN]打开 [CLOSE]关闭   发送时需有两岗不同证书的签章 */private static boolean S_ESTAMP_FUND = false;/** 接收凭证时验章、验签开关:[OPEN]打开 [CLOSE]关闭*/private static boolean S_RECEIVE_VIERFY = false;/**业务报文xml校验开关:[OPEN]打开 [CLOSE]关闭*/private static boolean S_CHECK_IS = false;/** 数据库选择-:[ORACLE] oracle [POSTGRES] postgreSql */private static String M_DATABASE_SERVICE = null;/** 回调接口是否启用开关:[OPEN]打开 [CLOSE]关闭  */private static boolean S_CALL_BACK_FUNCTION = false;/** 区划1&凭证类型1$凭证类型2&服务地址2||区划2&凭证类型1$凭证类型2&服务地址2 <p>区划2&&服务地址1||区划2&&服务地址2 表示此区划的全部凭证类型  */private static String M_CALL_BACK_PARAMETER = null;/** #OCX是否弹出错误提示框 */private static boolean S_ERROR_MSG_MODEL_FLAG = false;/** #绿色通道同步发送消息开关 */private static boolean S_RECEIVE_MSG_REQUESTDATA_FLAG = false;/** #绿色通道异步发送消息开关 */private static boolean S_RECEIVE_MSG_SENDDATA_FLAG = false;/** #绿色通道异步消息通知开关 */private static boolean S_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG = false;/** 数据请求、通知服务地址及端口 */private static String M_REQUEST_NOTIFY = null;/** 凭证到达通知线程数  */private static int M_CALL_BACK_THREAD_COUNT = 1;/** 原文被篡改错误编码配置 */private static String M_EVOUCHER_VERFIY_SIGN_CODE = null;static {initParameters();CacheRegister.registerCache();}public static void initParameters() {final Logger logger = Logger.getLogger(ControlParamsHandler.class);// 初始化控制参数String fieldName = null;// 字段名Object fieldValue = null;// 字段值try {Field[] fields = ControlParamsHandler.class.getDeclaredFields();int a = 1;for (Field field : fields) {fieldName = field.getName();fieldValue = PropertiesHander.getEVConfValue(fieldName);if (fieldName == null || (fieldName.indexOf("S_") == -1&& fieldName.indexOf("M_") == -1))continue;// 取出空格fieldValue = fieldValue == null ? null : fieldValue.toString().trim();if (StringUtils.isEmpty((String) fieldValue)) {logger.error(ExceptionConstant.EVS001 + ",参数[" + fieldName+ "]为空");throw new EVoucherException(ExceptionConstant.EVS001+ ",参数[" + fieldName + "]为空");}// 打印控制参数logger.info("控制参数(" + a + ")[" + fieldName + "]:[" + fieldValue+ "]");// 处理int类型if (field.getType() == int.class) {fieldValue = Integer.parseInt((String) fieldValue);}// 处理boolean类型if (field.getType() == boolean.class) {if (BIZConstant.EV_CONF_SWITCH_OPEN.equals(fieldValue)) {fieldValue = true;} else {fieldValue = false;}}// 赋值field.set(ControlParamsHandler.class, fieldValue);a++;}} catch (EVoucherException ex) {logger.error(ex);throw ex;} catch (Exception ex) {logger.error(ExceptionConstant.EVS001 + ",参数[" + fieldName + "]异常",ex);throw new EVoucherException(ExceptionConstant.EVS001 + ",参数["+ fieldName + "]异常", ex);}// 打印第三方服务器状态ServiceTestManager.print3rdPartyService();}public static boolean isS_RECEIVE_VIERFY() {return S_RECEIVE_VIERFY;}public static void setS_RECEIVE_VIERFY(boolean s_receive_vierfy) {S_RECEIVE_VIERFY = s_receive_vierfy;}public static boolean isS_SIGN_SERVICE() {return S_SIGN_SERVICE;}public static String getM_SIGN_SERVICE() {return M_SIGN_SERVICE;}public static boolean isS_MESSAGE_SERVICE() {return S_MESSAGE_SERVICE;}public static String getM_MESSAGE_SERVICE() {return M_MESSAGE_SERVICE;}public static boolean isS_ESTAMP_SERVICE() {return S_ESTAMP_SERVICE;}public static String getM_ESTAMP_SERVICE() {return M_ESTAMP_SERVICE;}public static int getM_PARSE_PAUSE() {return M_PARSE_PAUSE;}public static boolean isS_ESTAMP_FUND() {return S_ESTAMP_FUND;}public static String getM_DATABASE_SERVICE() {return M_DATABASE_SERVICE;}public static void setM_DATABASE_SERVICE(String mDATABASESERVICE) {M_DATABASE_SERVICE = mDATABASESERVICE;}public static boolean isS_CALL_BACK_FUNCTION() {return S_CALL_BACK_FUNCTION;}public static void setS_CALL_BACK_FUNCTION(boolean sCALLBACKFUNCTION) {S_CALL_BACK_FUNCTION = sCALLBACKFUNCTION;}public static String getM_CALL_BACK_PARAMETER() {return M_CALL_BACK_PARAMETER;}public static void setM_CALL_BACK_PARAMETER(String mCALLBACKPARAMETER) {M_CALL_BACK_PARAMETER = mCALLBACKPARAMETER;}public static boolean isS_CHECK_IS() {return S_CHECK_IS;}public static void setS_CHECK_IS(boolean sCHECKIS) {S_CHECK_IS = sCHECKIS;}public static boolean isS_ERROR_MSG_MODEL_FLAG() {return S_ERROR_MSG_MODEL_FLAG;}public static void setS_ERROR_MSG_MODEL_FLAG(boolean sERRORMSGMODELFLAG) {S_ERROR_MSG_MODEL_FLAG = sERRORMSGMODELFLAG;}public static boolean isS_RECEIVE_MSG_REQUESTDATA_FLAG() {return S_RECEIVE_MSG_REQUESTDATA_FLAG;}public static void setS_RECEIVE_MSG_REQUESTDATA_FLAG(boolean sRECEIVEMSGREQUESTDATAFLAG) {S_RECEIVE_MSG_REQUESTDATA_FLAG = sRECEIVEMSGREQUESTDATAFLAG;}public static boolean isS_RECEIVE_MSG_SENDDATA_FLAG() {return S_RECEIVE_MSG_SENDDATA_FLAG;}public static void setS_RECEIVE_MSG_SENDDATA_FLAG(boolean sRECEIVEMSGSENDDATAFLAG) {S_RECEIVE_MSG_SENDDATA_FLAG = sRECEIVEMSGSENDDATAFLAG;}public static String getM_REQUEST_NOTIFY() {return M_REQUEST_NOTIFY;}public static int getM_CALL_BACK_THREAD_COUNT() {return M_CALL_BACK_THREAD_COUNT;}public static void setM_CALL_BACK_THREAD_COUNT(int mCALLBACKTHREADCOUNT) {M_CALL_BACK_THREAD_COUNT = mCALLBACKTHREADCOUNT;}public static String getM_EVOUCHER_VERFIY_SIGN_CODE() {return M_EVOUCHER_VERFIY_SIGN_CODE;}public static void setM_EVOUCHER_VERFIY_SIGN_CODE(String mEVOUCHERVERFIYSIGNCODE) {M_EVOUCHER_VERFIY_SIGN_CODE = mEVOUCHERVERFIYSIGNCODE;}public static boolean isS_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG() {return S_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG;}public static void setS_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG(boolean sRECEIVEMSGSENDDATACALLBACKFLAG) {S_RECEIVE_MSG_SENDDATA_CALLBACK_FLAG = sRECEIVEMSGSENDDATACALLBACKFLAG;}}

Java配置文件的使用、加载相关推荐

  1. java加载并运行虚拟机_《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?...

    Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...

  2. java打印已经被加载的类_使用URLClassLoader加载类,不会报错,但被加载类中的内容也没有打印出来...

    被加载类和加载类的程序在一个文件夹下: 运行没有任何结果: D:java_exercise>javac URLTest.java D:java_exercise>java URLTest ...

  3. Java 单例模式:懒加载(延迟加载)和即时加载

    Java 单例模式:懒加载(延迟加载)和即时加载 引言 在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制(或懒加载.延时加载),也就是说只有当使用到这个实例的时候才会创 ...

  4. Java反射-静态/动态加载类

    title: Java反射-静态/动态加载类 date: 2019-05-28 18:50:00Java反射-静态/动态加载类 Class 类是对象,是java.lang.Class类的实例对象.任何 ...

  5. java 线程加载类_怎么判断java当前线程是否加载了一个类的字节码

    展开全部 原生的ClassLoader是有e68a843231313335323631343130323136353331333337616631一个方法判断类是否已经加载的/** * Returns ...

  6. 使用java concurrent处理异步加载图片功能

    转载:http://marshal.easymorse.com/archives/3081 java5开始,增加了concurrent api,用于并发处理.比如起多个线程并发从网络上下载图片,然后在 ...

  7. 【java】ClassLoader.getResources加载资源的顺序

    目录 前言 代码说明 目录结构 FromMultiJar/pom.xml 代码 编译后目录结构 启动命令 ClassLoader.getResources加载资源的顺序 先在本应用(FromMulti ...

  8. Java运行时动态加载类之ClassLoader加载class及其依赖jar包

    需求场景是:通过ClassLoader动态加载外部class文件,class文件又依赖某个具体jar包,需要动态加载jar包,采用URLClassLoader. 1.xml配置文件 <?xml ...

  9. springboot根据环境装配配置文件、启动加载外置配置文件

    目录 一.profile功能 1.简介 2.application-profile功能 3.profile条件装配 4.profile分组 二.外部化配置 1.官方文档 2.获取系统的环境变量.属性( ...

  10. Lumen配置文件按需加载出现的坑

    问题描述 公司一个高并发API需要从Laravel移植到Lumen,由于数据库配置信息是通过远程或者缓存读取后动态配置,所以在中间件时使用到了 Config::set 然而实际运行时发现数据库配置并没 ...

最新文章

  1. python多进程原理_python多进程的详细介绍(附示例)
  2. 【深度学习】网络中隐含层神经元节点的个数(需要学习的特征数目)
  3. java form表单传参_表单Form传参数
  4. ❤JavaScript系列6部曲:语法篇(万字长文)❤
  5. 【2019.09.15】2019icpc上海网络赛
  6. C++开发环境如何设置呢?
  7. Windows Server AD修改还原模式密码
  8. idea面板右下角的切换分支找不到
  9. pyppeteer-比 selenium 更高效的爬虫利器
  10. 这位BAT大佬写的Leetcode刷题笔记,让我offer拿到手软
  11. Unity的URP项目开启
  12. 证件照更换背景 裁剪尺寸 智能图片放大 照片 证件照大师
  13. 易班应用开发教程php,易班 开发 java开发入门教程
  14. [工具使用]黑暗引擎FOFA
  15. 啊哈添柴挑战Java1080. 请告诉我谁小?
  16. 微信小程序:小程序开发中申请优惠券步骤
  17. 2018天池比赛首战落幕
  18. 1637_fgets函数的功能
  19. 《途客圈创业记:不疯魔,不成活》一一2.12 Nanfang离职
  20. matlab 包含nan的行,matlab中去除含有NaN的行或者列

热门文章

  1. Uniapp 与原生android的交互 和简单配置
  2. 起名~Java程序源码。
  3. iOS-OC-widget使用教程
  4. 计算机网络什么是互联网什么是网速,电脑网速变慢是什么原因?如何提高网速?...
  5. 自制Jlink_OB(STM32c8t6)
  6. 主机,开发板,虚拟机三者之间相互ping通
  7. DM spoke-to-spoke
  8. 立创商城 元件封装,ALtium 3D图
  9. 软件外包刮起并购风 资本做大航空母舰
  10. U盘插入电脑后有图标但读不出来