J'utilise jdk8 et j'ai besoin de créer un composant Spring qui prendra le nom de la classe comme argument du constructeur. Cependant, avec mon code actuel, j'obtiens une erreur d'exécution :

Parameter 0 of constructor in com.some.MyLogger required a bean of type 'java.lang.String' that could not be found

Voici ma classe MyLogger :

@Component
public class MyLogger {

    protected  final Log logger;

    public MyLogger(String  clazz) {
        logger = LogFactory.getLog(clazz);
    }

    public void debug(String format, Object... args)
    {
        if (logger.isDebugEnabled())
        {
            logger.debug(String.format(format, args));
        }
    }

    public void info(String msg)
    {
        logger.debug(msg);
    }
}

Et voici comment j'essaie de créer la classe:

@SpringBootApplication
public class Application {

    public static void main(String[] args) throws MalformedURLException {
        ApplicationContext context = SpringApplication.run(Application.class, args);
        MyLogger logger = (MyLogger) context.getBean(MyLogger.class, Application.class.getCanonicalName());
        logger.info("================ I AM HERE ====================");
}

Puis-je avoir un aperçu de la bonne façon de créer ce composant / Qu'est-ce qui ne va pas ici ? Merci d'avance.

-1
VictorGram 6 nov. 2020 à 20:36

1 réponse

Meilleure réponse

Les composants sont par défaut singleton, donc Spring essaie de créer l'instance singleton, mais il ne peut pas comprendre ce qu'il faut spécifier comme paramètre.

Étant donné que ce composant n'est pas destiné à être utilisé en tant que singleton, vous devez modifier la portée en prototype.

@Component
@Scope("prototype")
public class DuoLogger {

Voir la Documentation Spring Framework< /a>, section 1.5. Bean Scopes, pour plus d'informations sur les scopes.

3
Andreas 6 nov. 2020 à 17:42