我有以下课程:
@Configuration
public class EndpointStatus {
private static final Logger serverLogger = LogManager.getLogger(EndpointStatus.class);
private Long id;
private volatile Status status;
@OneToOne
private volatile CurrentJob currentJob;
public enum Status {
AVAILABLE,
BUSY
}
@Bean
@Primary
public EndpointStatus getEndpointStatus() {
serverLogger.info("STATUS CREATED");
return new EndpointStatus();
}
public EndpointStatus() {
}
public CurrentJob getCurrentJob() {
return currentJob;
}
public void setCurrentJob(CurrentJob currentJob) {
this.currentJob = currentJob;
}
public Status getStatus() {
return status;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void setStatus(Status status) {
this.status = status;
}
public boolean isBusy() {
return getStatus() == Status.BUSY;
}
Bean用于使用@Component注释的端点
然后我尝试在端点中获取bean
ApplicationContext ctx = new AnnotationConfigApplicationContext(EndpointStatus.class);
EndpointStatus sc = ctx.getBean(EndpointStatus.class);
EndpointStatus
在其他任何地方都没有使用过。
据我所知,没有理由创建第二个bean ...
但是在创业时我总是得到
INFO 6169 [main] c.e.k.d.r.m.i.EndpointStatus : STATUS CREATED
INFO 6169 [main] c.e.k.d.r.m.i.EndpointStatus : STATUS CREATED
我在这做错了什么?
编辑:
尝试过的每一个答案都无济于事......
我的课现在看起来像这样
@Configuration
public class EndpointStatusConfig {
private static final Logger serverLogger = LogManager.getLogger(JavaXRest.class);
private Long id;
private volatile Status status = EndpointStatusConfig.Status.AVAILABLE;
@OneToOne
private volatile CurrentJob currentJob;
public enum Status {
AVAILABLE,
BUSY
}
@Bean
@Primary
public EndpointStatusConfig getEndpointStatus() {
serverLogger.info("STATUS CREATED");
return new EndpointStatusConfig();
}
public CurrentJob getCurrentJob() {
return currentJob;
}
public void setCurrentJob(CurrentJob currentJob) {
this.currentJob = currentJob;
}
public Status getStatus() {
return status;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void setStatus(Status status) {
this.status = status;
}
public boolean isBusy() {
return getStatus() == Status.BUSY;
}
}
无论是@Component还是@Configuration,在端点调用sc都会导致数百个bean被创建崩溃应用程序...
EDIT2:这变得越来越糟......现在甚至打电话给
if ( sc.isBusy() ) { return Response.ok( sc.getCurrentJob() ).type(MediaType.APPLICATION_JSON).build(); }
将跳转到@Bean并在应用程序崩溃之前创建尽可能多的EndpointStatus对象.... @Component在启动时创建一个,然后创建数千个。 @Configuration将在启动时创建2,然后成千上万...
只是猜测,但将配置类定义为配置和工厂bean返回类型可能是个问题。
EndpointStatus
是一个配置类,因为类是用@Configuration
声明的,配置类在Spring中生成一个bean,它也是一个显式bean,因为你用getEndpointStatus()
注释了bean工厂方法@Bean
。
这有点像你已经定义了两次bean。
只需将Configuration类的名称从EndpointStatus更改为EndpointStatusConfig,然后只创建一个带有EndpointStatus类的bean。
当您将EndpointStatus注释为@Configuration和@Bean时,它会创建2个Bean。
我认为你的问题是使用@Configuration
而不是@Component
@Configuration
将尝试使用@Autowired
将类中的任何@Bean
或@Configuration
添加到spring上下文中,但不会将它自己添加到spring语境中。
如果要将该类作为bean添加到spring上下文中,则应使用@Component
编辑:
您是否尝试使用@Configuration
自行注入EndpointStatus类?
如果你没有,也不知道春天注射什么,试试这个:
@Autowired
EndpointStatus status;
void yourMethod(){
//Change this
//ApplicationContext ctx = new AnnotationConfigApplicationContext(EndpointStatus.class);
//EndpointStatus sc = ctx.getBean(EndpointStatus.class);
//Use instead the status variable declared before
}