最近有個專案場景,多垂類支援,大體業務流程相同,只是一些業務規則的校驗引數不同。解決思路是將業務引數作為類的屬性,然後建立垂類數量個例項,去處理不同垂類的業務。
下面分兩部分介紹:
1、動態建立bean的**實現
2、spring的ioc原始碼解讀,這部分放到另外一篇部落格[url]
4.0.6.release
【動態建立bean的**實現】
2、定義註解,以找到需要轉殖的beadefinition和需要賦值的屬性
3、從垂類模板中獲取需要動態建立的bean資訊,然後註冊beandefinition
private void registerbeandefinition(string templateid, serviceentity serviceentity) catch (classnotfoundexception e)
beandefinitionbuilder beandefinitionbuilder = beandefinitionbuilder.rootbeandefinition(classname);
beandefinitionbuilder.getbeandefinition().setattribute("id", beankey);
springfactory.registerbeandefinition(
beankey, beandefinitionbuilder.getbeandefinition());
logger.info("register bean definition successfully. beanname:{}, implname:{}",
generatetemplatebeanname(templateid, serviceentity.getservicename()), serviceentity.getimplname());
//step2: 為例項自動化注入屬性
object bean = springfactory.getbean(beankey, c);
injectparamvaules(bean, c, serviceentity);
}} catch (nosuchbeandefinitionexception ex) ", serviceentity.getimplname());
} catch (beandefinitionstoreexception ex) , implname:{}",
generatetemplatebeanname(templateid, serviceentity.getservicename()), serviceentity.getimplname());}}
private void injectparamvaules(object bean, classrequiredtype, serviceentity serviceentity) , value = {}", field.getname(), serviceentity.getbizparammap().get(field.getname()));
}} catch (illegalacces***ception e) ", e.getmessage());
e.printstacktrace();}}
}classsuperclass = getsuperclass(requiredtype);
if(superclass != null) ", serviceentity.getextendfields());
}} catch (illegalacces***ception e) ", e.getmessage());
e.printstacktrace();}}
}}}}
4、定義乙個context繼承abstractservicecontext,實現執行時根據策略,選取所需的業務例項進行處理
@service("demoservice")
public class demoservicecontext extends abstractservicecontext implements demoservice
}/**
* 服務上下文抽象類,負責具體服務實現類的策略選擇和擴充套件字段傳遞.
* user: mazhen01
* date: 2016/3/3
* time: 10:14
*/public abstract class abstractservicecontext .", poiid);
throw new templateexception("templateid is null, can not find templateid.");
}currenttemplatebeanname.set(templatebeanfactory.generatetemplatebeanname(templateid, servicename));
return templatebeanfactory.getbean(templatebeanfactory.generatetemplatebeanname(templateid, servicename), clazz);
}protected t getserviceimpl(listpoiids, classclazz) throws annotationexception, bean***ception
long poiid = poiids.get(0);
return getserviceimpl(poiid, clazz);
}/**
* 根據beanname,獲取服務例項
** @param templatebeanname beanname
* @param clazz 服務介面
* @param 例項型別
* @return
* @throws annotationexception
* @throws bean***ception
*/protected t getserviceimpl(string templatebeanname, classclazz) throws annotationexception, bean***ception
/*** 根據poi所屬行業,獲取服務例項的擴充套件字段列表
** @param poiid
* @return
*/public listgetextendfields(long poiid)
return abstractservice.getextendfields();
}/**
* 根據poi所屬行業,設定服務例項所需要的擴充套件欄位的具體值
** @param poiid poiid
* @param request 使用者請求
* 對擴充套件字段進行賦值
** @param field 欄位名
* @param value 值
*/public void setextendfield(string field, object value)
abstractserviceimpl abstractservice = getserviceimpl(currenttemplatebeanname.get(), abstractserviceimpl.class);
abstractservice.getextendfieldmap().put(field, value);
}protected string getservicename() throws annotationexception
throwexception("has no service annotation.");
}if (serviceclass.isannotationpresent(component.class))
throwexception("has no component annotation.");
}logger.error("has no annotation.");
return null;
}/**
* 根據品類模板,對poiid進行分組
** @param poiids
* @return
*/public map> grouppoiids(listpoiids)
private void throwexception(string message) throws annotationexception
}
5、在springcontext.xml中宣告templatebeanfactory
templatebeanfactory的完整**,包括模板變化時的重新整理
spring動態載入bean
廢話不多說,直接上 private static final string strs new string protected mapremotes new hashmap for int i 0 i string name one if i 0 beandefinitionbuilder user...
Spring之動態註冊bean
什麼場景下,需要主動向spring容器註冊bean呢?如我之前做個的乙個支援掃表的基礎平台,使用者只需要新增基礎配置 groovy任務,就可以丟到這個平台上面來執行了,而這個基礎平台是一直都在執行的,所以在新來任務時,最直觀需要註冊的就是datasource資料來源這個bean了,那麼可以怎麼玩?借...
Spring Boot 動態建立Bean
1 通過註解 import匯入方式建立 a 新建myimportbeandefinitionregistrar註冊中心 import org.springframework.beans.factory.support.beandefinitionregistry import org.springf...