微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Micronaut:如何用@Context 替换@EventListener 与@Singleton 的组合?

如何解决Micronaut:如何用@Context 替换@EventListener 与@Singleton 的组合?

假设我有一个正在加载一些事件的类:

@Singleton
class EventStarter {

    @Value("${very.important.key}")
    private String key;

    public EventStarter(MyEvents events) {
        this.events = events;
    }

    private final MyEvents events;

    @EventListener
    void onApplicationEvent(ServerStartupEvent event) throws IOException {
        events.register(key);
    }
}

我听说我可以重构此代码以使用 @Context 批注而不是使用 @EventListener。我曾尝试这样做,但我失败了。

我有一个类使用 @Context 注释,如下所示:

@Context
@Singleton
@Requires(property = "JASYPT_ENCRYPTOR_PASSWORD")
public class JasyptDecryptor implements BeanInitializedEventListener<Environment> {

    public JasyptConfigurationPropertiesDecryptor(DefaultEnvironment environment,@Value("${JASYPT_ENCRYPTOR_PASSWORD}") String encryptedPassword) {
        LOGGER.info("JasyptBootstrapDecryptor started");
        processConfigurationProperties(environment,encryptedPassword);
    }

    private void processConfigurationProperties(DefaultEnvironment environment,String encryptedPassword) {
        // unrelated code here
    }

    @Override
    public Environment onInitialized(BeanInitializingEvent<Environment> event) {
        return event.getBean();
    }
}

这个类正在实现BeanInitializedEventListener<Environment>。我应该在我的 EventStarter 类中以某种方式实现它吗?据我了解,它不应该将 Environment 作为一种类型,但它应该是什么? ServerStartupEvent

在某些时候,我达到了这样的境界:

@Context
@Singleton
@Requires(property = "${very.important.key}")
class EventStarter implements BeanInitializedEventListener<ServerStartupEvent> {

    public EventStarter(MyEvents events) {
        this.events = events;
        startEvents()
    }

    private final MyEvents events;

    private void startEvents() throws IOException {
        events.register(key);
    }

    @Override
    public Environment onInitialized(BeanInitializingEvent<ServerStartupEvent> event) {
        return event.getBean();
    }
}

它似乎有效......部分 - 我得到了一个例外,只是很少提到“令牌”,所以似乎这个 ${very.important.key} 是,正如我推测的那样,是空的或空的,所以它不是从application.yml读取。

在这里做错了什么?有没有办法做到这一点?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。