К каждому бину в CDI прикреплена область видимости. Область действия определяет контекст, в котором она живет, что, в свою очередь, контролирует жизненный цикл ее компонентов. Даже если вы не указали явно область действия, она всегда есть; @Dependent
предполагается, если никакая другая область не была указана.
Теперь, bean-компонент может быть классом, методом-производителем или полем производителя (на самом деле есть синтетические c, слишком мало других вещей можно считать bean-компонентами). но давайте пока оставим это в стороне). Поэтому даже производителям необходимо определить область действия производимого ими компонента.
Вот код:
@Produces
@Dependent //annotatation is not needed, it would be assumed automatically
public String produceDependentBean() {
if (isTodayMonday()) {
return null;
} else {
return "foo";
}
}
// this one is going to throw an exception once used, you cannot return null and have other then dependent scope
@Produces
@ApplicationScoped
public String produceIllegalStuff() {
return null;
}
Часть спецификации, которую вы процитировали, просто говорит, что в случае, если метод производителя возвращает null
в некоторых случаях, тогда должно быть @Dependent
. Следует отметить, что возврат null
от производителей является довольно редким случаем использования, но, тем не менее, значение c должно быть ясным.