例如,如果我的类路径上有数据相关的库,Spring Boot将自动配置一个可以自动连接到我自己的bean和类中的DataSource对象,如下所示:
@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; } }
但是,如果我尝试在XML配置文件中执行相同的操作,我将收到一个异常.我已经通过在我的主配置类中添加了一个@ImportResource(“classpath:xmlconfig.xml”)来引导XML配置文件.这是我正在谈论的一个例子…在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>
上述将在运行Spring Boot应用程序时给出异常,尽管dataSource是一个有效的自动配置的Bean名称.我也尝试过使用自动配置的ConnectionFactory(在类路径上使用ActiveMQ)和EntityManagerFactory与Hibernate& JPA在类路径上,没有一个工作.
基本上,我所要问的是什么是相当于将自动连接Spring Boot自动配置的bean转换成XML配置文件?
这是我的主要的Spring Boot入门点只是所有文档中列出的标准类:
@Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class,args); } }
我主要在Spring Integration应用程序中使用这个应用程序,其中Java配置不太受支持,框架的核心是基于XML配置,但是我想使用Spring Boot自动配置的DataSource和ConnectionFactory bean一些集成元素.
编辑:@AdilF提供的答案适用于dataSource bean,但是类似的配置不适用于connectionFactory bean.请参阅以下演示代码的GitHub项目:
https://github.com/ccampo133/autoconfig-test/tree/master
如果有人能弄清楚如何正确连接connectionFactory bean,我将非常感谢.
以下是大部分代码说明:
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,"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>
的build.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}" }