继承多个Application

在和CP对接接入SDK的过程中,因为接入了其他第三方SDK继承了其他的Application而Java是单继承所以没办法继承要求的其他SDK的Application,我们可以用接口代理的方式间接实现继承多个Application

比如我们要继承XApplication和YApplication,以下步骤进行

1、创建一个代理接口

/**@author gufra
 * 代理接口
 * */
public interface ApplicationListener {
    void appOnCreate();
    void appAttachBaseContext(Context context);
    void appOnConfigurationChanged(Configuration configuration);
}

2、实现代理接口的类

/**
 * @author gufra
 * 实现代理接口
 * */
public class ApplicationImpl extends Application implements ApplicationListener {
    private String TAG = "gufra.ApplicationImpl";
   
    @Override
    public void appOnCreate() {
        Log.d(TAG, "onCreate");
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG, "attachBaseContext");
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG, "onConfigurationChanged");
    }
}

3、创建一个代理类

/**
 * @author gufra
 * 代理类
 * */
public class ProxyApplication extends Application {
    ApplicationListener applicationListener = null;
    @Override
    public void onCreate() {
        super.onCreate();
        if (applicationListener != null) {
            applicationListener.appOnCreate();
        }
    }

    @Override
    public void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        applicationListener = getApplicationListener();
        if (applicationListener != null){
            applicationListener.appAttachBaseContext(context);
        }

    }

    @Override
    public void onConfigurationChanged(Configuration configuration) {
        super.onConfigurationChanged(configuration);
        if (applicationListener != null) {
            applicationListener.appOnConfigurationChanged(configuration);
        }
    }
//通过反射来进行代理
    private ApplicationListener getApplicationListener(){
        Class clazz = null;
        try {
            clazz = Class.forName("com.gufra.Application.Listeners.Impls.ApplicationImpl");
            return (ApplicationListener) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;

    }
}

4、创建需要继承的Application的代理接口(如果还有其他需要继承的Application,按照以下新建)

/**
 * @author gufra
 * XApplication代理接口
 * */
public interface XApplicationListener {
    void appOnCreate();
    void appAttachBaseContext(Context context);
    void appOnConfigurationChanged(Configuration configuration);
}
/**
 * @author gufra
 * YApplication代理接口
 * */
public interface YApplicationListener {
    void appOnCreate();
    void appAttachBaseContext(Context context);
    void appOnConfigurationChanged(Configuration configuration);
}

5、实现各个代理接口

/**
 * @author gufra
 * 实现XApplication代理接口
 * */
public class XApplicationImpl extends Application implements XApplicationListener {
    String TAG ="gufra.XApplicationImpl";
    @Override
    public void appOnCreate() {
        Log.d(TAG,"X->onCreate");
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG,"X->attachBaseContext");
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG,"X->onConfigurationChanged");
    }
}
/**
 * @author gufra
 * 实现YApplication代理接口
 * */
public class YApplicationImpl extends Application implements YApplicationListener {
    String TAG = "gufra.YApplicationImpl";
    @Override
    public void appOnCreate() {
        Log.d(TAG,"Y->onCreate");
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG,"Y->attachBaseContext");
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG,"Y->onConfigurationChanged");
    }
}

6、在实现代理接口类里加上各个Application的代理接口进行调用


/**
 * @author gufra
 * 实现代理接口
 * */
public class ApplicationImpl extends Application implements ApplicationListener {
    private String TAG = "gufra.ApplicationImpl";
    XApplicationListener xApplicationListener = null;
    YApplicationListener yApplicationListener= null;

    @Override
    public void appOnCreate() {
        Log.d(TAG, "onCreate");
        if (xApplicationListener != null){
            xApplicationListener.appOnCreate();
        }
        if (yApplicationListener != null){
            yApplicationListener.appOnCreate();
        }
    }

    @Override
    public void appAttachBaseContext(Context context) {
        Log.d(TAG, "attachBaseContext");
        xApplicationListener = getXApplication();
        yApplicationListener = getYApplication();
        if (xApplicationListener != null){
            xApplicationListener.appAttachBaseContext(context);
        }
        if (yApplicationListener != null){
            yApplicationListener.appAttachBaseContext(context);
        }
    }

    @Override
    public void appOnConfigurationChanged(Configuration configuration) {
        Log.d(TAG, "onConfigurationChanged");
        if (xApplicationListener != null){
            xApplicationListener.appOnConfigurationChanged(configuration);
        }
        if (yApplicationListener != null){
            yApplicationListener.appOnConfigurationChanged(configuration);
        }
    }

    private XApplicationListener getXApplication() {
        Class clazz = null;
        try {
            clazz = Class.forName("com.gufra.Application.Listeners.Impls.XApplicationImpl");
            return (XApplicationListener) clazz.newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    private YApplicationListener getYApplication(){
        Class clazz = null;
        try {
            clazz = Class.forName("com.gufra.Application.Listeners.Impls.YApplicationImpl");
            return (YApplicationListener) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }
}

7、在MyApplication继承ProxyApplica并且在AndroidManifest.xml里声明即可

public class MyApplication extends ProxyApplication {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }
}

<!--Manifest-->
<application
        android:name="com.gufra.MyApplication"
<!--此处省略-->
/>

8、日志输出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在pigx中配置多个数据源,需要进行以下步骤: 1. 在application.yml文件中配置数据源信息,如下所示: ```yaml spring: datasource: dynamic: primary: db1 # 指定默认数据源 datasource: db1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC username: root password: root db2: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db2?useSSL=false&serverTimezone=UTC username: root password: root ``` 2. 在配置类中动态创建数据源,并将其加入到AbstractRoutingDataSource中,如下所示: ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.dynamic") public DataSource dataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource(); Map<Object, Object> dataSourceMap = new HashMap<>(); DataSource db1 = DataSourceBuilder.create().build(); DataSource db2 = DataSourceBuilder.create().build(); dataSourceMap.put("db1", db1); dataSourceMap.put("db2", db2); dynamicDataSource.setTargetDataSources(dataSourceMap); dynamicDataSource.setDefaultTargetDataSource(db1); return dynamicDataSource; } } ``` 3. 创建数据源路由类,继承AbstractRoutingDataSource,重写determineCurrentLookupKey()方法,用于动态获取数据源,如下所示: ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSourceKey(); } } ``` 4. 创建数据源上下文类,用于保存当前使用的数据源的key值,如下所示: ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSourceKey(String dataSourceKey) { contextHolder.set(dataSourceKey); } public static String getDataSourceKey() { return contextHolder.get(); } public static void clearDataSourceKey() { contextHolder.remove(); } } ``` 5. 在需要使用的地方,通过调用DataSourceContextHolder.setDataSourceKey()方法设置当前使用的数据源,如下所示: ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> getUserList() { DataSourceContextHolder.setDataSourceKey("db1"); return userMapper.getUserList(); } } ``` 以上就是在pigx中配置多个数据源的步骤,希望能够帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gufra_Yin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值