webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Frühlingsbohne @Autowire, die aus einem externen Glas erstellt wurde?

Ich habe ein Modul/Jar, das ich erstellt habe und als util library verwende. Ich habe dort einen Dienst so erstellt:

@Service
public class PermissionsService { ... }

... wo sich das hier in einem Paket befindet: com.inin.architect.permissions und in meiner Hauptanwendung referenziere/lade ich diese jar (dh als Abhängigkeit in der Maven-Datei POM.xml für die app) wie so:

<dependency>
        <groupId>com.inin.architect</groupId>
        <artifactId>permissions</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

und innerhalb der Anwendung möchte ich diesen Dienst wie folgt verwenden:

@Autowired
PermissionsService permissions

Im Frühling-Setup der Anwendung habe ich Folgendes:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })
public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }

Wenn ich jedoch meine Anwendung unter Tomcat ausführe, beklagt es sich, dass es keine Bean für den PermissionsService : "org.springframework.beans.factory.NoSuchBeanDefinitionException: Keine qualifizierende Bean vom Typ ..."

Wie kann ich also die Bean aus der lib in meine Anwendung übernehmen? Sicher gibt es einen Weg. Müssen Sie die Library als vollwertige MVC-Spring-Anwendung einrichten, damit dies funktioniert? Dh müssen Sie @Configuration und @ComponentScan auch in der lib einrichten?

27
BrianP

Sie müssen mindestens das Paket mit der Klasse scannen, die Sie injizieren möchten. Zum Beispiel mit der Anmerkung zu Spring 4:

@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}

Das gleiche Prinzip gilt für die XML-Konfiguration.

46

Nur eine Anmerkung dazu, aber Sie könnten Ihre Abhängigkeit vom Frühling abkoppeln. In Ihrer @Configuration-Klasse erstellen 

@Bean public PermissionsService  permissionsService(){
   return new PermissionsService()
}

Dies ermöglicht auch die Injektion. Nicht, dass Sie Ihre Federkommentare entfernen müssen, sondern nur eine Option, die sie möglicherweise außerhalb des Frühlings verwendet.

17
Maleck13

Ok - ich hatte genau das gleiche Problem - ich wollte eine Mongo-DB-Repository-Schnittstelle von einem externen Glas autowire.

  • Ich könnte jede Bohne aus diesem Glas mit autowiren

    @SpringBootApplication (scanBasePackages = {"com.myrootpackage"})

  • Das automatische Verdrahten der Schnittstelle schlug jedoch immer mit "Blablabla konnte nicht gefunden werden ..." fehl.

Die Schnittstelle befand sich jedoch im selben Paket wie die Beans, die ich importieren konnte. Es stellte sich heraus, dass bei der Suche nach den Mongo-DB-Schnittstellen NICHT die scanBasePackages aus der @SpringBootApplication berücksichtigt werden!

Es muss explizit über konfiguriert werden

@EnableMongoRepositories(basePackages = {"com.myrootpackage"})

Oder Sie können die Hauptklasse "nach oben" verschieben, damit die Standardsuche auch für die Mongo-Benutzeroberflächen funktioniert. Also habe ich das Problem verstanden und eine Lösung gefunden. Aber ich bin immer noch ein bisschen unglücklich, weil ich denselben Suchpfad zweimal konfigurieren muss. Ich finde es ehrlich dumm.

1
Holgi P

Sie können application-context.xml für com.inin.architect.permissions auf folgende Weise in Ihrer Hauptanwendung importieren.

<import resource="classpath:/permissionApplicationContext.xml" />

Auf diese Weise können Sie Beans von com.inin.architect.permissions , die Sie definiert haben, autowire.

1
s91g