Скажем, у меня есть эта зависимость в Spring @Configuration
:
@Bean
public SomeClass someClass(SomeClass1 someClass1, SomeClass2 someClass2, ...) {
return new SomeClass(someClass1, someClass2, ...);
}
Скажем, я хочу сделать что-то в @PostConstruct
, которое включает зависимость someClass
:
@PostConstruct
public void init() {
someClass.doSomething();
}
Это не может быть введено:
@PostConstruct
public void init(SomeClass someClass) {
someClass.doSomething();
}
причины:
Caused by: java.lang.IllegalStateException: Lifecycle method annotation requires a no-arg method: ...
Это не может быть автоматически подключено в той же конфигурации, например:
@Autowire
private SomeClass someClass;
@Bean
public SomeClass someClass(SomeClass1 someClass1, SomeClass2 someClass2, ...) {
return new SomeClass(someClass1, someClass2, ...);
}
так как это приводит к:
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'globalBus': Requested bean is currently in creation: Is there an unresolvable circular reference?
Конфиг можно разделить (так что @Bean
переходит к другому конфигу) и @Import
отредактировать этим, и он работает нормально. Вероятно, существуют и другие растворы - например. создание отдельного bean-компонента инициализации или около того.
Есть ли способ сделать это в пределах одного @Configuration
?
Изменить
По запросу @SotiriosDelimanolis, sscce для исключения при использовании @Autowired
:
public class ConfigPostConstructDependenciesPrb {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
ctx.getBean(Service.class);
ctx.close();
}
public static class Service {
private final Dependency dependency;
public Service(Dependency dependency) {
this.dependency = dependency;
}
public void work() {
System.out.println(dependency.getNum());
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Service [dependency=");
sb.append(dependency);
sb.append("]");
return sb.toString();
}
}
public static class Dependency {
private final int num;
public Dependency(int num) {
this.num = num;
}
public int getNum() {
return this.num;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("SomeClass1 [num=");
sb.append(num);
sb.append("]");
return sb.toString();
}
}
@Configuration
public static class BaseConfig {
@Autowired
private Service service;
@Bean
public Dependency dependency() {
return new Dependency(42);
}
@Bean
public Service service(Dependency dependency) {
return new Service(dependency);
}
@PostConstruct
public void init() {
service.work();
}
}
@Configuration
@Import(BaseConfig.class)
public static class Config {
@Autowired
private Service service;
}
}
Inject
этого? - person user489041   schedule 25.06.2015SomeClass
внутренним классом? - person Thunderforge   schedule 25.06.2015@PostConstruct
в классе@Configuration
? Что это за способ установки? - person Sotirios Delimanolis   schedule 25.06.2015@Autowired
должно работать. Поскольку это не так, вам мешают другие вещи. Просьба уточнить. - person Sotirios Delimanolis   schedule 25.06.2015