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

org.dromara.solonplugins.nutzdao.XPluginImp Maven / Gradle / Ivy

package org.dromara.solonplugins.nutzdao;

import javax.sql.DataSource;

import org.dromara.solonplugins.nutzdao.annotation.Db;
import org.dromara.solonplugins.nutzdao.integration.DbManager;
import org.noear.solon.Utils;
import org.noear.solon.core.AppContext;
import org.noear.solon.core.BeanWrap;
import org.noear.solon.core.Plugin;
import org.noear.solon.core.VarHolder;
import org.nutz.dao.Dao;
import org.nutz.dao.impl.NutDao;
import org.nutz.dao.impl.NutTxDao;




/**
 * Solon-nutz dao 插件入口 参考文档{@link http://nutzam.com/core/dao/hello.html}
 * 
 * @author: xls-web (小xu中年)
 */
public class XPluginImp implements Plugin {
	
	@Override
    public void start(AppContext context) throws Throwable {
		//监听事件
        context.subWrapsOfType(DataSource.class, bw->{
        	DbManager.reg(bw);
        });
        
        context.beanBuilderAdd(Db.class, (clz, wrap, anno) -> {
            builderAddDo(clz, wrap, anno.value());
        });

        context.beanInjectorAdd(Db.class, (varH, anno) -> {
            injectorAddDo(varH, anno.value());
        });
    }
	
	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 inject0(VarHolder varH, BeanWrap dsBw, String annoValue) {
        //如果是 ActiveRecordPlugin
        if (NutDao.class.isAssignableFrom(varH.getType())) {
            Dao dao = DbManager.get(dsBw);
            varH.setValue(dao);
            return;
        }
        //NutzTxDao
        if (NutTxDao.class.isAssignableFrom(varH.getType())) {
            Dao dao = DbManager.get(dsBw);
            NutTxDao ntd = new NutTxDao(dao);
            varH.setValue(ntd);
            return;
        }
    }
	
    private void create0(Class clz, BeanWrap dsBw) {
        Object raw = DbManager.get(dsBw);

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




© 2015 - 2024 Weber Informatics LLC | Privacy Policy