Java 在Micronaut中是否有适当的方法使用@PostConstruct?

Java 在Micronaut中是否有适当的方法使用@PostConstruct?,java,micronaut,Java,Micronaut,我试图在应用程序启动后用@PostConstruct打印消息,但没有打印任何内容 package dev.renansouza.server; import javax.annotation.PostConstruct; import javax.inject.Singleton; @Singleton public class ServerService { @PostConstruct public void print() { System.out.p

我试图在应用程序启动后用
@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
是懒惰的。这是否意味着我需要这样做 还有什么其他方法可以实现此功能?

请参阅上的项目

启动应用程序时,您不会看到打印到standard out的消息,因为服务bean尚未初始化。向发送请求,然后您将看到消息打印到stdout


我希望这会有所帮助。

如果使用@PostConstruct对您来说并不重要,那么您也可以使用@EventListener注释来实现您想要的

例如,在您的例子中,您可以在任何类中添加以下代码来侦听应用程序启动事件

@EventListener
void onStartup(ServerStartupEvent event) {
    println("Hey, I work from anywhere in project..")
}
上面共享的代码在Groovy中

请记住,在主应用程序类中添加的事件侦听器通常是根据我观察到的情况首先调用的。

正如您已经提到的,问题(aka特性)是延迟加载

我看到两种解决办法:


  • 您必须做一些事情来初始化这个bean

  • 将bean的范围从
    @Singleton
    更改为
    @Context

  • Micronaut有一些内置作用域(请参阅)和
    @Context
    状态的文档(请参阅)

    上下文范围表示类的生命周期绑定到BeanContext的生命周期,并且应该在基础BeanContext的启动和关闭期间对其进行初始化和关闭

    默认情况下,Micronaut将所有单例bean定义视为惰性的,并且只在需要时加载它们。通过使用@Context注释bean,可以确保bean与上下文同时加载


    您必须做一些事情来初始化这个bean。例如,将该服务注入控制器,然后向该控制器发送请求。在不知道他想要做什么的情况下,您如何知道
    @PostConstruct
    不是正确的做法?使用
    @PostConstruct
    有完全有效的用例。这并不意味着我们不能分享解决这个问题的不同方法。Renan明确表示,他正试图在应用程序启动时打印一条消息,我回答了这一部分。另外,我同意我应该从不同的句子开始。我认为信息打印不是实际的要求,而是帮助证明观察到的行为的一种方式。
    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;
        }
    }
    
    @EventListener
    void onStartup(ServerStartupEvent event) {
        println("Hey, I work from anywhere in project..")
    }
    
    package dev.renansouza.server;
    
    import javax.annotation.PostConstruct;
    import io.micronaut.context.annotation.Context;
    
    @Context 
    public class ServerService {
    
        @PostConstruct
        public void print() {
            System.out.println("Hello!");
        }
    }