Yadi是基於Java8的依賴注入容器

banq發表於2014-07-02
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 class="indent">


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 class="indent">


然後進一步使用容器替代ObjectDefinition:

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


以上是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 class="indent">

將一個叫“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 class="indent">


Yadi提供的依賴注入比Spring更加輕量,使用函式程式設計風格進行物件構建更自然和簡單。

開源網址:https://github.com/jexenberger/yadi

相關文章