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
如果还是不行,请检查以下两点:
您是否将配置(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. 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 实现分布式配置中心