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 注入而设计的,那么您就不会使用工厂来创建它。
直接在包含@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 注入而设计的,那么您就不会使用工厂来创建它。