Чому ми не можемо автоматично встановити статичні поля навесні?


96

Чому ми не можемо автоматично підключити змінну статичного екземпляра у Spring bean. Я знаю, що є інший спосіб досягти цього, але просто хочу знати, чому ми не можемо це зробити нижче.

напр

@Autowired
public static Test test;

чи можете ви пролити трохи світла на альтернативний спосіб, про який ви маєте на увазі.
samshers

Ви можете автопровід через конструктор або використовувати @PostConstuct
gagarwa

Відповіді:


69

Тому що використання статичних полів заохочує використання статичних методів. А статичні методи - це зло. Основна мета введення залежності - дозволити контейнеру створювати для вас об'єкти та з'єднувати їх. Також це полегшує тестування.

Після того, як ви почнете використовувати статичні методи, вам більше не потрібно створювати екземпляр об’єкта, а тестувати набагато складніше. Крім того, ви не можете створити кілька екземплярів даного класу, кожен з яких вводиться інша залежність (оскільки поле неявно спільно використовується і створює глобальний стан - також зло).


11
Єдине застереження, з яким я зіткнувся, - це під час тестування. Якщо ви хочете використовувати @BeforeClassв SpringJUnit4ClassRunner і мати цей метод доступу до бобів @Autowiredу тесті, ви, в основному, не можете. Що дратує.
Джейсон Політес

4
Ця відповідь пояснює, чому це не повинно "т. Але справжнім мотивом є те, що коли рамки намагаються перенести статичний клас у квасоля, він може ще не завантажуватися навантажувачем класів.
Андреа T

51
Ця відповідь абсолютно безглузда. Весна не нав'язує вашу стратегію тестування. Відповідь полягає в тому, що ще не завантажена весняна бібліотека, коли статичний клас інстанціюється завантажувачем класів.
Андреа Т

7
Відповідь від @AndreaT має бути прийнятою відповіддю.
Chirag Agrawal

3
Статичні методи простіші для перевірки, а не складніше. Якщо весна автоматично вводить залежності, здається приємною, але насправді це складний шлях для тестування. Макети, заглушки та тестові дублі - це запахи коду, а не статичні методи.
mttdbrd

150

Оскільки, коли завантажувач класів завантажує статичні значення, контекст Spring ще не обов'язково завантажується. Отже, завантажувач класу не буде належним чином вводити статичні поля в bean-файлі і не працюватиме.


46
Дякуємо за відповідь, яка, здається, насправді відповідає на питання, а не просто висловлює думку, що половина мови Java - погана ідея.
Уоррен Роса

1
"статичний клас"?
Arun Raaj

Це не здається правильним, оскільки Mockito здатний вводити об'єкти в статичні поля, подібно до того, як весна робить автопровід ... хоча я не знаю, чи реалізація однакова. Потрібна додаткова інформація.
gagarwa

Мокіто не може висміювати статичні методи. Вам потрібно використовувати Powermock для знущань зі статичних методів
Джейсон Варгезе

17

Згідно з концепцією ООП, буде поганим дизайном, якщо статичні змінні будуть автоматично підключені.

Статична змінна не є властивістю Object, але це властивість класу. Весняна автоматична проводка проводиться на об’єктах, і це, на мій погляд, робить дизайн чистим. Ви можете розгорнути автоматичний дротовий об'єкт bean як синглтон і досягти того ж, що і визначити його статичним.


15

За допомогою цього рішення ви зможете автоматично з'єднати статичні поля навесні.

@Component
public class TestClass {

    private static Test test;

    @Autowired
    public void setTest(Test test) {
        TestClass.test = test;
    }
}

4
Bugfinder скаржиться на налаштування статичного поля від нестатичного методу.
Нефтанік

@Neftanic посилання на статичних членів з нестатичних працює, зворотне ні
younes zeboudj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.