当前位置: 首页 > 知识库问答 >
问题:

是否有重新注入/更新注入的bean字段的方法?

邢心水
2023-03-14
public class MyBean {

    @Inject
    @DbConfigValue(MyConfig.HOST)
    String host;
}
@Singleton
@Lock(LockType.READ)
public class Configuration {

    @Produces
    @Dependent
    @DbConfigValue
    public String getDbConfigValue(InjectionPoint point) {
        // get key for the config-value from qualifier-annotation of the injected field
        String key = point.getAnnotated().getAnnotation(DbConfigValue.class).value();
        // i have read+cached database config values in @PostConstruct before
        return cachedConfigValues.get(key);
    }
}

这对于初始注入/bean构建非常有效。一些网络教程建议采用这种方法。

现在,我认为可以合理地假设配置值(如果存储在DB中)可能会在运行时发生变化。因此,每当管理员更改数据库配置值时,我就会触发CDI-Event。

问题:有什么方法可以将值重新注入到已经初始化的bean实例的字段中吗?还是注入总是只与实例创建相关?

public class MyEventListener {

    @Inject
    BeanManager beanManager;

    @Asynchronous
    public void onDbConfigValueChangedEvent (@Observes(during = TransactionPhase.AFTER_SUCCESS) DbConfigValueChangedEvent event) {
        try {
            // could be filtered by custom qualifier:
            Set<Bean<?>> beans = beanManager.getBeans(Object.class,new AnnotationLiteral<Any>() {});

            for (Bean<?> bean : beans) {
                Set<InjectionPoint> points = bean.getInjectionPoints();
                // What now? javax.enterprise.inject.spi.Bean is the 
                // bean-representation only. 
                // Can I somehow resolve the actual bean-instances here?
                // Then update Field via Reflection?
            }
        }
        catch(Exception e){
            // ...
        }
    }
}
public class MyBean {

    @Inject
    Configuration config;

    public void someMethod(){
        String host = config.getConfig(MyConfig.HOST);
        // ...
    }
}

然而,我想知道一个普遍的问题:是否有任何支持重新注射?或者如果不是,规范(CDI或Java EE)是否禁止它?

共有1个答案

桂高昂
2023-03-14

根据db的快/慢程度,这可能是昂贵的。您可能可以利用producer方法中的一些缓存机制。利用instance注入机制,它会懒洋洋地加载实际注入的bean。

您的生产者(可能会利用一些缓存来避免所有的db调用)

@Singleton
@Lock(LockType.READ)
public class Configuration {

    @Produces
    @RequestScoped //May fail if not in a request-context, but for ejb-calls, it is guaranteed to work as CDI has EJB Request Context
    @DbConfigValue
    public String getDbConfigValue(InjectionPoint point) {
        // get key for the config-value from qualifier-annotation of the injected field
        String key = point.getAnnotated().getAnnotation(DbConfigValue.class).value();
        // i have read+cached database config values in @PostConstruct before
        return cachedConfigValues.get(key);
    }
}

和注射要点:

@SessionScoped
public class MyBean {

    @Inject
    @DbConfigValue(MyConfig.HOST)
    private Instance<String> host;

    public void doSomething() {
        String myHost = host.get(); // of course will throw exception if value is failing. It will be resolved with every request.
    }
}
 类似资料:
  • 我有Spring控制器,它使用构造函数注入来满足服务层依赖性。效果很好。现在,在组织中有一些旧的代码来双重检查依赖关系是否有效。我认为这是一个反模式,因为它是与横切关注点相关的代码,被注入的客户端不应该担心这一点。 如果无法解析依赖关系,则 IoC 容器 (Spring) 将引发相应的错误(UnSatisfiedLink 或其他),使用这些服务的客户端应该与如何或是否正确注入这些依赖关系无关。它应

  • 我有一个类,我需要注入一个变量,但构造函数没有注入guice。 x的值未被注入。guice是否有必要在构造函数中使用注入来识别方法注入?我是否需要从其他类调用此方法才能工作?Thanx提前

  • 我正在尝试用Angular构建一个简单的计算器,如果我想的话,我可以覆盖总数。我有这部分的工作,但当我回去输入一个数字在一个或两个领域的总数没有在该领域的更新。 这是我的jsfiddlehttp://jsfiddle.net/YUza7/2/ 形式 javascript

  • 本文向大家介绍Spring Bean的属性注入方式,包括了Spring Bean的属性注入方式的使用技巧和注意事项,需要的朋友参考一下 在spring中bean的属性注入有两种 构造器注入 Setter方法注入 集合属性的注入 在spring中对于集合属性,可以使用专门的标签来完成注入. 例如:list set map properties等集合元素来完成集合属性注入. List属性注入 如果属性

  • 主要内容:Google Guice 字段注入 示例,输出注入是将依赖注入对象的过程。字段注入用于将值对象设置为对对象字段的依赖。请参阅下面的示例。 Google Guice 字段注入 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • 请让我知道,如何使用带注释的映射器在mybatis中执行批插入/更新。