ActiveJ学习心得——inject(3)

2021SC@SDUSC

一、代码分析内容

ActiveJ这个框架是有许多@注释语言的,@注释是它的一个重要组成部分,在使用ActiveJ编写程序时是要经常用到的。就比如在使用Inject是,就用到了@Inject注释,如下:

class Main extends Launcher {
    
    
  @Inject
  String message;
  
  @Provides
  String message() {
    
    
    return "你好,世界";
  }
  
  @Override
  protected void run() {
    
    
    System.out.println(message);
  }
  
  public static void main(String[] args) throws Exception {
    
    
    Launcher launcher = new Main();
    launcher.launch(args);
  }
}

所以在这一次博客就解读一下annotation注释部分。

二、annotation包结构

在这里插入图片描述

annotation包里面都是@注释,一共有11个注释类,分别为Eager,Ingect,Named,Optional,Provides,ProvidesIntoSet,QualifierAnnotation,ScopeAnnotation,Scope,ShortTypeName,Transient这11个类。其中一些注释类也会调用其它一些注释类。

三、代码解读

1.Eager类
Eager类是和上一个博客介绍的binding包中的一些类是有关系的。
标记为eager的绑定将在创建时立即为其对象的实例调用。如果 Injector#getInstance获得实力只检索缓存的实例,则调用Next。需要注意的是绑定不能同时是即时eager和Transient。
下面是源码:

@Target({
    
    FIELD, PARAMETER, METHOD})
@Retention(RUNTIME)
public @interface Eager {
    
    
}

2.Inject类
Inject类和注入和绑定有关。
此注释是注入DSL的一部分,它允许使用对象构造函数或静态工厂方法生成绑定。通过io.activej.inject.module.DefaultModule default存在一个 io.activej.inject.binding.BindingGenerator生成器,它可以为可注入类生成缺少的绑定。这个注释可以放在类本身上——它的默认构造函数用于绑定生成,并且必须存在于将要使用的类构造函数或工厂方法(返回类型为该类的静态方法)上。生成绑定时,将扫描类方法和字段以查找 Inject注释,并将其添加为实例创建字段上的绑定依赖项,调用方法时将插入其参数并忽略返回。
下面是源码:

@Target({
    
    FIELD, CONSTRUCTOR, METHOD, TYPE})
@Retention(RUNTIME)
public @interface Inject {
    
    
}

3.Named类
这是一个内置的有状态注释。它用于快速原型制作或需要绑定多个相同类型的键时。如果只有相同类型的对象很少有不同的组,请考虑创建自己的QualifierAnnotation限定符注释。
这个注释类就使用了@QualifierAnnotation注释。
下面是源码:

@QualifierAnnotation
@Target({
    
    FIELD, PARAMETER, METHOD})
@Retention(RUNTIME)
public @interface Named {
    
    
	String value();
}

4.Optional类
此注释与Provides提供程序方法注释DSL和Inject注入注释DSL一起使用,用于将绑定依赖项标记为可选。Inject注释注入域的值将不会被触及,Provides注释方法提供者的参数设置为null。
下面是源码:

@Target({
    
    FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Optional {
    
    
}

5.Provides类
此注释是provider method DSL的一部分,它允许使用模块中声明的方法构建绑定,甚至是io.activej.inject.binding.BindingGenerator生成器的子集。方法返回类型和方法QualifierAnnotation识别器注释形成结果绑定所绑定到的Key,其参数类型及其QualifierAnnotation识别器注释形成绑定依赖项,其主体形成绑定工厂。
注意,提供程序方法是使用反射调用的,因此如果需要一些经常输入的范围的最佳性能,请考虑使用较少的声明性但无反射的ModuleBuilder#bind(Key)绑定DSL。
下面是源码:

@Target(METHOD)
@Retention(RUNTIME)
public @interface Provides {
    
    
}

6.ProvidesIntoSet类
这是Provides提供方法的内置快捷方式,它以单例集的形式提供其结果,并为模块提供的集合键添加Multibinders#toSet()设置多绑定。
下面是源码:

@Target(METHOD)
@Retention(RUNTIME)
public @interface ProvidesIntoSet {
    
    
}

7.QualifierAnnotation类
QualifierAnnotation注释在上面几个注释中提到过,由此可见这个注释在annotation包中的作用还是比较重要的。
这是一个标记元注释,它将注释声明为可以用作Key限定符的注释。创建自定义无状态限定符批注与创建自己的无参数批注并使用QualifierAnnotation对其进行批注一样简单。这样,无状态限定符注释的实际类将用作限定符。如果要创建有状态注释,还应使用QualifierAnnotation对其进行注释。此外,需要使用compatible equals方法获取它的实例(可以使用 Qualifiers.NamedImpl类作为示例),然后,您可以在DSL中使用注释,然后使用创建的限定符实例以编程方式生成键。
下面是源码:

@Target(ANNOTATION_TYPE)
@Retention(RUNTIME)
public @interface QualifierAnnotation {
    
    
}

8.ScopeAnnotation类
这是一个标记元注释,它将注释声明为可以用作Scope的注释。
下面是源码:

@Retention(RUNTIME)
@Target(ANNOTATION_TYPE)
public @interface ScopeAnnotation {
    
    
	boolean threadsafe() default true;
}

9.Scopese类
这是一个特殊的注释,允许使用Provides提供方法。需要注意的时候,它不允许使用有状态范围注释。
下面是源码:

@Retention(RUNTIME)
@Target(ElementType.METHOD)
public @interface Scopes {
    
    
	Class<? extends Annotation>[] value();
}

10.ShortTypeName类
这是一个帮助器注释,可用于覆盖此类型在错误消息中 Key#getDisplayString()的显示和Utils#makeGraphVizGraph中debug图的方式。为了可读性,包和封闭类被剥离,但是如果在不同的包中有多个具有相同名称的类型,则可以通过应用此注释覆盖它们的显示名称。
下面是源码:
@Target(TYPE)
@Retention(RUNTIME)
public @interface ShortTypeName {
String value();
}
11.Transient类
在对象缓存中一个没有slot的binding。也就是说,它的工作方式更像传统的DI,在每次Injector#getInstance调用时创建新实例。要注意,绑定不能同时是transient的和Eager。
下面是源码:

@Target(METHOD)
@Retention(RUNTIME)
public @interface Transient {
    
    
}

四、总结

本次分析的代码是annotation包中的注释,每一个注释的代码都很短,但是它们都有自己的作用,在写项目时使用这些注释会很大地减少代码的工作量,更符合ActiveJ轻量级的观念。

猜你喜欢

转载自blog.csdn.net/zth_idea/article/details/120913751
今日推荐