【问题标题】:@Inject = @Inject, is it possible?@Inject = @Inject,有可能吗?
【发布时间】:2021-03-20 13:33:59
【问题描述】:

我正在使用 Java EE 8,并且我有下一个枚举。问题是是否可以像下一行一样将一个类中另一个注入变量的值分配给一个注入变量?

public enum CommandEnum {

    EMPTY_COMMAND {
        {
            this.command = emptyCommand;
        }
    },
    NAME_GENERATION {
        {
            this.command = nameGenerationCommand;
        }
    },
    NAME_GENERATION_SETTINGS {
        {
            this.command = nameGenerationSettingsCommand;
        }
    },
    SIGNIN {
        {
            this.command = signinCommand; // is it possible?
        }
    };

    @Inject
    @EmptyCommandQualifier
    Command command;
    @Inject
    EmptyCommand emptyCommand;
    @Inject
    NameGenerationCommand nameGenerationCommand;
    @Inject
    NameGenerationSettingsCommand nameGenerationSettingsCommand;
    @Inject
    SigninCommand signinCommand;

    public Command getCommand() {
        return command;
    }
}

谢谢。

【问题讨论】:

  • Enums 不是通过 bean 容器创建的。因此,如果我们能够以这种方式在 Enum 中注入任何内容,我会感到惊讶。
  • 谢谢!我不知道 CDI 不支持枚举
  • 但问题是实际的,因为我的意思是可以将一种类型的注入字段分配给具有相同类型的另一个注入字段的值

标签: java dependency-injection cdi java-ee-8


【解决方案1】:

是的,这是可能的——但只有在 CDI 有机会注入价值之后。 CDI supports @PostConstruct annotation for this purpose:

使用 @PostConstruct 注释初始化托管 Bean 初始化托管 bean 指定 CDI 框架在依赖注入之后但在类投入服务之前应调用的生命周期回调方法。

  1. 在托管 bean 类或其任何超类中,定义一个执行所需初始化的方法。
  2. 使用javax.annotation.PostConstruct 注解对方法的声明进行注解。

当托管 bean 被注入到组件中时,CDI 会在所有注入发生且所有初始化程序都被调用后调用该方法。

注意: 根据 JSR 250 的规定,如果在超类中声明了带注释的方法,则除非声明类的子类覆盖该方法,否则将调用该方法。

添加下面的方法会有你想要的效果:

@PostConstruct
public void init () {
    this.command = signinCommand;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 2019-08-09
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多