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

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();

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();

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


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

以上是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;
}
}

将一个叫“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());

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

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