在我正在进行的项目中,我们需要多个配置文件,即“默认”和“云”。
DefaultContext和CloudContext都包含相同的bean定义
我们正在使用PCF(Pivotal Cloud Foundry)
我们创建了一个界面
public interface Config {
public DataSource getDataSource();
public SomeService getService();
}
然后使用此界面实现每个配置文件
@Primary
@Configuration
@Profile("default")
public class DevConfig implements Config
{
public DataSource getDataSource() {
// create and return production datasource
}
public SomeService getService() {
// Create and return production service
}
}
然后为云做同样的事情。
@Configuratio
@Profile("cloud")
public class CloudConfig extends AbstractCloudConfig implements Config
{
public DataSource getDataSource() {
// create and return dummy datasource
}
public SomeService getService() {
// Create and return dummy service
}
}
我们在服务调用中处理器处理文件中的自动装配。
@Service("processor")
public class Processor {
@Autowired Config dsConfig;
public object get(int Number)
{
return dao.get(Number,dsConfig.getDataSource());
}
}
如果我们部署在PCF中,它的工作正常,因为配置文件是云。如果我们在本地运行,它应该获取默认配置文件,但dsConfig为null。 你能帮忙吗?
答案 0 :(得分:2)
@Configuration
课程不适用于自动装配。
正如@spencergibb在评论中指出的那样,您需要告诉容器使这些类可用于自动装配。
为此用@Component
注释它们。
这样的事情:
@Component
@Profile("default")
public class DevConfig implements Config
{
public DataSource getDataSource() {
// create and return production datasource
}
public SomeService getService() {
// Create and return production service
}
}
如果仍然无法正常工作,请检查以下两点:
DevConfig
和Cloudconfig
),以便ContextScan找不到它?Dev
)。您可以将此剪辑剪切到您的代码(来自JHipster)以记录活动配置文件。
@Autowired
private Environment env;
/**
* Initializes Application.
* <p/>
* Spring profiles can be configured with a program arguments --spring.profiles.active=your-active-profile
* <p/>
*/
@PostConstruct
public void initApplication() throws IOException {
if (env.getActiveProfiles().length == 0) {
log.warn("No Spring profile configured, running with default configuration");
}
else {
log.info("Running with Spring profile(s) : {}", Arrays.toString(env.getActiveProfiles()));
}
}
答案 1 :(得分:0)
我宁愿自动装配数据源和服务类而不是配置类。 这样你就不需要任何配置实例,直接自动装配你想要的任何类。
所以这些类看起来如下所示。 默认配置:
@Primary
@Configuration
@Profile("default")
public class DevConfig implements Config
{
@Bean
public DataSource getDataSource() {
// create and return production datasource
}
@Bean
public SomeService getService() {
// Create and return production service
}
}
云配置:
@Configuration
@Profile("cloud")
public class CloudConfig extends AbstractCloudConfig implements Config
{
@Bean
public DataSource getDataSource() {
// create and return dummy datasource
}
@Bean
public SomeService getService() {
// Create and return dummy service
}
}
处理器类:
@Service("processor")
public class Processor {
@Autowired
private DataSource dataSource;
public object get(int Number)
{
return dao.get(Number,datasource);
}
}