Spring云默认配置文件

时间:2015-12-15 15:49:46

标签: java spring spring-cloud spring-cloud-connectors pivotal-cloud-foundry

在我正在进行的项目中,我们需要多个配置文件,即“默认”和“云”。
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。 你能帮忙吗?

2 个答案:

答案 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
    }
}

如果仍然无法正常工作,请检查以下两点:

  • 您是否有不同包中的配置(DevConfigCloudconfig),以便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);
    }
}