获取ioc对象的特殊场景

Jul 10, 2017 10:38:44 AM

作者:wendal

在Mvc环境下

方法1, 通过SetupBy,将Ioc容器放到一个public的静态属性, 推荐.

  1. @SetupBy(MainSetup.class)
  2. public class MainModule {}
  3. public class MainSetup implements Setup {
  4. public static Ioc ioc;
  5. public void init(NutConfig conf) {
  6. MainSetup.ioc = conf.getIoc();
  7. }
  8. }

方法2, 通过Mvcs类

  1. // NutFilter作用域内,通常是请求线程内
  2. Ioc ioc = Mvcs.getIoc();
  3. // 独立线程, 例如计划任务,定时任务的线程.
  4. Ioc ioc = Mvcs.ctx().getDefaultIoc();

非Mvc环境下

这种情况下, 一般是不需要Ioc容器的. 如果需要,那么Ioc容器是自行new的,所以需要下面 范式

  1. public class MyApp {
  2. public static Ioc ioc;
  3. static {
  4. ioc = new NutIoc(new ComboIocLoader("*anoo", ...));
  5. }
  6. }

单元测试时的Ioc

请使用nutz-plugins-mock插件

首先,需要实现一个自定义的TestRunner

  1. public class NutBookIocTestRunner extends NutTestRunner {
  2. public NutBookIocTestRunner(Class<?> klass) throws InitializationError {
  3. super(klass);
  4. }
  5. // 若使用Nutz MVC, 覆盖getMainModule方法
  6. protected Class<?> getMainModule() {
  7. return MainModule.class;
  8. }
  9. // 非mvc环境下, 覆盖getIocArgs/createIocLoader/createIoc均可
  10. }

测试类, 其中的@RunWith(NutBookIocTestRunner.class)是关键哦,当然,@IocBean也是必须的

  1. @RunWith(NutBookIocTestRunner.class)
  2. @IocBean
  3. public class SimpleNutTest {
  4. @Inject
  5. protect Dao dao;
  6. public void test_dao_ok() {
  7. assertNotNull(dao);
  8. }
  9. }

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/ioc/ioc_by_hand.html