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