Spring 基于Java的配置

1、在有基于Java的配置之前,我们可以使用XML配置Spring,例如读取properties文件(假设一个maven构建的项目,src/main/resources下有jdbc.properties、messages.properties),我们可以如下配置:



或者


  
	
		classpath:jdbc.properties
		classpath:messages.properties
	
  

现在我们改成基于Java的配置

@Configuration
@ComponentScan(value = "xxx.yyy.zzz")
public class AppConfig {

	@Bean
	public PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {

		PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
		configurer.setFileEncoding("UTF-8");
		configurer.setLocations(new ClassPathResource("jdbc.properties"), new ClassPathResource("database.properties"));
		return configurer;
	}

}

这个Spring Bean中的locations是 org.springframework.core.io.Resource 接口数组,这里我们是读取classpath路径下的properties文件,所以我们可以使用 org.springframework.core.io.ClassPathResource 这个实现类(使用这个实现类表明是读取classpath路径下的文件,所以不需要像XML中指定classpath前缀)。Resource 接口描述信息可以看到有多种实现类或子接口,例如UrlResource、FileSystemResource、PathResource,根据需要可以选择相应的实现类。

2、PropertySourcesPlaceholderConfigurer类中描述信息有如下:

Specialization of PlaceholderConfigurerSupport that resolves ${...} placeholders within
 
bean definition property values and @Value annotations against the current Spring 

Environment and its set of PropertySources. 

大意就是PropertySourcesPlaceholderConfigurer会使用读取过来的properties文件内容来替换XML中${...}格式的占位符或者基于Java的配置中的@Value

@Bean(value = "dataSource")
public DataSource getBasicDataSource(@Value(value = "${driverClassName}") String driverClassName,
		@Value(value = "${url}") String url, @Value(value = "${username}") String username,
		@Value(value = "${password}") String password) {
	BasicDataSource dataSource = new BasicDataSource();
	dataSource.setDriverClassName(driverClassName);
	dataSource.setUrl(url);
	dataSource.setUsername(username);
	dataSource.setPassword(password);
	return dataSource;
}

3、基于Java的配置Spring Bean 之间的依赖,例如现在我要创建一个DataSourceTransactionManager,依赖前面的dataSource 这个Spring Bean

@Bean(value = "transactionManager")
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource) {
	DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
	transactionManager.setDataSource(dataSource);

	return transactionManager;
}

直接在创建@Bean的方法参数中传入,如果Spring容器中有多个DataSource实例,则可以使用@Qualifier指定传入哪个实例

 

@Bean(value = "transactionManager")
public DataSourceTransactionManager getDataSourceTransactionManager(
			@Qualifier(value = "dataSource") DataSource dataSource) {
	DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
	transactionManager.setDataSource(dataSource);

	return transactionManager;
}

 

你可能感兴趣的:(Spring)