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);
}
}
}