Как весна решить @autowired инъекции в полевых условиях, нет методов установки? [Дубликат]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

44
задан Anthony 21 August 2010 в 07:51
поделиться

4 ответа

Java позволяет отключать элементы управления доступом к полю или методу (да, сначала необходимо пройти проверку безопасности) с помощью метода AccessibleObject.setAccessible() , который является частью структуры отражения (оба Field и Method наследуются от AccessibleObject). Как только поле может быть обнаружено и записано, довольно просто сделать остальную часть; просто Простое программирование .

36
ответ дан Leonardo Pina 27 August 2018 в 07:03
поделиться

Java позволяет вам взаимодействовать с частными членами класса посредством отражения.

Проверьте ReflectionTestUtils , что очень удобно для написания модульных тестов.

6
ответ дан earldouglas 27 August 2018 в 07:03
поделиться

Spring использует API-интерфейс CGLib , чтобы обеспечить автоматическую инъекцию зависимостей.


Ссылки

Дальнейшее чтение

1
ответ дан krock 27 August 2018 в 07:03
поделиться

Нет необходимости в каких-либо сеттерах, вам просто нужно объявить класс EmpDao с помощью аннотации @component, чтобы Spring идентифицировала его как часть компонентов, содержащихся в ApplicationContext ...

You имеют 2 решения:

  • Чтобы вручную объявить ваши компоненты в файле XML applicationContext:
  • Чтобы использовать автоматическое обнаружение, разделив эти строки в вашем файле контекста:

контекст: компонент-сканирование base-package = "package" />

& lt; context: annotation-config />

И использовать аннотацию весны для объявления классов, которые ваш весенний контейнер будет управлять как компоненты

ex:

@Component
class EmpDao {...}

И чтобы аннотировать его ссылку с помощью @Autowired:

@Component (or @Controller, or @Service...)
class myClass {

// tells the application context to inject an instance of EmpDao here
@Autowired
EmpDao empDao;


public void useMyDao()
{
    empDao.method();
}
...
}

Автоустановка происходит путем помещения экземпляра одного компонента в нужное поле в экземпляре другого компонента.

Spring знает о существовании компонентов EmpDao и MyClass и автоматически создаст экземпляр EmpDao в MyClass

, чтобы он мог быть определен в контексте приложения.

4
ответ дан MrJavaJEE 27 August 2018 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: