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}"
}
DataSource
automatisch, wenn Sie die @EnableAutoConfiguration
Funktion. Sie können dann auto-Draht in Ihre JavaConfig Bohnen. 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). @ - 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. @Configuration @ComponentScan @EnableAutoConfiguration
von Application.java
- Datei und stellen Sie es auf Config.java
. Das funktionierte für mich. InformationsquelleAutor der Frage ccampo | 2014-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den folgenden Beispielcode für mich gearbeitet.
Hauptanwendung
Spring Java Config
BarService
FooService
config.xml
InformationsquelleAutor der Antwort Adil F
Ich habe Ihre autoconfig-Probe-Projekt und war in der Lage, um es an die Arbeit. Das einzige problem fand ich mit deiner xml ist wie folgt...
Ich nehme an, Sie wollen, verwenden Sie die eingebettete broker. Wenn ich lief Ihr Projekt, das war, was wurde automatisch konfiguriert...
Dies erzeugt eine bean mit dem Namen jmsConnectionFactory, aber Ihre xml versucht zu Draht eine bean mit dem Namen connectionFactory. Ändern der bean-Namen jmsConnectionFactory Updates,...
Ich weiß nicht, warum würden Sie wollen, um xml, aber es funktioniert.
Edit:
Ich werde auch hinzufügen, kann es einige Missverständnisse darüber, wie Sie nutzen spring, jpa integration. Trotz der Tatsache das autowiring der EntityManagerFactory funktioniert, es wirklich sollte nicht direkt verwendet werden. Sie sollten die Verdrahtung einer EntityManager wie folgt...
Ich weiß, das sprengt den Rahmen dieser Frage, aber ich dachte, ich sollte hinzufügen, dass
InformationsquelleAutor der Antwort hyness