logo

Внедрение зависимостей в самостоятельно созданный объект в Spring

Для того чтобы осуществить внедрение зависимостей в объект, созданный вручную, в Spring применяется AutowireCapableBeanFactory следующим образом:

Java
Скопировать код
@Autowired
private AutowireCapableBeanFactory beanFactory;

public void myMethod() {
    MyBean myBean = new MyBean();
    beanFactory.autowireBean(myBean);
    // Готово! 'myBean' теперь обладает возможностями DI.
}

Суть подхода заключается в том, что он позволяет совершать привязку бинов, не созданных через Spring, при этом сохраняя все преимущества его системы внедрения зависимостей.

Иммерсия в оазис DI Spring

С Spring использование оператора new не ведет к потере возможностей DI. AutowireCapableBeanFactory способен обеспечить внедрение зависимостей DI даже в объекты, созданные вручную.

Усиление с помощью @Configurable

Вы можете использовать аннотацию @Configurable, чтобы обеспечить классу использование Spring DI:

Java
Скопировать код
@Configurable(preConstruction = true)
public class MyDIStarvedClass {
    @Autowired
    private MyHardWorkingService contributingService;
    // Класс получает все необходимые инъекции с помощью Spring.
}

Не забывайте активировать load-time weaving через @EnableSpringConfigurable.

Обход статических трудностей

Статические вспомогательные методы позволяют получить доступ к бинам Spring даже вне контекста его управления:

Java
Скопировать код
public class BeanBouncer {
    public static <T> T rebound(Class<T> beanClass) {
        // Spring помогает получить бин и возвращает его нам!
        return AppContextProvider.getApplicationContext().getBean(beanClass);
    }
}

Решение конфигурационных проблем при использовании Gradle и Eclipse

Если вы используете AspectJ с Gradle и Eclipse, могут возникнуть трудности с настройкой конфигурации. Обойдите эти трудности, правильно подключив spring-aspects и зависимости AspectJ, и путь к dependency injection будет открыт.

Визуализация

Представьте DI в Spring как установку реактивных двигателей на личный глайдер:

Markdown
Скопировать код
🛩️ <: Ваш глайдер        🛩️🚀 <: Глайдер, оборудованный реактивными двигателями Spring

Внедрение зависимостей работает аналогичным образом:

Java
Скопировать код
@Autowire RocketBoosters boosters; // Реактивная тяга для вашего глайдера!

Как ваши условия изменятся:

Markdown
Скопировать код
Было: 🛩️ + 🚶‍♂️🔄 (Вы поддерживаете полёт)
Стало: 🛩️🚀 + ☕ (Вы отдыхаете с кофе, пока глайдер сам движется вперед)

Это не магия, это @Autowire в Spring.

Инициализация бинов по требованию

Всё упирается в способность использования Spring для инициализации экземпляров классов, созданных через new, предоставляя им преимущества режима DI Spring.

Мастерство использования autowire

Расширив свои возможности до AutowireCapableBeanFactory, вы можете получить статус ApplicationContextAware и использовать предоставляемый ApplicationContext:

Java
Скопировать код
public class AutowireEnforcer implements ApplicationContextAware {
    private static AutowireCapableBeanFactory beanFactory;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        beanFactory = applicationContext.getAutowireCapableBeanFactory();
    }

    public static void enforceAutowire(Object object) {
        // Spring готов внедрить зависимости в этот объект.
        beanFactory.autowireBean(object);
    }
}

Этот подход помогает избежать сложностей работы с фреймворком.

Соответствие версий

Убедитесь, что версии ваших зависимостей, в частности spring-aop или spring-aspects, соответствуют версии Spring Framework, для создания гармоничной целостности в экосистеме приложения.

Преимущества @Configurable

Если вы обернете бин аннотацией @Configurable и добавите

xml
Скопировать код
<context:spring-configured/>

в XML-контексте приложения или @EnableSpringConfigurable в конфигурации на Java, это позволит Spring осуществлять полный контроль над бинами.

Полезные материалы

  1. Официальная документация Spring по внедрению зависимостейосновной источник для понимания концепции dependency injection в Spring.
  2. AnnotationConfigApplicationContext (Spring Framework 6.1.3 API) — детальная информация о активации бинов с помощью AnnotationConfigApplicationContext.
  3. BeanFactory (Spring Framework 6.1.3 API) — разъяснения создания бинов через Spring BeanFactory.
  4. AspectJ в Spring для внедрения зависимостей — сведения о расширении возможностей DI с помощью AspectJ в приложениях Spring.
  5. Spring @Configurable для внедрения бинов в POJO — принципы использования @Configurable для внедрения зависимостей в неконтролируемые объекты.
  6. Look-up method injection в Spring — методы для внедрения прототипов в синглтоны в Spring.