0013.HTTPSClient

0013.HTTPSClient,第1张

主要问题在于如何跳过证明书。

父类:>

import javautilProperties;

public class PropertiesUtil {

    private static Properties init = null;

    private static Properties util = null;

    private static Properties chid = null;

    

    private synchronized static Properties getInit(){

        if(init == null){

            try{

                init = new Properties();

                initload(PropertiesUtilclassgetClassLoader()getResourceAsStream("initproperties"));

            }catch(Exception e){

                eprintStackTrace();

            }

        }

        return init;

    }

    

    private synchronized static Properties getUtil(){

        if(util == null){

            try{

                util = new Properties();

                utilload(PropertiesUtilclassgetClassLoader()getResourceAsStream("utilproperties"));

            }catch(Exception e){

                eprintStackTrace();

            }

        }

        return util;

    }

    

    private synchronized static Properties getChid(){

        if(chid == null){

            try{

                chid = new Properties();

                chidload(PropertiesUtilclassgetClassLoader()getResourceAsStream("chidproperties"));

            }catch(Exception e){

                eprintStackTrace();

            }

        }

        return chid;

    }

    

    /

      获取属性配置文件参数

      @param key 参数名称

      @param def 参数默认值

      @return 参数值

     /

    public static String get(String key, String def){

        String val = getInit()getProperty(key);

        if(val == null || vallength() == 0){

            return def;

        }

        return val;

    }

    public static long getlong(String key,long def)

    {

        try{

            def = LongparseLong(getInit()getProperty(key));

        }catch(Exception e){

            eprintStackTrace();

            return def;

        }

        return def;

    }

    /

      获取属性配置文件参数值

      @param key 参数名称

      @param def 参数默认值

      @return 参数值

     /

    public static int get(String key, int def){

        try{

            def = IntegerparseInt(getInit()getProperty(key));

        }catch(Exception e){

            eprintStackTrace();

            return def;

        }

        return def;

    }

    

    public static long get(String key, long def){

        try {

            def = LongparseLong(getInit()getProperty(key));

        } catch (Exception e) {

            eprintStackTrace();

            return def;

        }

        return def;

    }

    

    /

      获取属性配置文件参数值

      @param key 参数名称

      @param def 参数默认值

      @return 参数值

     /

    public static String getUtil(String key, String def){

        String val = getUtil()getProperty(key);

        if(val == null || vallength() == 0){

            return def;

        }

        return val;

    }

    

    public static long getUtil(String key, long def){

        long val = LongparseLong(getUtil()getProperty(key));

        if(val == 0){

            return def;

        }

        return val;

    }

    /

      获取属性配置文件参数值

      @param key 参数名称

      @param def 参数默认值

      @return 参数值

     /

    public static String getChidProperty(String key,String def){

        String val = getChid()getProperty(key);

        if(val == null || vallength() == 0){

            return def;

        }

        return val;

    }import comjinlouutilPropertiesUtil;

public class Test {

    public static void main(String[] args) {

    //从配置文件中去key=test的value 如果配置文件中无此key则返回默认值

        String test = PropertiesUtilget("test","默认值");

       

        Systemoutprintln(test);

    }

    }

  之前看过大神的 美团组件化方案 ,其中提到了通过servicelaoder进行解耦的思路,主要是通过配置接口及其实现类的方式坐到接口隔离作用,本文主要是实现此思路并延伸出通过加载自定义properties文件获取参数配置信息

  通过查看ServiceLoader源码可知,ServiceLoader是通过加载META-INF/services/路径下的接口实现类,加载方式是通过读取配置文件并通过反射的方式获取类的实例

1配置文件读取,获取文件流

其中PREFIX = "META-INF/services/";

由此可见加载路径是META-INF文件夹下面的文件

2通过流获取实现类全路径

其中parseLine方法里面是做了类全路径名校验

思路:

  1读取配置文件

  2获取配置的类全名

  3通过反射获取类的实例

  我们的配置文件将写在assets文件夹下

  通过查看apk包结构可以发现assets文件夹位置是与META-INF平级的,由此我们可以将系统的ServiceLoader加载文件路径改为assets路径

1配置文件读取,获取文件流

2通过流获取接口类与实现类的对应集合

  由于接口类与实现类是一对一关系,所以通过Map以键值对的方式存储接口类与实现类,在系统ServiceLoader做简单修改:

3获取实现类

  在上一步已经获取了所有接口类和实现类的集合,在此通过接口类全名来获取实现类全名,并通过反射的方式获取实现类实例:

到此我们自定义ServiceLoader已经初步实现,在实际开发中,我们一般只需要一个实例及单利,在此我们可以用Map将类的实例与接口类名绑定起来即可。

使用

  加载properties配置参数的思路与ServiceLoader基本一致,只是获取配置参数可以通过java类Properties获取

1获取流

