我们知道, Java注解的属性都必须是常量, 连enum都不行, 更不用说变量了.
所以, @EnableJpaRepositories注解的basePackages, 也必须是一个常量. 例如:
@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "userEntityManagerFactory", basePackages = "com.myCompany.user.repository", //必须是常量 transactionManagerRef="userTransactionManager" ) public class UserDataSourceConfiguration{ }
那么问题来了, 假如我们希望从配置文件中读取basePackages呢?
幸好, spring支持我们这样做, 直接用"${}"表达式, 等效于从Environment对象中读取配置.
@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "userEntityManagerFactory", basePackages = "${customized.datasource.user.repository}",//从配置中读取 transactionManagerRef="userTransactionManager" ) public class UserDataSourceConfiguration{ }
从字面上看basePackages还是一个常量, 不过Spring帮我们做了剩下的事情, 包括解析表达式, 注册JPA相关的BeanDefinition.具体参见o.s.d.r.c.RepositoryBeanDefinitionRegistrarSupport#registerBeanDefinitions.
如果找不到配置customized.datasource.user.repository, 则应用会无法启动; 所以最好指定一个默认值, 免得妨碍应用启动.
@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "userEntityManagerFactory", basePackages = "${customized.datasource.user.repository:com.myCompany.defaultPackage}", transactionManagerRef="userTransactionManager" ) public class UserDataSourceConfiguration{ }
冒号后面的是默认值, 默认值甚至可以是一个不存在的package, 注意默认值不要加单引号.