§自定义注入 Annotation

学习了前面的 @Inject, @Config@SpringBean 注入 Annotation,这回 jetbrick 带来了更加强大的自定义 Annotation 注入功能。

啥意思? 看看下面的代码就明白了。

§1. 看代码学习

@IocBean
public class Hello {

    @InjectMe
    private String me;

}

@InjectMe 是什么?没见过啊?也能实现注入? YES!

其实这个 @InjectMe 是由用户自定义的,如下的代码:

import java.lang.annotation.*

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@InjectFieldWith(InjectMeInjector.class)
public @interface InjectMe {
    ...
}

在这里,@InjectMe 只是一个普通的 Annotation。唯一不同的是,这个 Annotation 本身存在一个 @InjectFieldWith(...) 的 Annotation。

正是这个 @InjectFieldWith(InjectMeInjector.class) 用来表示 @InjectMe 将可以被用来注入字段(需要配合 @Target({ElementType.FIELD}) 来使用)。

那么如何来注入呢?就是由 @InjectFieldWith(...) Annotation 的参数类来实现的,在本例子中就是 InjectMeInjector 这个 Class 来实现的。

其中 InjectMeInjector 实现如下:(字段注入需要实现 FieldInjector 接口)

public class InjectMeInjector implements FieldInjector {
    private Field field;

    @Override
    public void initialize(FieldContext ctx) {
        this.field = ctx.getField();
    }

    @Override
    public void set(Object object) throws Exception {
        field.set(object, "AAAAA");
    }
}

怎么样,学会了吗?

介绍完了自定义注入字段 Annotation,采用类似的方法,我们还可以定义注入参数 Annotation。

§2. 自定义字段注入

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@InjectFieldWith(XXXFieldInjector.class)
public @interface XXX {
    ...
}

public class XXXFieldInjector implements FieldInjector {
    ...
}

§3. 自定义参数注入 (构造函数参数)

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@InjectParameterWith(XXXParameterInjector.class)
public @interface XXX {
    ...
}

public class XXXParameterInjector implements ParameterInjector {
    ...
}

提示:我们也可以让一个注解既支持字段注入,也支持参数注入。怎么做?我们可以参考 @Config 或者 @SpringBean Annotation 的代码实现。