Spring動態建立bean

2021-09-02 13:47:19 字數 4662 閱讀 9477

最近有個專案場景,多垂類支援,大體業務流程相同,只是一些業務規則的校驗引數不同。解決思路是將業務引數作為類的屬性,然後建立垂類數量個例項,去處理不同垂類的業務。

下面分兩部分介紹:

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...