Spring Boot: возможно ли использовать инъекцию зависимостей, если корневой класс должен быть создан экземпляром & ldquo; new () & rdquo; конструктор? [Дубликат]

, наконец, я разобрался, поставив

abi { enable false reset() include 'x86', 'armeabi-v7a' universalApk true }

и multiDexEnabled true , но я не знаю, устранила ли эта проблема или просто проигнорировала ошибку

102
задан Igor Mukhin 28 September 2010 в 15:04
поделиться

5 ответов

Вы можете сделать это, используя метод autowireBean() в AutowireCapableBeanFactory. Вы передаете ему произвольный объект, а Spring будет обрабатывать его, как то, что он сам создал, и будет применять различные куски и куски автоувеличивания.

Чтобы получить доступ к AutowireCapableBeanFactory, просто используйте autwire, что:

private @Autowired AutowireCapableBeanFactory beanFactory;

public void doStuff() {
   MyBean obj = new MyBean();
   beanFactory.autowireBean(obj);
   // obj will now have its dependencies autowired.
}
151
ответ дан skaffman 5 September 2018 в 09:19
поделиться

Вы также можете пометить свой MyClass @Configurable аннотацией:

@Configurable
public class MyClass {
   @Autowired private AnotherClass instance
}

Затем во время создания он автоматически вводит свои зависимости. Вы также должны иметь <context:spring-configured/> в вашем контексте приложения xml.

17
ответ дан glaz666 5 September 2018 в 09:19
поделиться

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

Реальный вопрос: зачем вы создаете экземпляры класса, которые вы хотите использовать вложенные вручную, а не позволяете Spring управлять им? ? Почему класс, использующий MyClass, не вставляет MyClass в него?

-5
ответ дан matt b 5 September 2018 в 09:19
поделиться

Я хотел поделиться своим решением, которое следует за подходом @Configurable как briefly, упомянутым в @ glaz666 answer , потому что

  • Ответ by @skaffman почти 10 лет, и это не значит, что он недостаточно хорош или не работает
  • Ответ от @ glaz666 краток и на самом деле не помог мне решить мою проблему, но, наведите меня в правильном направлении

Моя настройка

  1. Spring Boot 2.0.3 с Spring Neo4j & Aop starts (что в любом случае не имеет значения)
  2. Создавать экземпляр компонента, когда Spring Boot готов с использованием подхода @Configurable (с использованием ApplicationRunner)
  3. Gradle & amp; Eclipse

Шаги

Мне нужно было выполнить следующие шаги, чтобы заставить его работать

  1. @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false) поверх вашего Bean, который должен быть создан вручную. В моем случае Bean, который должен быть создан вручную, имеют @Autowired сервисы, следовательно, реквизиты выше аннотации.
  2. Аннотировать основную XXXApplicaiton.java Spring Boot (или файл, аннотированный с помощью @SpringBootApplication) с помощью @EnableSpringConfigured и @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
  3. Добавить зависимости в файле сборки (т. е. build.gradle или pom.xml в зависимости от того, какой из них вы используете) compile('org.springframework.boot:spring-boot-starter-aop') и compile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. Новый + ваш Bean, который аннотируется с помощью @Configurable где угодно и его зависимости, должен быть autowired.

* Что касается точки № 3 выше, я знаю, что org.springframework.boot:spring-boot-starter-aop транзитивно тянет spring-aop (как показано здесь mavencentral ), но в в моем случае Eclipse не удалось разрешить аннотации @EnableSpringConfigured, поэтому я явно добавил зависимость spring-aop в дополнение к стартеру. Если вы сталкиваетесь с той же проблемой, просто объявляйте зависимость или отправляйтесь в приключение по выяснению

  • Есть ли конфликт версий
  • Почему org.springframework.context.annotation.aspect.* недоступен
  • Правильно ли установлена ​​ваша IDE
  • и т. д.
1
ответ дан Raf 5 September 2018 в 09:19
поделиться

Просто получил такую ​​же потребность, и в моем случае это уже была логика внутри нестандартного класса java, который имел доступ к ApplicationContext. Вдохновленный скиффом. Решено:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(manuallyCreatedInstance);
2
ответ дан rand0m86 5 September 2018 в 09:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: