繁体   English   中英

如果@ ApplicationScope,CDI(焊接3.0.3.Final)不调用@PostConstruct

[英]CDI (weld 3.0.3.Final) not calling @PostConstruct if @ApplicationScope

因为我实际上只需要一个实例,所以在浏览最新的应用程序并尝试将bean覆盖到@ApplicationScope时遇到了一个有趣的问题。

我创建了几个类,以从属性文件中注入值。 我这样注入:

@Inject @Conf("key.in.properties.file")
protected String value;

@Conf注释很简单:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
public @interface Conf {
    @Nonbinding
    String value() default "";
}

我用@PostConstruct方法创建了一个生产器类来加载属性文件。 我已经确认,制作此@ApplicationScope时,将不再调用@PostConstruct方法。 这与延迟加载无关。

@ApplicationScoped
public class ConfPropertyProducer {

    private Properties props;

    @PostConstruct
    public void postConstruct(ConfDirectory confDirectory) {
        props = new Properties();
        try {
            props.load(new FileInputStream(new File(confDirectory, "conf.properties")));
        } catch (Throwable t) {
            throw new RuntimeException(t);
        }
    }

    @Produces
    @Conf
    public String produceStringProperty(InjectionPoint ip) {
        Conf m = ip.getAnnotated().getAnnotation(Conf.class);
        if (props == null) {
            throw new RuntimeException("WHY IS PROPS NULL?");
        }
        return props.getProperty(m.value(), "-UNKNOWN-").trim();
    }
} 

解决方法是,我必须摆脱@PostConstruct方法,并将其转换为类构造函数。

如果@ApplicationScope没有任何内容,而是依赖于CDI的默认@Dependant范围,则可以正常工作。 但是我不确定为什么不调用此@PostConstruct方法。 有人有什么想法吗?

您的@PostConstruct方法定义无效-那里没有任何参数。 参见javadoc

拥有它的方式意味着您以不确定的方式使用它。 因此,很难猜测为什么它以一种方式而不是另一种方式起作用,或者为什么它完全起作用。 可能根本不值得猜测。

注意-如果您需要在构造后调用之前进行一些注入,则可行的方法是在其中进行构造函数注入。 为了创建代理,您仍将需要一个无参数的伪构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM