Wie kann ich automatisch konfigurierte Spring Boot-Beans in XML-Konfigurationsdateien verwenden?

Möchte ich nutzen, einige der Spring-Boot-auto-konfigurierten beans in der XML-Konfigurations-Dateien, aber ich laufen in Ausnahmen und Fehler, wenn ich versuche, dies zu tun.

Zum Beispiel, wenn ich Daten-Bibliotheken auf meine Klasse Weg, Spring Boot wird automatisch zu konfigurieren, eine DataSource Objekt, das kann ich autowire in meine eigene Bohnen und Klassen, etwa so:

@Configuration
@ImportResource("classpath:xmlconfig.xml")
public class Config {

    //This works!!
    @Autowired
    private DataSource dataSource;

    @Bean
    public ClassThatRequiresADataSource() {
        ClassThatRequiresADataSource foo = new ClassThatRequiresADataSource();
        foo.setDataSource(dataSource);
        return foo;
    }
}

Allerdings, wenn ich versuche, das gleiche zu tun in einer XML-Konfiguration-Datei, bekomme ich eine exception. Ich habe bootstrapping die XML-config-Datei Hinzugefügt @ImportResource("classpath:xmlconfig.xml") zu meiner Haupt-configuration-Klasse. Hier ist ein Beispiel von was ich Rede... In xmlconfig.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- THIS DOES NOT WORK! -->
    <bean id="anotherClassThatRequiresADataSource" class="my.package.AnotherClassThatRequiresADataSource">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

Den oben genannten gibt eine Ausnahme bei der Ausführung der Spring-Boot-app, trotz dataSource wird eine gültige, auto-konfigurierten Bean-Namen. Ich habe auch versucht, diese mit der auto-konfiguriert ConnectionFactory (mit ActiveMQ auf den class-path) und EntityManagerFactory mit Hibernate & JPA auf die "class path", und keines dieser Werke.

Im Grunde, was ich Frage, ist: was ist das äquivalent zu autowiring Spring-Boot-auto-konfigurierten beans in einer XML-Konfiguration-Datei?

Hier ist meine main-Spring-Boot-Eintrag Punkt ist nur der standard-Klasse aufgeführt, die in alle docs:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

Bin ich hauptsächlich mit diesem in eine Spring-Integration-Anwendung, in dem sich die Java-Konfiguration wird nicht unterstützt und noch nicht der Kern des Frameworks ist XML-config basiert, aber ich würde gerne mit dem Spring-Boot-auto-konfiguriert DataSource und ConnectionFactory Bohnen in einige der integration Elemente.

EDIT: Die Antwort von @AdilF arbeitet für die dataSource Bohne, aber eine ähnliche Konfiguration funktioniert nicht für die connectionFactory bean. Finden Sie in der folgenden GitHub-Projekt für demo-code, der veranschaulicht dies:

https://github.com/ccampo133/autoconfig-test/tree/master

Wenn jemand herausfinden konnte, wie man richtig Draht der connectionFactory Bohne, würde ich mich sehr freuen.

Hier ist der meiste code zur Veranschaulichung:

Application.java

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Config.java

@Configuration
@ImportResource("classpath:/resources/config.xml")
public class Config { }

FooService.java

@Service
public class FooService {

    final private Logger logger = LoggerFactory.getLogger(FooService.class);

    @Autowired
    private DataSource dataSource;

    @Autowired
    private ConnectionFactory connectionFactory;

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @PostConstruct
    public void init() {
        Assert.notNull(dataSource, "dataSource is null!");
        logger.info("dataSource not null");

        Assert.notNull(connectionFactory, "connectionFactory is null!");
        logger.info("connectionFactory not null");

        Assert.notNull(entityManagerFactory, "entityManagerFactory is null!");
        logger.info("entityManagerFactory is not null");
    }
}

BarService.java

public class BarService {

    final private Logger logger = LoggerFactory.getLogger(BarService.class);

    private DataSource dataSource;

    private ConnectionFactory connectionFactory;

    private EntityManagerFactory entityManagerFactory;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void setConnectionFactory(ConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
    }

    public void setEntityManagerFactory(final EntityManagerFactory entityManagerFactory) {
        this.entityManagerFactory = entityManagerFactory;
    }

    @PostConstruct
    public void init() {
        Assert.notNull(dataSource, "dataSource is null!");
        logger.info("dataSource not null");

        Assert.notNull(connectionFactory, "connectionFactory is null!");
        logger.info("connectionFactory not null");

        Assert.notNull(entityManagerFactory, "entityManagerFactory is null!");
        logger.info("entityManagerFactory is not null");
    }
}

config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="barService" class="app.service.BarService">
        <!-- THIS WORKS! -->
        <property name="dataSource" ref="dataSource"/>

        <!-- THIS DOESN'T WORK! -->
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

</beans>

bauen.gradle

buildscript {
    ext {
        junitVersion = "4.11"
        springBootVersion = "1.1.5.RELEASE"
        springIntegrationVersion = "4.0.3.RELEASE"
        activeMqVersion = "5.7.0"
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}

apply plugin: "java"
apply plugin: "eclipse"
apply plugin: "idea"
apply plugin: "spring-boot"

configurations {
    providedRuntime
}

jar {
    baseName = "autoconfig-test"
    version = "0.0.1-SNAPSHOT"
}

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-milestone/" }
}

dependencies {
    //Spring Boot starters
    compile "org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}"
    compile "org.springframework.boot:spring-boot-starter-integration:${springBootVersion}"
    compile "org.springframework.integration:spring-integration-jms:${springIntegrationVersion}"

    //ActiveMQ
    compile "org.apache.activemq:activemq-core:${activeMqVersion}"

    //Persistence
    runtime "com.h2database:h2"

    //Test
    testCompile "junit:junit:${junitVersion}"
}
Kommentar zu dem Problem
Wo erstellen Sie Ihre Datenquelle? Weder Ihre java-config noch Ihre xml-config ist in der Datenquelle erstellt wird. Kommentarautor: Adil F
Spring Boot erzeugt einen DataSource automatisch, wenn Sie die @EnableAutoConfiguration Funktion. Sie können dann auto-Draht in Ihre JavaConfig Bohnen. Kommentarautor: ccampo
Für den Anfang Application - Klasse haben muss, um die @ - Konfiguration annotation neben dem, was bereits vorhanden ist. Der wesentliche Unterschied zwischen den Java-basierten config und XML ist, dass der Java-one basiert auf der Injektion von Typ in der Erwägung, dass die XML ist auf der Grundlage von Namen. Anstatt ein Config - Klasse, ich empfehle verschieben, was ist es @ - Konfiguration und @ImportResource zu Ihrem Antrag Klasse (oder anders herum, was ist auf Application - Klasse Config - Klasse). Kommentarautor: M. Deinum
Die application-Klasse ist versehen mit @ - Konfiguration. Muss ich haben, dass Links in der post. In jedem Fall, wenn ich alles in der application-Klasse, ich bekomme immer noch das gleiche problem. Der Zweck der @ComponentScan annotation ist so, dass ich nicht haben, um alle meine bean-Definitionen in der main-Klasse, also sollte es nichts ändern. Kommentarautor: ccampo
Alles, was Sie tun müssen ist, löschen Sie die @Configuration @ComponentScan @EnableAutoConfiguration von Application.java - Datei und stellen Sie es auf Config.java. Das funktionierte für mich. Kommentarautor: Adil F

InformationsquelleAutor der Frage ccampo | 2014-08-25

Schreibe einen Kommentar