Допустим, у нас есть класс:
public class MyClass {
@Autowired private AnotherBean anotherBean;
}
Затем мы создали объект этого класса (или какой-то другой фреймворк создал экземпляр этого класса).
MyClass obj = new MyClass();
Можно ли по-прежнему внедрять зависимости? Что-то вроде:
applicationContext.injectDependencies(obj);
(Думаю, у Google Guice есть что-то вроде этого)
java
spring
dependency-injection
Игорь Мухин
источник
источник
code
частный компонент @Autowired AnotherBean; public void doStuff () {MyBean obj = новый MyBean (bean); }code
. Похоже, что со всеми этими аннотациями люди действительно сбиваются с толку и просто не используют базовый шаблон, который был в java SDK с первого дня. :(Вы также можете пометить свой MyClass аннотацией @Configurable:
Затем во время создания он автоматически внедрит свои зависимости. У вас также должен быть
<context:spring-configured/>
в контексте вашего приложения xml.источник
<context:spring-configured/>
?Просто возникла такая же потребность, и в моем случае это уже была логика внутри управляемого java-класса, отличного от Spring, к которому был доступ
ApplicationContext
. В стиле эшафот. Решено:источник
Я хотел поделиться своим решением, которое следует
@Configurable
подходу,briefly
упомянутому в ответе @ glaz666, потому чтоМоя установка
Spring Neo4j & Aop starts
(что в любом случае не имеет значения)Spring Boot
будет готов, используя@Configurable
подход (usingApplicationRunner
)меры
Мне нужно было выполнить следующие шаги, чтобы заставить его работать
@Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false)
должен быть помещен поверх вашего,Bean
который должен быть создан вручную. В моем случаеBean
экземпляр, который должен быть создан вручную, имеет@Autowired
службы, следовательно, реквизиты для указанной выше аннотации.XXXApplicaiton.java
(или файл, помеченный@SpringBootApplication
) с помощью@EnableSpringConfigured
и@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
compile('org.springframework.boot:spring-boot-starter-aop')
иcompile('org.springframework:spring-aspects:5.0.7.RELEASE')
Bean
который аннотирован@Configurable
где угодно, и его зависимости должны быть автоматически подключены.* Что касается пункта 3 выше, я знаю, что
org.springframework.boot:spring-boot-starter-aop
транзитивно тянетspring-aop
(как показано здесь mavencentral ), но в моем случае Eclipse не смог разрешить@EnableSpringConfigured
аннотации, поэтому я явно добавилspring-aop
зависимость в дополнение к стартеру. Если вы столкнетесь с той же проблемой, просто объявите о зависимости или отправляйтесь на поиски решенияorg.springframework.context.annotation.aspect.*
недоступенисточник