获取ioc对象的特殊场景
在Mvc环境下
方法1, 通过SetupBy,将Ioc容器放到一个public的静态属性, 推荐.
@SetupBy(MainSetup.class) public class MainModule {} public class MainSetup implements Setup { public static Ioc ioc; public void init(NutConfig conf) { MainSetup.ioc = conf.getIoc(); } }
方法2, 通过Mvcs类
// NutFilter作用域内,通常是请求线程内 Ioc ioc = Mvcs.getIoc(); // 独立线程, 例如计划任务,定时任务的线程. Ioc ioc = Mvcs.ctx().getDefaultIoc();
非Mvc环境下
这种情况下, 一般是不需要Ioc容器的. 如果需要,那么Ioc容器是自行new的,所以需要下面 范式
public class MyApp { public static Ioc ioc; static { ioc = new NutIoc(new ComboIocLoader("*anoo", ...)); } }
单元测试时的Ioc
请使用nutz-plugins-mock插件
首先,需要实现一个自定义的TestRunner
public class NutBookIocTestRunner extends NutTestRunner { public NutBookIocTestRunner(Class<?> klass) throws InitializationError { super(klass); } // 若使用Nutz MVC, 覆盖getMainModule方法 protected Class<?> getMainModule() { return MainModule.class; } // 非mvc环境下, 覆盖getIocArgs/createIocLoader/createIoc均可 }
测试类, 其中的@RunWith(NutBookIocTestRunner.class)是关键哦,当然,@IocBean也是必须的
@RunWith(NutBookIocTestRunner.class) @IocBean public class SimpleNutTest { @Inject protect Dao dao; public void test_dao_ok() { assertNotNull(dao); } }