webentwicklung-frage-antwort-db.com.de

So erhalten Sie Bean mit dem Anwendungskontext im Spring Boot

Ich entwickle ein SpringBoot-Projekt und möchte die Bean mit applicationContext nach ihrem Namen benennen. Ich habe viele Lösungen aus dem Web ausprobiert, konnte aber keinen Erfolg haben. Meine Anforderung ist, dass ich einen Controller habe

ControllerA

und innerhalb des Controllers habe ich eine Methode getBean(String className). Ich möchte eine Instanz einer registrierten Bohne erhalten. Ich habe Entitäten im Ruhezustand und möchte eine Instanz der Bean erhalten, indem der Name der Klasse nur in der getBean -Methode übergeben wird.

Bitte helfen Sie, wenn jemand die Lösung kennt.

33
Qasim

Sie können den ApplicationContext entweder als Feld automatisch verdrahten

@Autowired
private ApplicationContext context;

oder eine Methode

@Autowired
public void context(ApplicationContext context) { this.context = context; }

Schließlich verwenden

context.getBean(SomeClass.class)
53
reos

Sie können ApplicationContextAware verwenden.

ApplicationContextAware:

Schnittstelle, die von jedem Objekt implementiert werden soll, das über den ApplicationContext informiert werden soll, in dem es ausgeführt wird. Die Implementierung dieser Schnittstelle ist beispielsweise dann sinnvoll, wenn ein Objekt Zugriff auf eine Gruppe von Beans benötigt, die zusammenarbeiten.

Es gibt einige Methoden, um einen Verweis auf den Anwendungskontext zu erhalten. Sie können ApplicationContextAware wie im folgenden Beispiel implementieren:

package hello;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

@Component
public class ApplicationContextProvider implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    } 

 public ApplicationContext getContext() {
        return applicationContext;
    }

}

pdate:

Wenn Spring instanziiert Beans, sucht es nach ApplicationContextAware Implementierungen. Wenn sie gefunden werden, werden die setApplicationContext () -Methoden aufgerufen.

Auf diese Weise setzt Spring current applicationcontext.

Code-Snippet aus Spring's source code:

private void invokeAwareInterfaces(Object bean) {
        .....
        .....
 if (bean instanceof ApplicationContextAware) {                
  ((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);
   }
}

Sobald Sie den Verweis auf den Anwendungskontext erhalten haben, rufen Sie die gewünschte Bean mit getBean () ab.

eigentlich möchten Sie das Objekt von der Spring-Engine erhalten, wobei die Engine das Objekt Ihrer gewünschten Klasse bereits beim Starten der Spring-Anwendung verwaltet (Initialisierung der Spring-Engine) eine Referenz.

in einer Serviceklasse

@Autowired
private ApplicationContext context;

SomeClass sc = (SomeClass)context.getBean(SomeClass.class);

jetzt in der referenz des sc hast du das objekt. Hope erklärte es gut. Im Zweifelsfall lassen Sie es mich bitte wissen.

7
Debendra Parida

Wenn Sie in Spring Bean sind (in diesem Fall @Controller Bean) Sie sollten überhaupt keine Spring-Kontextinstanz verwenden. Einfach className automatisch verdrahten.

Übrigens: Vermeiden Sie die Feldinjektion, da dies als schlechte Praxis angesehen wird.

1
luboskrnac

Sie können die ApplicationContextAware-Klasse verwenden, die den Anwendungskontext bereitstellen kann.

public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext ctx = null;

    public static ApplicationContext getApplicationContext() {
        return ctx;
    }

    @Override
    public void setApplicationContext(final ApplicationContext ctx) throws BeansException {
        ApplicationContextProvider.ctx = ctx;
    }

    /**
     * Tries to autowire the specified instance of the class if one of the specified
     * beans which need to be autowired are null.
     *
     * @param classToAutowire        the instance of the class which holds @Autowire
     *                               annotations
     * @param beansToAutowireInClass the beans which have the @Autowire annotation
     *                               in the specified {#classToAutowire}
     */
    public static void autowire(Object classToAutowire, Object... beansToAutowireInClass) {
        for (Object bean : beansToAutowireInClass) {
            if (bean == null) {
                ctx.getAutowireCapableBeanFactory().autowireBean(classToAutowire);
            }
        }
    }

}

Benutz einfach:

org.springframework.beans.factory.BeanFactory # getBean (Java.lang.Class)

Beispiel:

@Component
public class Example {

    @Autowired
    private ApplicationContext context;

    public MyService getMyServiceBean() {
        return context.getBean(MyService.class);
    }

    // your code uses getMyServiceBean()
}
0
Sam