NutzCN Logo
问答 nutz ioc的工厂方法怎么写?类似于spring的fatcory-bean和factory-method吗?
发布于 3322天前 作者 wendal 2711 次浏览 复制 上一个帖子 下一个帖子
标签: ioc

首先, 一个抽象类, 一个工厂类

public abstract class EmailService {
    public abstract void send(Email email);
}

public class EmailServiceFactory {
    public static create(String type) {
	    return new EmailService{
		     public void send(Email email){
			    //发邮件XXXX
			 };
		};
	}
}

现在要把声明一个EmailService到ioc容器里面, 但EmailService是没法直接构造的, 怎么配置到nutz ioc呢?

3 回复

需要走factory, 首先看js配置:

emailService :{
    factory : "xxx.yyy.zzz.EmailServiceFactory#create",
    args : ["gmail"]
	// 注意一下, type写不写都一样了
}

上面的配置,在生成对象这一步,*等价于*(注意用词,实际调用会复杂一些,涉及转型匹配参数之类):

EmailService email = xxx.yyy.zzz.EmailServiceFactory.create("email");

可以看到, factory的规则是 类名+井号+方法名, 而参数就是原本用于构造方法的args数组

更进一步, 如果只能由其他ioc bean的实例方法构建呢? 例如rpc中的代理接口, java代码是这样

SayHi sayHi = rpc.getService(SayHi.class);

将其转换为ioc里面配置, 其中rpc已经是一个ioc的bean

sayHi : {
    factory : "$rpc#getService",
	args : ["xxx.yyy.zzz.SayHi"]
}

我猜你明白规则的了吧? 美元符号+iocbean的名称+井号+方法名称

基于上述规则, 就可以通过任意public静态方法或iocbean的实例方法,定义出一个新的IocBean, 快动手写一个吧

为温泉写个testcase

public class SimpleTest {
    @Test
    public void test_ioc_factory_create() {
        Ioc ioc = new NutIoc(new JsonLoader(new StringReader("{abc:{factory:'net.wendal.nutzbook.SimpleTest#create'}}")));
        ioc.get(Object.class, "abc");
        ioc.depose();
    }
    
    public static Dao create() {
        return new NutDao();//纯粹用于演示factory的用法,不要学.
    }
}

添加回复
请先登陆
回到顶部