Micronaut 未增强工厂定义的 bean

Factory defined bean is not enhanced by Micronaut

直接在包含@PostConstruct 和@Transactional 的服务class 上应用@Singleton 按预期工作- @PostConstruct 被调用并且事务方法工作得很好。

@Singleton
public class MyService {

    @PostConstruct
    public void init() {
       LOG.info("PostConstruct called")
    }

    @Transactional
    public void doSomethingInTransaction() {

    }

}

像下面这样将 bean 定义移动到 @Factory 中仍然有效,MyService 单例仍然创建但没有得到增强 - @PostConstruct 未被调用并且事务方法将不起作用(无法获得事务同步会话当前线程)

public class MyService {

    @PostConstruct
    public void init() {
       LOG.info("PostConstruct called")
    }

    @Transactional
    public void doSomethingInTransaction() {

    }

}

@Factory
public class ApplicationConfig {

    @Singleton
    public MyService myService() {
        return new MyService();
    }

}

与 Spring 相比,这是 Micronaut 的预期行为吗? 有什么方法可以指示 Micronaut 处理外部 Java 配置中定义的 bean 与它们自己的 class?

中定义的配置相同

注意:我注意到,如果我像下面这样添加 @TransactionalAdvice,Micronaut 将应用事务管理(尽管在 java 文档中声明不应直接使用它)——但 @PostConstruct 仍然不会没用。

@Factory
public class ApplicationConfig {

    @Singleton
    @TransactionalAdvice
    public MyService myService() {
        return new MyService();
    }

}

该行为是预期的。

您可以在创建实例后手动执行init方法

我们不会分析工厂返回的 classes 除了工厂方法上的注释之外,因为您应该只为您无法控制的 classes 使用工厂(即在第三方罐子里)。在那种情况下,不应期望这些注释存在,因为如果 class 是为通过 DI 注入而设计的,那么您就不会使用工厂来创建它。