我正在尝试使用@PostConstruct
启动应用程序后打印一条消息,但是什么也没打印。
package dev.renansouza.server;
import javax.annotation.PostConstruct;
import javax.inject.Singleton;
@Singleton
public class ServerService {
@PostConstruct
public void print() {
System.out.println("Hello!");
}
}
我已经读到@PostConstruct
很懒。这是否意味着我需要做
还有其他东西可以工作吗?
答案 0 :(得分:2)
查看位于https://github.com/jeffbrown/renansouzapostconstruct的项目。
package renansouzapostconstruct;
import javax.annotation.PostConstruct;
import javax.inject.Singleton;
@Singleton
public class ServerService {
@PostConstruct
public void print() {
System.out.println("Hello!");
}
}
package renansouzapostconstruct;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.HttpStatus;
@Controller("/demo")
public class DemoController {
private ServerService serverService;
public DemoController(ServerService serverService) {
this.serverService = serverService;
}
@Get("/")
public HttpStatus index() {
return HttpStatus.OK;
}
}
启动应用程序时,您将不会看到标准输出的消息,因为服务bean尚未初始化。向http://localhost:8080/demo/发送请求,然后您将看到打印到标准输出的消息。
我希望有帮助。
答案 1 :(得分:2)
如果使用@PostConstruct对您并不重要,您还可以使用@EventListener批注来实现您的目标。
例如,您可以在任何类中添加以下代码来侦听应用程序启动事件。
@EventListener
void onStartup(ServerStartupEvent event) {
println("Hey, I work from anywhere in project..")
}
上面共享的代码在Groovy中
请记住,从我观察到的情况来看,通常首先调用主应用程序类中添加的事件侦听器。
答案 2 :(得分:0)
问题(又名功能)是您已经提到的延迟加载。
我看到两种解决方案:
您必须执行一些操作以使该bean初始化。
将Bean的范围从@Singleton
更改为@Context
@Context
状态的Micronaut文档(请参见https://docs.micronaut.io/latest/api/io/micronaut/context/annotation/Context.html)
Context范围指示类的生命周期与BeanContext的生命周期绑定在一起,并且应该在基础BeanContext的启动和关闭期间初始化和关闭类。
默认情况下,Micronaut将所有Singleton bean定义视为惰性,并且仅在需要时加载它们。通过使用@Context注释Bean,可以确保Bean与上下文同时加载。
package dev.renansouza.server;
import javax.annotation.PostConstruct;
import javax.inject.Scope;
@Scope
public class ServerService {
@PostConstruct
public void print() {
System.out.println("Hello!");
}
}