Yadi是基于Java8的依赖注入容器

14-07-02 banq
Yadi是一个类型安全的依赖注入Dependency Injection容器,使用Java 8特性提供依赖配对wiring.

Yadi 有如下特点:

1.占据很小的内存,自身大小不超过100kb

2.不会创建不必要的依赖。

3.容易快速设置运行。

4.元注解降低到最小。

Yadi的原理是利用Java 8的lambda特点,如:

MyObject result = new ObjectDefinition() 
    .type(MyObject.class)
    .set((myObject, value)-> myObject.setA(value), "hello world")
    .set((myObject, value)-> myObject.setB(value), "hallo welt")
    .create();
<p>

ObjectDefintion使用正常的反射创建对象,然后运行 系列java.util.function.BiConsumer接口,传入实体对象的实例和相应的数值。

再使用Java 8的方法引用对上面代码进行加工,第一个参数是实例值,后面是相应的方法参数。

MyObject result = new ObjectDefinition()
    .type(MyObject.class)
    .set(MyObject::setA, "hello world")
    .set(MyObject::setB, "hallo welt")
    .create();
<p>

然后进一步使用容器替代ObjectDefinition:

  Container container = create((builder) -> {
          builder
              .define(MyObject.class)
              .set(MyObject::setA, "hello world");
     });
     String myString = container.get(MyObject.class);                
<p>

以上是Yadi的原理,下面说明如何使用Yadi进行对象之间的注入。假设有一个类Person:

public class Person {

    String name;
    String surname;
    String fullName;
    Person spouse;


    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getFullName() {
        return fullName;
    }

    public Person getSpouse() {
        return spouse;
    }

    public void setSpouse(Person spouse) {
        this.spouse = spouse;
    }

    public void setup() {
        this.fullName = this.name + " " + this.surname;
    }
}
<p>

将一个叫“sSmith”的Person实例注入到另外一个叫"jSmith"的Person实例中:

import static org.yadi.core.DefaultContainer.create;
...
Container container = create((builder) -> {
   builder
     .define(Person.class)
     .named("sSmith");
     .set(Person::setName, "Sarah")
     .set(Person::setSurname, "Smith")
     .initWith(Person::setup);

   builder
     .define(Person.class)
     .named("jSmith");
     .set(Person::setName, "John")
     .set(Person::setSurname, "Smith")
     .inject(Person::setSpouse, "sSmith")
     .initWith(Person::setup);


});
Person person = container.get("jSmith");
System.out.println(person.getSpouse().getFullName());
<p>

Yadi提供的依赖注入比Spring更加轻量,使用函数编程风格进行对象构建更自然和简单。

开源网址:https://github.com/jexenberger/yadi

1
猜你喜欢