У меня есть два класса SomeService и Dependency настроен и подключен через Spring:Можно ли воспроизвести ошибку видимости?
@Named
public class SomeService implements Service
{
@Inject
public Dependency dependency;
public void execute()
{
dependency.execute();
}
}
@Named
public class Dependency
{
public void execute()
{
}
}
В некоторых редких случаях SomeService.execute() бросает NPE. Я думаю, что эта проблема не является конечным/энергонезависимым полем, к которым невозможно получить доступ из разных потоков без внешней синхронизации. Довольно очевидное решение состоит в том, чтобы сделать поле «Зависимость» окончательным и заменить инъекцию поля инжектором конструктора. Но я пытался воспроизвести исходную ошибку на моей локальной машине, используя один поток, инициирующий ApplicationContext и несколько других потоков, пытающихся получить SomeService. Во всех случаях зависимость никогда не была нулевой. Возможно ли даже сделать тестовый пример, воспроизводящий проблему? Спасибо заранее.
Во-первых, вы можете сделать 'зависимым' поле' private'. Я предполагаю, что вы либо устанавливаете его как «null», либо создаете экземпляр «Service» без использования зависимости ('new SomeService') в другом месте. Сделайте поле 'private' и создайте конструктор не по умолчанию (не создавайте без параметров) и проверьте, что больше не компилируется. – SJuan76
Это всего лишь краткий пример реальных классов. В поле реального класса является private, а класс SomeService создается с использованием org.springframework.beans.factory.BeanFactory # getBean (java.lang.Class). –
Вы также можете использовать инъекцию конструктора, чтобы сделать их окончательными. – rlegendi