原理:它本身并不做任何事情,它只是调用其他的加载器:
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 的为准。
在 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 {
...
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