Как правильно внедрять зависимости в классы, зависящие от не-бинов?

При работе с зависимостями в Java-приложениях, особенно в средах, где есть возможность использования Dependency Injection (DI) фреймворков, таких как Spring Framework, очень важно уметь внедрять зависимости в классы, которые зависят от не-бинов (не управляемых контейнером).

Существует несколько способов, как можно внедрять такие зависимости:

1. Конструкторы с параметрами: одним из наиболее распространенных способов внедрения зависимостей в классы, зависящие от не-бинов, является передача зависимости через конструктор класса. Например:

public class MyClass {
    private final MyDependency myDependency;

    public MyClass(MyDependency myDependency) {
        this.myDependency = myDependency;
    }

    // Далее идут методы класса MyClass
}

2. Сеттеры: еще одним распространенным подходом является внедрение зависимостей с помощью методов-сеттеров. Например:

public class MyClass {
    private MyDependency myDependency;

    public void setMyDependency(MyDependency myDependency) {
        this.myDependency = myDependency;
    }

    // Далее идут методы класса MyClass
}

3. Внедрение через аннотации: при использовании DI фреймворков, таких как Spring Framework, можно также внедрять зависимости через аннотации. Например, с помощью аннотации @Autowired:

public class MyClass {
    @Autowired
    private MyDependency myDependency;

    // Далее идут методы класса MyClass
}

4. Внедрение через конфигурацию: в случаях, когда класс зависит от нескольких различных зависимостей, можно внедрять их через конфигурационный класс или файл. Например, с помощью Java Config в Spring Framework:

@Configuration
public class AppConfig {
    @Bean
    public MyDependency myDependency() {
        return new MyDependency();
    }

    @Bean
    public MyClass myClass() {
        return new MyClass(myDependency());
    }
}

Независимо от выбранного способа, важно следить за тем, чтобы зависимости внедрялись правильно и вовремя для обеспечения корректной работы приложения. Правильное управление зависимостями позволит улучшить читаемость, расширяемость и тестируемость вашего кода.