Ioc - 複合加載器
複合加載器的使用方法
原理:它本身並不做任何事情,它只是調用其他的加載器:
ComboIocLoader loader = new ComboIocLoader("*js",
"ioc/dao.js",
"ioc/service.js",
"*anno",
"com.myapp.module",
"com.myapp.service",
"*tx",
// @Async註解,異步執行.
"*async");
如上面的例子,組合加載器,組合了3個 Ioc 加載器,一個是 JsonLoader,一個是 AnnotationIocLoader, 一個是AOP事務的TransIocLoader(1.b.52新增), 一個異步註解加載器。
ComboIocLoader 的構造函數是個字符串形變參數組,所有的參數,如果以星號 "*" 開頭, 則被認爲是加載器的類型,後面的參數都作爲這個加載器構造函數的參數,直到遇到下一個 星號 "*" 開頭的參數。
上面的例子,實際上爲 Ioc 容器準備了這兩個加載器,第一個是 JSON 加載器,它從 dao.js 和 service.js 這兩個配置文件中讀取容器對象的配置信息。 而另外一個 Annotation 加載器,從 會掃描包 com.myapp.module 以及 com.myapp.service 已經其下的子包,如果發現有 容器對象(聲明瞭 @IocBean 註解,詳情請看 Ioc - Annotation 加載器) 就會加載。
並且這兩個加載器的優先級爲
排在前面前面的加載器更優先,
在本節的例子中, JsonLoader 加載器比 AnnotationIocLoader 更加優先. 就是說,如果兩個加載器都加載了同名對象,則以 JsonLoader 的爲準。
在 Mvc 中的用法
在 Nutz.Mvc 中,Ioc 容器是由 IocProvider 接口來提供的,所以,每個加載器都由一個類似 的 IocProvier 實現。比如 ComboIocLoader,也就有一個 ComboIocProvider。
但是,請千萬要注意: 對於 ComboIocProvider:
它組合的依然是其他 IocLoader
而不是
其他 IocProvider
下面給個例子:
@IocBy(type = ComboIocProvider.class,
args = {"*js",
"ioc/dao.js",
"ioc/service.js",
"*anno",
"com.myapp.module",
"com.myapp.service"
})
public class MainModule {
...
現在你都可以複合什麼?
- XmlIocLoader
- JsonLoader
- AnnotationIocLoader
- MapLoader
- TransIocLoader
- AsyncAopIocLoader
- PropertiesIocLoader
- 所有實現的 IocLoader接口的類
類名的簡寫
js --> org.nutz.ioc.loader.json.JsonLoader
json --> org.nutz.ioc.loader.json.JsonLoader
xml --> org.nutz.ioc.loader.xml.XmlIocLoader
annotation --> org.nutz.ioc.loader.annotation.AnnotationIocLoader
anno --> org.nutz.ioc.loader.annotation.AnnotationIocLoader
tx --> org.nutz.aop.interceptor.ioc.TransIocLoader #無參數
trans --> org.nutz.aop.interceptor.ioc.TransIocLoader #無參數
async --> org.nutz.aop.interceptor.async.AsyncAopIocLoader #可以帶一個線程池大小的參數
props --> org.nutz.ioc.loader.properties.PropertiesIocLoader # 通過properties文件定義ioc bean
properties --> org.nutz.ioc.loader.properties.PropertiesIocLoader