Чому ми не можемо автоматично підключити змінну статичного екземпляра у Spring bean. Я знаю, що є інший спосіб досягти цього, але просто хочу знати, чому ми не можемо це зробити нижче.
напр
@Autowired
public static Test test;
Чому ми не можемо автоматично підключити змінну статичного екземпляра у Spring bean. Я знаю, що є інший спосіб досягти цього, але просто хочу знати, чому ми не можемо це зробити нижче.
напр
@Autowired
public static Test test;
Відповіді:
Тому що використання статичних полів заохочує використання статичних методів. А статичні методи - це зло. Основна мета введення залежності - дозволити контейнеру створювати для вас об'єкти та з'єднувати їх. Також це полегшує тестування.
Після того, як ви почнете використовувати статичні методи, вам більше не потрібно створювати екземпляр об’єкта, а тестувати набагато складніше. Крім того, ви не можете створити кілька екземплярів даного класу, кожен з яких вводиться інша залежність (оскільки поле неявно спільно використовується і створює глобальний стан - також зло).
@BeforeClass
в SpringJUnit4ClassRunner і мати цей метод доступу до бобів @Autowired
у тесті, ви, в основному, не можете. Що дратує.
Оскільки, коли завантажувач класів завантажує статичні значення, контекст Spring ще не обов'язково завантажується. Отже, завантажувач класу не буде належним чином вводити статичні поля в bean-файлі і не працюватиме.
Згідно з концепцією ООП, буде поганим дизайном, якщо статичні змінні будуть автоматично підключені.
Статична змінна не є властивістю Object, але це властивість класу. Весняна автоматична проводка проводиться на об’єктах, і це, на мій погляд, робить дизайн чистим. Ви можете розгорнути автоматичний дротовий об'єкт bean як синглтон і досягти того ж, що і визначити його статичним.
За допомогою цього рішення ви зможете автоматично з'єднати статичні поля навесні.
@Component
public class TestClass {
private static Test test;
@Autowired
public void setTest(Test test) {
TestClass.test = test;
}
}