我正在尝试使用Spring Java配置配置h2数据源以进行junit测试,并从外部文件加载属性。在遵循教程并使用@PropertySource并自动装配环境时,我发现在创建数据源时,环境为null。有人知道为什么在构建数据源bean时环境为null吗?
我创建了一个虚拟的Test类,其ContextConfiguration指向一个@Configuration类,在其中定义了数据库连接所需的bean。要创建这些文件,我只想使用一个外部属性文件,因此我使用了@PropertySource指向该文件,并使用了应使用这些属性填充的Environment。当我尝试访问任何Environment属性时,它会失败,因为Enviroment为null。
我还尝试创建一个PropertySourcePlaceHolder并使用@Value填充,但结果相同(该属性未填充)。
如果我的配置类实现了EnvironmentAware接口,则它有效地填充了我的数据源bean的环境,因此它可以正常工作。
我也进行了相同的测试,没有创建任何数据库Bean,而只是创建了一个虚拟Bean,该虚拟Bean在创建时仅打印环境属性,因此我发现了相同的问题(环境为空)。
我想应该有一些带有spring初始化顺序的东西,因为我不明白为什么它不起作用,因为所有示例都以我尝试的方式定义了bean。
//TEST CLASS
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {DataBaseTestConfiguration.class} , loader = AnnotationConfigContextLoader.class)
public class TestConfiguracion {
//Dummy
@Test
public void testPrueba(){
assertEquals(1,1);
}
}
我的配置类
//CONFIGURATION CLASS
@Configuration
@PropertySource("classpath:application-test.properties")
@EnableJpaRepositories(basePackages = "es.bla.springmvcexample")
@EnableTransactionManagement
public class DataBaseTestConfiguration {
@Autowired
private Environment environment;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
System.out.println(environment); //<-- here is showing environment is null
dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName")); //<-- Here fails
dataSource.setUrl(environment.getProperty("jdbc.url"));
dataSource.setUsername(environment.getProperty("jdbc.user"));
dataSource.setPassword(environment.getProperty("jdbc.pass"));
return dataSource;
}
....
}
任何人都可以解释我为什么在创建bean时未注入环境?
编辑:我创建了另一个@Configuration(PropertiesConfiguration),在其中定义@PropertiesSource并更改@ContextConfiguration以添加该configurationClass。然后,我更改了DataBaseTestConfiguration并进行了注入@Enviroment的工作。 以相同的方式,在PropertiesConfiguration中添加虚拟Bean并尝试在该类中自动连接环境以填充该Bean会失败。就像我无法自动定义定义的Configuration类中的环境一样(但我不明白为什么定义类的问题很重要)