All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.beetl.sql.solon.integration.XPluginImp Maven / Gradle / Ivy

There is a newer version: 3.30.14-RELEASE
Show newest version
package org.beetl.sql.solon.integration;

import org.beetl.sql.core.SQLManager;
import org.beetl.sql.solon.DbManager;
import org.beetl.sql.solon.annotation.Db;

import org.noear.solon.Utils;
import org.noear.solon.core.*;

import javax.sql.DataSource;

/**
 * Solon 插件接口实现,完成对接与注入支持
 *
 * @author noear
 * @since 2020-09-01
 * */
public class XPluginImp implements Plugin {
    @Override
    public void start(AppContext context) {
        //监听事件
        context.subWrapsOfType(DataSource.class, bw->{
            DbManager.reg(bw);
        });


        //for new
        context.beanBuilderAdd(Db.class, (clz, wrap, anno) -> {
            builderAddDo(clz, wrap, anno.value());
        });

        context.beanInjectorAdd(Db.class, (varH, anno) -> {
            injectorAddDo(varH, anno.value());
        });


        //初始化管理器(主要为了生成动态管理器)
        //
        context.lifecycle(-99, () -> {
            BeanWrap defBw = context.getWrap(DataSource.class);

            if (defBw != null) {
                DbManager.dynamicBuild(defBw);

                if (DbManager.dynamicGet() != null) {
                    context.wrapAndPut(SQLManager.class, DbManager.dynamicGet());
                }
            }
        });
    }

    private void builderAddDo(Class clz, BeanWrap wrap, String annoValue) {
        if (clz.isInterface() == false) {
            return;
        }

        if (Utils.isEmpty(annoValue)) {
            wrap.context().getWrapAsync(DataSource.class, (dsBw) -> {
                create0(clz, dsBw);
            });
        } else {
            wrap.context().getWrapAsync(annoValue, (dsBw) -> {
                if (dsBw.raw() instanceof DataSource) {
                    create0(clz, dsBw);
                }
            });
        }
    }

    private void injectorAddDo(VarHolder varH, String annoValue) {
        if (Utils.isEmpty(annoValue)) {
            varH.context().getWrapAsync(DataSource.class, (dsBw) -> {
                inject0(varH, dsBw, annoValue);
            });
        } else {
            varH.context().getWrapAsync(annoValue, (dsBw) -> {
                if (dsBw.raw() instanceof DataSource) {
                    inject0(varH, dsBw, annoValue);
                }
            });
        }
    }

    private void create0(Class clz, BeanWrap dsBw) {
        Object raw = DbManager.get(dsBw).getMapper(clz);

        if (raw != null) {
            dsBw.context().wrapAndPut(clz, raw);
        }
    }

    /**
     * 字段注入
     */
    private void inject0(VarHolder varH, BeanWrap dsBw, String annoValue) {
        SQLManager tmp = DbManager.get(dsBw);

        if (varH.getType().isInterface()) {
            Object mapper = tmp.getMapper(varH.getType());

            varH.setValue(mapper);
            return;
        }

        if (SQLManager.class.isAssignableFrom(varH.getType())) {
            if (Utils.isNotEmpty(annoValue)) {
                varH.setValue(tmp);
            } else {
                dsBw.context().getBeanAsync(SQLManager.class, (bean) -> {
                    varH.setValue(bean);
                });
            }
            return;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy