Jul 10, 2017 10:38:44 AM

作者:

Ioc 的概念

Nutz.Ioc 从概念上是很简单:将一部分关于对象的依赖关系单独存储在某种介质里,并且提供一个接口帮助使用者获得这些对象。

但是将依赖关系存储在什么地方呢? Spring 选的是 XML, Guice 选的 Java (硬编码)

Nutz.Ioc 核心逻辑并没有限定配置信息的存储方式,但它还是提供了一个默认的配置文件编写方式 — JSON。因为

  • 省却了 XML 书写的烦恼
  • 避免了硬编码 — 修改配置,不需要重新编译工程
    当然,你可以扩展它,提供自己的配置文件加载方式, Nutz.Ioc 不反对你这样,它甚至有点鼓励你这样,虽然 JSON 方式的配置文件书写方式已经工作的很好了。

下面,我先以 JSON 文件为例,给大家一个 Hello World

一个简单的例子

这个对象有两个构造函数

Json 配置文件

与 POJO 在同一包路径下

  1. * 开始写上 var ioc = { , 是为了利用 eclipse 的 javascript 编辑器的自动格式化功能
  2. */
  3. var ioc = {
  4. /*
  5. * 默认的,你仅仅需要直接声明每个字段的值即可,Nutz.Ioc 会为你转型
  6. */
  7. xiaobai : {
  8. name : 'XiaoBai',
  9. birthday : '2009-10-25 15:23:40'
  10. },
  11. /*
  12. * 你当然也可以做更细致的设置
  13. */
  14. xiaohei : {
  15. type : 'nutz.demo.ioc.book.Pet', // 类型
  16. singleton : false, // 是否为单件
  17. args : [ 'XiaoHei' ], // 构造函数参数
  18. fields : {
  19. friend : {refer : 'xiaobai'} // 指向容器里另外一个对象
  20. }
  21. }
  22. }
  1. import org.nutz.ioc.Ioc;
  2. import org.nutz.ioc.impl.NutIoc;
  3. import org.nutz.ioc.loader.json.JsonLoader;
  4. public class HelloPet {
  5. public static void main(String[] args) {
  6. Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/pet/pets.js"));
  7. Pet pet = ioc.get(Pet.class, "xiaobai");
  8. System.out.printf("%s - [%s]\n", pet.getName(), pet.getBirthday().getTimeZone().getID());
  9. ioc.depose(); // 关闭ioc容器.
  10. }
  11. }

控制台输出

  1. Pet xh = ioc.get(null, "xiaohei");
  2. System.out.printf("%s's friend is %s\n", xh.getName(), xh.getFriend().getName());

控制台输出:

  1. XiaoHei's friend is XiaoBai

声明了 singleton: false,那么它每次获取,都会生成一个新的实例

控制台输出:

  1. false

关于进阶

我可以负责任的告诉你:你已经掌握了 Nutz.Ioc 在你开发的时候 80% 情况下所需要的知识。当然,它还提供了更多的功能,有些功能是其他 Ioc 容器所不具备的,你可以根据自己需要来阅读,他们包括:

关于工厂方法

从1.b.51开始, nutz内置的json/xml/annotation加载器支持工厂方法了

  1. {
  2. // 根据静态方法构建对象
  3. ssdb : {
  4. type : "org.nutz.ssdbj4.spi.SSDB", // 接口或抽象类
  5. factory : "org.nutz.ssdbj4.SSDBs#pool" // 类名#方法名
  6. },
  7. // 用另外一个bean的实例方法构建对象
  8. yyy : {
  9. args : "abc",
  10. factory : "$ssdb#batch" // $对象名称#方法名
  11. }
  12. }

XML写法是

可选属性

从1.b.51开始, nutz内置的json/xml/annotation加载器支持可选属性了

有时候,某些服务即使不存在也不会影响系统的运行,但这些属性又是ioc配置好的,这时就需要可选属性了

注解的写法是

  1. @IocBean
  2. public class MqttService {
  3. @Inject(optional=true)
  4. protect Dao dao;
  5. @Inject
  6. protect MqttClient client;
  7. public void publish(String topic, Object data) {
  8. if (dao != null) { // 有就记录,没有就算了呗
  9. dao.insert(new MqttHistory(topic, String.value(data));
  10. }
  11. client.publish(topic, data);
  12. }

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