java - Micronaut - Springframework @Bean 等效项是什么?

标签 java spring inversion-of-control micronaut

我对 Micronauts 非常陌生,并且在开发 Spring Boot 应用程序方面有相当多的经验。有了这个背景,我偶然发现了创建自定义 bean,就像我过去在 Spring 应用程序上使用 @Bean 注释进行创建一样。 就我而言,我有一个提供接口(interface)及其实现类的库。我想在代码中使用该接口(interface)并尝试注入(inject)实现,但失败并出现以下错误

Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [io.vpv.saml.metadata.service.MetaDataParser] exists for the given qualifier: @Named('MetaDataParserImpl'). Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).

这是我的代码

@Singleton
public class ParseMetadataImpl implements ParseMetadata {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Inject
    @Named("MetaDataParserImpl")
    private MetaDataParser metaDataParser;

    @Override
    public IDPMetaData getIDPMetaData(URL url) throws IOException {
        logger.info("Parsing {}", url);
        logger.info("metaDataParser {}", metaDataParser);
        return metaDataParser.parseIDPMetaData(url);
    }
}

我确信我做错了什么,需要了解该怎么做。我通过添加以下代码并删除 metaDataParser 周围的注释来完成此工作。

    @PostConstruct
    public void initialize() {
        //Want to Avoid This stuff
        this.metaDataParser = new MetaDataParserImpl();
    }

使用Spring Boot,可以添加@Bean注释来创建一些自定义bean,我们可以使用@Autowired将其注入(inject)到应用程序的任何位置。 Micronauts 上是否有我缺少的同等内容。我浏览了 https://docs.micronaut.io/2.0.0.M3/guide/index.html 上的指南并且无法获得任何东西来使其正常工作。

有人可以建议我如何使用@Inject来注入(inject)自定义bean吗?

以防万一您想查看此内容,这里是 Github 上的应用程序。 https://github.com/reflexdemon/saml-metadata-viewer

最佳答案

Deadpool的帮助下并进行了一些阅读,我得到了我想要的东西。解决方案是创建 @BeanFactory

请参阅此处的 Javadoc:https://docs.micronaut.io/latest/guide/ioc.html#builtInScopes

The @Prototype annotation is a synonym for @Bean because the default scope is prototype.

因此,这是一个与 Spring 框架的行为相匹配的示例

对于任何也在寻找此类东西的人来说,这里都是答案。

import io.micronaut.context.annotation.Factory;
import io.vpv.saml.metadata.service.MetaDataParser;
import io.vpv.saml.metadata.service.MetaDataParserImpl;

import javax.inject.Singleton;

@Factory
public class BeanFactory {
    @Singleton
    public MetaDataParser getMetaDataParser() {
        return new MetaDataParserImpl();
    }
}


关于java - Micronaut - Springframework @Bean 等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61560105/

相关文章:

java - 如何编写具有泛型类类型的 java 方法?

java - 重新部署带有 cargo 的远程 glassfish 失败

java - Spring boot JPA Hibernate 返回嵌套的 Json 对象 : Reddit style comment system

java - 了解 Guice 从哑数据对象创建对象

java - 具有弱键和身份哈希的 ConcurrentHashMap?

java - 如何获取在 servlet 过滤器的静态 block 内启动的静态类的实例?

java - http 出站网关 URL 中的路径参数

java - (Spring) 我可以在循环内使用依赖注入(inject)吗?

c# - 对 DI、IoC、Unity 和 Moq 的类型注册和实现感到困惑

c# - 什么是 CaSTLe Windsor,我为什么要关心它?