  和自定义ServiceLoader获取流一致

2获取Properties实例

3获取value

4使用

1在查看Iterable 接口时无意中发现了default关键字,经查看资料显示为java8新加的,用于在接口中写默认的方法函数体

有兴趣的可以去 >

猜了半天也没搞懂,我想确认一下

jar中的类无法读取是读不到值还是读到一个注入前的值,例如'${value}'

题主是否在开发WEB项目?能否确定jar文件中的类与项目中读取配置的类同由一个ClassLoader加载?

题主项目读取properties的方式是基于文件系统(比如用File)还是resource流(例如ClassgetResourceAsStream),我猜后者可能性较高(因为使用文件系统会在项目整体打包后造成麻烦),那么我问的第2条就比较重要了,可能会影响到一些问题。

读取配置的时机,按理说既然是配置文件了,应当在类加载时读取,但如果题主有手动控制这一过程,也请说一声

读取Properties文件六种方法

开发项目时,经常把一些参数存入Properties文件,以增加程序的灵活性。可以通过以下六种方法读取配置参数(注意:spring对properties的读取也有很好的集成):

1、使用javautilProperties类的load()方法 示例:

InputStream in = lnew BufferedInputStream(new FileInputStream(name));

Properties p = new Properties();

pload(in);

2、使用javautilResourceBundle类的getBundle()方法 示例:

ResourceBundle rb = ResourceBundlegetBundle(name, LocalegetDefault());

3、使用javautilPropertyResourceBundle类的构造函数 示例:

InputStream in = new BufferedInputStream(new FileInputStream(name));

ResourceBundle rb = new PropertyResourceBundle(in);

4、使用class变量的getResourceAsStream()方法 示例:

InputStream in = JPropertiesclassgetResourceAsStream(name);

Properties p = new Properties(); pload(in);

5、使用classgetClassLoader()所得到的javalangClassLoader的getResourceAsStream()方法 示例:

InputStream in = JPropertiesclassgetClassLoader()getResourceAsStream(name);

Properties p = new Properties(); pload(in);

6、使用javalangClassLoader类的getSystemResourceAsStream()静态方法

示例:

InputStream in = ClassLoadergetSystemResourceAsStream(name);

Properties p = new Properties(); pload(in);

补充

Servlet中可以使用javaxservletServletContext的

getResourceAsStream()方法 示例:

InputStream in = contextgetResourceAsStream(path);

Properties p = new Properties(); pload(in);

1修改bootstrapproperties文件,添加 springcloudconfigfail-fast=true

通过该参数可以避免当Config Server配置有误时,过多的等待前置加载时间,可以直接快速返回失败信息。

2编辑pomxml,新增spring-retry和spring-boot-starter-aop依赖。

修改bootstrapproperties文件,添加上述参数

我们可以看到进行了10次重试,前几次重试间隔按照我们配置的下次间隔乘数进行重试,直到时间大于了我们设置的最大间隔时间后都开始按照设置的最大间隔时间进行重试,直到重试次数达到了我们设置的最大重试次数,还是连接不上就返回错误信息。

mybatis自定义拦截器(一)基本使用

mybatis自定义拦截器(二)对象详解

1 不同拦截类型执行顺序:

2 多个插件拦截的顺序?

需要注意的是,因为拦截器Aa和拦截器Bb均是拦截的StatementHandler对象,所以拦截器B在此获取StatementHandler的时候,获取的是代理对象。

3 多个插件plugin()和intercept()方法的执行顺序

先执行每个插件的plugin方法,若是@Intercepts注解标明需要拦截该对象,那么生成类型对象的代理对象。(即使该插件需要拦截该类型对象,但是依旧会执行下一个插件的plugin方法)。知道执行完毕所有的plugin方法。在执行每个Intercept方法。

自定义拦截器必须使用mybatis提供的注解来声明我们要拦截的类型对象。

Mybatis插件都要有Intercepts [in特赛婆斯] 注解来指定要拦截哪个对象哪个方法。我们知道,Pluginwrap方法会返回四大接口对象的代理对象,会拦截所有的方法。在代理对象执行对应方法的时候,会调用InvocationHandler处理器的invoke方法。

具体规则如下:

如果我们的拦截器需要一些变量对象,而且这个对象是支持可配置的。

类似于Spring中的@Value("${}")从 applicationproperties 文件中获取。

使用方法:

方法中获取参数: propertiesgetProperty("username");

问题:但是为什么不直接使用@Value("${}") 获取变量?

解答:因为mybatis框架本身就是一个可以独立使用的框架,没有像Spring这种做了很多的依赖注入。

这个方法的作用是就是让mybatis判断,是否要进行拦截,然后做出决定是否生成一个代理。

需要注意的是:每经过一个拦截器对象都会调用插件的plugin方法,也就是说,该方法会调用4次。根据@Intercepts注解来决定是否进行拦截处理。

解答:判断是否拦截这个类型对象(根据@Intercepts注解决定),然后决定是返回一个代理对象还是返回原对象。

故我们在实现plugin方法时,要判断一下目标类型,是本插件要拦截的对象时才执行Pluginwrap方法,否则的话,直接返回目标本身。

我们知道,mybatis只能拦截四种类型的对象。而 intercept 方法便是处理拦截到的对象。比如我们要拦截 StatementHandler#query(Statement st,ResultHandler rh) 方法,那么 Invocation 就是这个对象, Invocation 中有三个参数。

orgapacheibatisreflectionSystemMetaObject#forObject :方便的获取对象中的值。

案例:将参数拼接到sql语句。

因为已经执行了ParameterHandler拦截器,故Statement对象已经是完全拼接好的SQL语句。

一个MappedStatement对象对应Mapper配置文件中的一个select/update/insert/delete节点,主要描述的是一条sql语句。其属性为:

>

以上就是关于0013.HTTPSClient全部的内容,包括:0013.HTTPSClient、springboot读取.properties配置文件中的map和list类型配置参数、java代码怎么获取properties文件的内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9810284.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)