美文网首页
java 内部类应用之剥离配置到静态内部类让配置信息初始化不依赖

java 内部类应用之剥离配置到静态内部类让配置信息初始化不依赖

作者: 尹楷楷 | 来源:发表于2021-03-31 10:18 被阅读0次

现在有这么一种情况

A 类和B类都实现了接口C,接口C中有两个方法,方法1和方法2。A类实现了方法1和方法2,而B类只实现了方法1,B类的方法2没有实现,只能去调用A类的方法2,但是这样调用会报空指针,因为A类使用了@ConditionalOnExpression注解且配置文件中声明使用的实现是B类,故初始化类A所需必要配置信息没办法得到有效的初始化。

那么我们可以这样处理:

1、将方法2声明为static方法并从接口C中移除;
2、将初始化A类的配置信息放到A类的静态内部类当中,然后加上@Component注解将此类纳入到spring容器的管理,这样A类初始化所需的配置就可以得到初始化了!

1、接口C

public interface AiService {

    //人脸
    void facePost(String image, String name, String idNo);

}

2、A类

@Service("BaiduUtilsServiceImpl")
@ConditionalOnExpression("'${business.idCartOcr.choice}'.equalsIgnoreCase('BAIDU')")
public class BaiduUtilsServiceImpl implements AiService {

  void facePost(String image, String name, String idNo){
       //实现接口1
      //访问内部类Conifg中的属性
 
   }

   //接口2 实现 改为静态;
    public static IdCart ocrPost(String photoFront, String photoBack) {
    //访问内部类Conifg中的属性
    }




    /**
     * 内部类
     */
    @Component
    public static class Config {

        private static String accessToken;
        private static String thirdEndpoint;
        private static String thirdClientId;
        private static String thirdClientSecret;
        //接口URL
        private static String thirdEndpointIdCart;
        private static String thirdEndpointFace;

        @NacosValue(value = "${business.idCartOcr.baidu.thirdClientId}", autoRefreshed = true)
        public void setThirdClientId(String thirdClientId) {
            Config.thirdClientId = thirdClientId;
        }

        @NacosValue(value = "${business.idCartOcr.baidu.thirdClientSecret}", autoRefreshed = true)
        public void setThirdClientSecret(String thirdClientSecret) {
            Config.thirdClientSecret = thirdClientSecret;
        }

        @NacosValue(value = "${business.idCartOcr.baidu.thirdEndpoint}", autoRefreshed = true)
        public void setThirdEndpoint(String thirdEndpoint) {
            Config.thirdEndpoint = thirdEndpoint;

            Config.thirdEndpointIdCart = String
                .format("%s/rest/2.0/ocr/v1/idcard", thirdEndpoint);
            Config.thirdEndpointFace = String
                .format("%s/rest/2.0/face/v3/person/verify", thirdEndpoint);
        }
    }

}


3、B类

@Service("GdcaUtilsServiceImpl")
@ConditionalOnExpression("'${business.idCartOcr.choice}'.equalsIgnoreCase('GDCA')")
public class GdcaUtilsServiceImpl implements AiService {

    @Override
    public void facePost(String image, String name, String idNo) {
    //实现
  }
}

相关文章

  • java 内部类应用之剥离配置到静态内部类让配置信息初始化不依赖

    现在有这么一种情况 A 类和B类都实现了接口C,接口C中有两个方法,方法1和方法2。A类实现了方法1和方法2,而B...

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • Java 内部类

    内部类包括成员内部类、方法内部类、*静态内部类、匿名内部类*。 内部类的作用 由于内部类的实现和外部类没有关系,内...

  • Java内部类

    Java内部类,简单来说就是将一个类定义在另一个类或者方法里面,主要分为成员内部类,局部内部类,匿名内部类和静态内...

  • Java内部类使用

    内部类 在Java中内部类主要分为成员内部类(非静态内部类、静态内部类)、匿名内部类、局部内部类。 非静态态内部类...

  • java之内部类(InnerClass)详解

    参考文章 java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类

  • java内部类

    静态内部类: 静态内部类本身可以访问外部的静态资源,包括静态私有资源。但是不能访问非静态资源,可以不依赖外部类实例...

  • Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类静态内部类匿名类本地类 步骤 1 : 非静态内部类 非静态内部类 ...

  • 内部类

    内部类可以分为:非静态内部类;静态内部类;匿名内部类。 一、内部类 首先要说,Java为什么要使用内部类?java...

  • 类的编译期与运行期

    非静态内部类 非静态内部类到底可以有静态属性吗? static成员变量,或者static final常量 非静态内...

网友评论

      本文标题:java 内部类应用之剥离配置到静态内部类让配置信息初始化不依赖

      本文链接:https://www.haomeiwen.com/subject/lyrohltx.html