lev*_*ied 8 java spring spring-java-config
假设我在 Spring 中有这个依赖项@Configuration:
@Bean
public SomeClass someClass(SomeClass1 someClass1, SomeClass2 someClass2, ...) {
return new SomeClass(someClass1, someClass2, ...);
}
Run Code Online (Sandbox Code Playgroud)
说我想做一些@PostConstruct包括someClass依赖的事情:
@PostConstruct
public void init() {
someClass.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
这不能注入:
@PostConstruct
public void init(SomeClass someClass) {
someClass.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
原因:
Caused by: java.lang.IllegalStateException: Lifecycle method annotation requires a no-arg method: ...
Run Code Online (Sandbox Code Playgroud)
这不能像这样在同一个配置中自动装配:
@Autowire
private SomeClass someClass;
@Bean
public SomeClass someClass(SomeClass1 someClass1, SomeClass2 someClass2, ...) {
return new SomeClass(someClass1, someClass2, ...);
}
Run Code Online (Sandbox Code Playgroud)
因为这会导致:
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?
Run Code Online (Sandbox Code Playgroud)
一个配置可以被拆分(所以@Bean转到另一个配置)@Import并由这个配置 - ed,它可以正常工作。可能存在其他解决方案 - 例如创建一个单独的初始化 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;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 0
试试这个方法:
public class ConfigPostConstructDependenciesPrb {
public static void main(String[] args) {
try {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(BaseConfig.class);
ctx.registerShutdownHook();
ctx.getBean(Service.class);
ctx.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@Configuration
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() {
this.service.work();
}
}
class Dependency {
private int num;
public Dependency() {
}
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();
}
}
class Service {
private Dependency dependency;
public Service() {
}
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11439 次 |
| 最近记录: |