我正在创建一个jar
库,我希望用户使用DI来访问库接口。
例如:
而不是在每个使用lib的类中写这个:
ApiEntryPoint entry = API.getEntryPoint();
我希望用户能够使用字段注释:
@ApiEntry
private ApiEntryPoint entry;
我已经研究过Dagger和Guice,但我不认为它们提供了创建我自己的DI注释的方法。
任何让我入门的提示都将不胜感激。
答案 0 :(得分:0)
首先你应该创建你的注释:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
public @interface ApiEntry {
ApiEntry value();
}
之后你应该创建一个producer
来返回你要注入的bean的实例:
public class ApiEntryFactory implements Serializable {
private static final long serialVersionUID = -1L;
@Produces
@ApiEntry
public ApiEntryPoint getApiEntryPoint(ApiEntryPoint apiEntryPoint) {
return apiEntryPoint;
}
}
然后,你创建你的bean:
@Named
public class ApiEntryPoint implements Serializable {
...
}
最后但同样重要的是,您将实例注入您需要的位置:
@Inject
@ApiEntry
private ApiEntryPoint apiEntryPoint;
关于配置,您需要beans.xml
文件才能启用CDI。由于您正在开发JAR文件,因此beans.xml
文件必须位于META-INF目录中:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
</beans>
如果出现任何疑问,您也可以查看here。