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

时间:2018-06-14 18:37:31

标签: java dependency-injection cdi weld jboss-weld

我遇到了一个有趣的问题,因为我正在浏览最新的应用程序,并正在将bean转换为@ApplicationScope,因为我真的只需要一个实例。

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

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

@Conf注释很简单:

@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时,不再调用@PostConstruct方法。这不是延迟加载的问题。

circles.attr('cx', (d) => xNewScale(d.duration))
   .attr('cy', (d) => yNewScale(d.priority));

作为一种解决方法,我不得不摆脱@PostConstruct方法并将其转换为类构造函数。

当@ApplicationScope什么也没有,而是依赖于CDI的默认@Dependant范围时,它运行正常。但是我不确定为什么永远不会调用这个@PostConstruct方法。有人有什么想法?

1 个答案:

答案 0 :(得分:1)

您的@PostConstruct方法定义无效 - 您不能在那里拥有任何参数。请参阅javadoc

你拥有它的方式意味着你以一种未定义的方式使用它。因此,很难猜出为什么它以某种方式起作用而不是在另一种方式起作用或为什么起作用。并且可能根本不值得猜测。

注意 - 如果需要在post构造调用之前进行一些注入,那么首选方法是使用构造函数注入它。为了代理创建,你仍然需要一个无参数的伪构造函数。