Java 创建自己的依赖项注入注释

Java 创建自己的依赖项注入注释,java,android,dependency-injection,annotations,Java,Android,Dependency Injection,Annotations,我正在创建一个jar库,我希望用户使用DI访问库接口 例如: 不要在每个使用lib的类中编写此命令: ApiEntryPoint entry = API.getEntryPoint(); 我希望用户能够使用字段批注: @ApiEntry private ApiEntryPoint entry; @Qualifier @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD, ElementType.METHOD, El

我正在创建一个
jar
库,我希望用户使用DI访问库接口

例如:

不要在每个使用lib的类中编写此命令:

ApiEntryPoint entry = API.getEntryPoint();
我希望用户能够使用字段批注:

@ApiEntry  
private ApiEntryPoint entry;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
public @interface ApiEntry {
    ApiEntry value();
}
我已经研究了Dagger和Guice,但我认为它们没有提供一种创建我自己的DI注释的方法


如果有任何让我开始学习的建议,我们将不胜感激。

首先,您应该创建注释:

@ApiEntry  
private ApiEntryPoint entry;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.TYPE })
public @interface ApiEntry {
    ApiEntry value();
}
之后,您应该创建一个
生产者
,以返回要注入的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>


任何可能出现的疑问,您也可以查看。

这听起来不像是您一般可以做的事情。您可以做的是提供一个模块,该模块提供用户可以在Dagger设置中安装的
apEntryPoint
。除了声明注释外,您还必须扫描类以查找注释,并修改classbytes以将字节码注入类的构造函数中,以便执行
this.entry=API.getEntryPoint()
,使用自定义类加载器或指令插入。这是一个非常广泛的问题,需要一本书来解释。如果这个问题只是关于注释以及如何使用注释,那么可以从编写一个主类、注释一个字段开始,并让
Main
方法列出字段和注释。你看到了吗?如果你正在发布一个库,那么用户如何使用它并不是你的问题。因此,如果没有@inject注释,就不可能注入某些东西?不,因为
@inject
注释允许将组件标识为可注入的。你可以阅读更多关于它的内容。