Внедрение зависимостей в самостоятельно созданный объект в Spring
Для того чтобы осуществить внедрение зависимостей в объект, созданный вручную, в Spring применяется AutowireCapableBeanFactory
следующим образом:
@Autowired
private AutowireCapableBeanFactory beanFactory;
public void myMethod() {
MyBean myBean = new MyBean();
beanFactory.autowireBean(myBean);
// Готово! 'myBean' теперь обладает возможностями DI.
}
Суть подхода заключается в том, что он позволяет совершать привязку бинов, не созданных через Spring, при этом сохраняя все преимущества его системы внедрения зависимостей.
Иммерсия в оазис DI Spring
С Spring использование оператора new
не ведет к потере возможностей DI. AutowireCapableBeanFactory
способен обеспечить внедрение зависимостей DI даже в объекты, созданные вручную.
[AsideBanner]
Усиление с помощью @Configurable
Вы можете использовать аннотацию @Configurable
, чтобы обеспечить классу использование Spring DI:
@Configurable(preConstruction = true)
public class MyDIStarvedClass {
@Autowired
private MyHardWorkingService contributingService;
// Класс получает все необходимые инъекции с помощью Spring.
}
Не забывайте активировать load-time weaving через @EnableSpringConfigurable
.
Обход статических трудностей
Статические вспомогательные методы позволяют получить доступ к бинам Spring даже вне контекста его управления:
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 как установку реактивных двигателей на личный глайдер:
🛩️ <: Ваш глайдер 🛩️🚀 <: Глайдер, оборудованный реактивными двигателями Spring
Внедрение зависимостей работает аналогичным образом:
@Autowire RocketBoosters boosters; // Реактивная тяга для вашего глайдера!
Как ваши условия изменятся:
Было: 🛩️ + 🚶♂️🔄 (Вы поддерживаете полёт)
Стало: 🛩️🚀 + ☕ (Вы отдыхаете с кофе, пока глайдер сам движется вперед)
Это не магия, это @Autowire в Spring.
Инициализация бинов по требованию
Всё упирается в способность использования Spring для инициализации экземпляров классов, созданных через new
, предоставляя им преимущества режима DI Spring.
Мастерство использования autowire
Расширив свои возможности до AutowireCapableBeanFactory, вы можете получить статус ApplicationContextAware
и использовать предоставляемый ApplicationContext
:
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
и добавите
<context:spring-configured/>
в XML-контексте приложения или @EnableSpringConfigurable
в конфигурации на Java, это позволит Spring осуществлять полный контроль над бинами.
Полезные материалы
- Официальная документация Spring по внедрению зависимостей — основной источник для понимания концепции dependency injection в Spring.
- AnnotationConfigApplicationContext (Spring Framework 6.1.3 API) — детальная информация о активации бинов с помощью AnnotationConfigApplicationContext.
- BeanFactory (Spring Framework 6.1.3 API) — разъяснения создания бинов через Spring BeanFactory.
- AspectJ в Spring для внедрения зависимостей — сведения о расширении возможностей DI с помощью AspectJ в приложениях Spring.
- Spring @Configurable для внедрения бинов в POJO — принципы использования @Configurable для внедрения зависимостей в неконтролируемые объекты.
- Look-up method injection в Spring — методы для внедрения прототипов в синглтоны в Spring.