Назад к вопросам
Middle
69
questionbank

Как можно применить dependency injection с использованием Spring Bean?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Spring Boot поддерживает DI тремя основными способами:

  1. Injection by Field:
    Наиболее распространенный и простой способ. Использование @Autowired над полем. Не рекомендуется для продакшн-кода из-за сложностей с тестированием и инкапсуляцией.

    // Field Injection
    @Service
    public class MyService {
    
        @Autowired
        private MyDependency dependency;
    
        public void doSomething() {
            dependency.execute();
        }
    }
    
  2. Injection by Setter:
    Использование @Autowired над сеттером. Позволяет опциональность зависимости (если сеттер может не вызываться) и облегчает тестирование.

    // Setter Injection
    @Service
    public class MyService {
    
        private MyDependency dependency;
    
        @Autowired
        public void setDependency(MyDependency dependency) {
            this.dependency = dependency;
        }
    
        public void doSomething() {
            dependency.execute();
        }
    }
    
  3. Injection by Constructor:
    Наиболее рекомендуемый способ. Использование @Autowired над конструктором. Обеспечивает неизменяемость зависимости после создания объекта и четко указывает на обязательные зависимости. В Spring Boot 2.x+ @Autowired над единственным конструктором можно опустить.

    // Constructor Injection
    @Service
    public class MyService {
    
        private final MyDependency dependency;
    
        // @Autowired is optional for a single constructor in Spring Boot 2.x+
        public MyService(MyDependency dependency) {
            this.dependency = dependency;
        }
    
        public void doSomething() {
            dependency.execute();
        }
    }
    

Spring контейнер сканирует классы с аннотациями вроде @Component, @Service, @Repository, @Controller и создает из них Bean'ы. Когда Bean с аннотацией @Autowired на поле, сеттере или конструкторе обнаруживает необходимость в другой зависимости, контейнер ищет подходящий Bean по типу и/или имени и внедряет его. Если есть несколько подходящих Bean'ов, можно использовать @Qualifier для уточнения.