Spring EnableJpaRepositories: 可配置的basePackages.

我们知道, 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, 注意默认值不要加单引号.

猜你喜欢

转载自rickgong.iteye.com/blog/2366673
今日推荐