Как внедрить зависимости в самовоспроизводящийся объект весной?



допустим, у нас есть класс:



public class MyClass {
@Autowired private AnotherBean anotherBean;
}


затем мы создали объект этого класса (или какой-то другой фреймворк создал экземпляр этого класса).



MyClass obj = new MyClass();


можно ли по-прежнему вводить зависимости? Что-то вроде:



applicationContext.injectDependencies(obj);


(Я думаю, что Google Guice имеет что-то вроде этого)

654   5  

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 краток и на самом деле не помог мне решить мою проблему, но указал мне в правильном направлении

мой настройка

  1. Spring Boot 2.0.3 с Spring Neo4j & Aop starts (который в любом случае не имеет значения)
  2. создать экземпляр Боба, когда Spring Boot готово, используя @Configurable подход (с помощью ApplicationRunner)
  3. Ш & Затмение

шаги

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

  1. The @Configurable(preConstruction = true, autowire = Autowire.BY_TYPE, dependencyCheck = false) чтобы быть размещены на верхней части вашего Bean это должно быть создано вручную. В моем случае Bean это быть создан вручную @Autowired услуги, следовательно, реквизит выше аннотации.
  2. аннотировать основной пружинный ботинок XXXApplicaiton.java (или файл с аннотацией @SpringBootApplication) С @EnableSpringConfigured и @EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
  3. добавьте зависимости в файл сборки (т. е. построить.Gradle или пом.xml в зависимости от того, какой из них вы используете)compile('org.springframework.boot:spring-boot-starter-aop') и compile('org.springframework:spring-aspects:5.0.7.RELEASE')
  4. 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

    Ничего не найдено.