有没有在Micronaut中使用@PostConstruct的正确方法?

时间:2019-04-04 02:16:29

标签: 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.println("Hello!");
    }
}

我已经读到@PostConstruct很懒。这是否意味着我需要做 还有其他东西可以工作吗?

3 个答案:

答案 0 :(得分:2)

查看位于https://github.com/jeffbrown/renansouzapostconstruct的项目。

https://github.com/jeffbrown/renansouzapostconstruct/blob/master/src/main/java/renansouzapostconstruct/ServerService.java

package renansouzapostconstruct;

import javax.annotation.PostConstruct;
import javax.inject.Singleton;

@Singleton
public class ServerService {

    @PostConstruct
    public void print() {
        System.out.println("Hello!");
    }
}

https://github.com/jeffbrown/renansouzapostconstruct/blob/master/src/main/java/renansouzapostconstruct/DemoController.java

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)

问题(又名功能)是您已经提到的延迟加载。

我看到两种解决方案:

  1. 您必须执行一些操作以使该bean初始化。

  2. 将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!");
    }
}