Как внедрить зависимости в самовоспроизводящийся объект весной?
допустим, у нас есть класс:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
затем мы создали объект этого класса (или какой-то другой фреймворк создал экземпляр этого класса).
MyClass obj = new MyClass();
можно ли по-прежнему вводить зависимости? Что-то вроде:
applicationContext.injectDependencies(obj);
(Я думаю, что Google Guice имеет что-то вроде этого)
5 ответов:
вы можете сделать это с помощью
autowireBean()методAutowireCapableBeanFactory. Вы передаете ему произвольный объект, и Spring будет относиться к нему как к чему-то, что он создал сам, и будет применять различные биты и куски автопроводки.забрать
AutowireCapableBeanFactory, просто autowire, что:private @Autowired AutowireCapableBeanFactory beanFactory; public void doStuff() { MyBean obj = new MyBean(); beanFactory.autowireBean(obj); // obj will now have its dependencies autowired. }
вы также можете отметить свой MyClass с помощью @ настраиваемой аннотации:
@Configurable public class MyClass { @Autowired private AnotherClass instance }затем во время создания он будет автоматически вводить свои зависимости. Вы также должны иметь
<context:spring-configured/>в контексте вашего приложения xml.
просто получил ту же потребность, и в моем случае это была уже логика внутри не Spring управляемого класса java, который имел доступ к
ApplicationContext. Вдохновленный scaffman. Решается путем:AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); factory.autowireBean(manuallyCreatedInstance);
я хотел поделиться своим решением, которое следует за
@Configurableподходbrieflyупоминается в @glaz666 ответ, потому что
- The ответ по @skaffman почти 10 лет, и это не значит, что недостаточно хорошо или не работает
- ответ @glaz666 краток и на самом деле не помог мне решить мою проблему, но указал мне в правильном направлении
мой настройка
- Spring Boot 2.0.3 с
Spring Neo4j & Aop starts(который в любом случае не имеет значения)- создать экземпляр Боба, когда
Spring Bootготово, используя@Configurableподход (с помощьюApplicationRunner)- Ш & Затмение
шаги
мне нужно было выполнить следующие шаги, чтобы заставить его работать
- The
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)чтобы быть размещены на верхней части вашегоBeanэто должно быть создано вручную. В моем случаеBeanэто быть создан вручную@Autowiredуслуги, следовательно, реквизит выше аннотации.- аннотировать основной пружинный ботинок
XXXApplicaiton.java(или файл с аннотацией@SpringBootApplication) С@EnableSpringConfiguredи@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)- добавьте зависимости в файл сборки (т. е. построить.Gradle или пом.xml в зависимости от того, какой из них вы используете)
compile('org.springframework.boot:spring-boot-starter-aop')иcompile('org.springframework:spring-aspects:5.0.7.RELEASE')- New + up your
Beanэто аннотируется с@Configurableвезде и его зависимости должны быть автоматически подключены.*в отношении пункта #3 выше, я знаю, что
org.springframework.boot:spring-boot-starter-aopтранзитивно тянетspring-aop(как показано здесь mavencentral), но, в моем случае затмение не удалось решить@EnableSpringConfiguredаннотации следовательно, почему я явно добавилspring-aopзависимостей в дополнение к стартеру. Если вы столкнулись с той же проблемой, просто объявите зависимость или продолжите приключение выяснения
- есть ли версия конфликта
- почему
org.springframework.context.annotation.aspect.*недоступен- правильно ли настроена ваша IDE
- и т. д. и т. п.
не без некоторых обходных путей, так как весна ничего не знает об этом экземпляре.
реальный вопрос: почему вы создаете экземпляры класса, в который вы хотите вводить зависимости вручную, а не позволяете Spring управлять им? Почему класс не использует
MyClassначалоMyClassвводят в него?
Comments