Микронавт - Что такое эквивалент Springframework @Bean? - PullRequest
0 голосов
/ 02 мая 2020

Я очень новичок в Micronauts, и у меня достаточно опыта разработки приложений для весенней загрузки. На этом фоне я наткнулся на создание пользовательских bean-компонентов, например, как я использовал для создания аннотаций @Bean в приложениях Spring. В моем случае у меня есть библиотека, которая предоставляет интерфейс и его класс реализации. Я хотел использовать интерфейс в своем коде и попытаться внедрить реализацию, и она перестала работать с ошибкой ниже

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 внедрить его везде в нашем приложении. Есть ли на Микронавтах эквивалент, которого мне не хватает? Я просмотрел руководство по https://docs.micronaut.io/2.0.0.M3/guide/index.html и не смог ничего получить, чтобы это заработало.

Может кто-нибудь подсказать, как я могу использовать @Inject для внедрения пользовательских bean-компонентов?

Просто, если вы хотите это увидеть, вот приложение на Github. https://github.com/reflexdemon/saml-metadata-viewer

1 Ответ

0 голосов
/ 02 мая 2020

С помощью Deadpool и небольшим чтением я получил то, что искал. Решением было создание @BeanFactory

См. Javado c здесь: https://docs.micronaut.io/latest/guide/ioc.html#builtInScopes

Аннотация @Prototype является синонимом @Bean потому что областью по умолчанию является прототип.

Таким образом, вот пример, который будет соответствовать поведению среды 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();
    }
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...