Spring Cloud 默认配置文件

Posted

技术标签:

【中文标题】Spring Cloud 默认配置文件【英文标题】:Spring cloud default profile 【发布时间】:2016-03-21 11:57:27 【问题描述】:

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

【问题讨论】:

你不应该注入Config。将@Bean 放在每个方法上。然后,您应该注入单个 bean。 【参考方案1】:

@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. DevConfig 和 CloudConfig 在同一个包中。 2. 我在本地的默认配置文件中运行。当我用代码检查日志时。我收到以下消息“未配置 Spring 配置文件,使用默认配置运行”。但 dsConfig 为空【参考方案2】:

我宁愿自动装配数据源和服务类而不是配置类。 这样你就不需要任何配置实例,直接自动装配你想要的任何类。

所以类将如下所示。 默认配置:

@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);
    

【讨论】:

以上是关于Spring Cloud 默认配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Eureka配置文件例子与较为详细说明

几行代码就可以使用分布式配置中心,Spring Cloud Alibaba真香

Spring CloudSpring Cloud Config 实现分布式配置中心

Spring Cloud Consul—git2consul与配置

Spring Cloud(15)——配置中心

Spring Cloud Alibaba入门七:openFeign日志配置