IOC容器:去重配置代码

IOC containers: de-duplicating the configuration code

我正在为 2 个不同的应用程序使用 spring 框架。假设这两个应用程序都与一个 MongoDB 数据库通信。以下是我在两个应用程序中配置 MongoDB 的方式:

@Configuration
@PropertySource("file:/etc/x/y/mongodb.properties")
public class MongoConfiguration {

    @Autowired
    private Environment env;

    @Bean
    public UserCredentials mongoCredentials() {
        String mongoUserName = env.getProperty("mongodb.username");
        String mongoPassword = env.getProperty("mongodb.password");
        UserCredentials credentials = new UserCredentials(mongoUserName, mongoPassword);
        return credentials;
    }

    @Bean
    public MongoClient mongoClient() throws Exception {
        String mongoUrl = env.getProperty("mongodb.url");
        String mongoPort = env.getProperty("mongodb.port");
        MongoClient mongo = new MongoClient(mongoUrl, Integer.valueOf(mongoPort));
        return mongo;
    }

    @Bean(name="mongoTemplate")
    public MongoTemplate mongoTemplate() throws Exception {
        String mongoDatabaseName = env.getProperty("mongodb.databasename");
        MongoTemplate mongoTemplate = new MongoTemplate(mongoClient(), mongoDatabaseName, mongoCredentials());
        return mongoTemplate;
    }

现在,这段代码在两个不同的应用程序配置中重复。如何避免在两个不同的地方进行此配置?

使用 Spring 引导,并可选择包含 @PropertySource 以添加到环境中。它将收集所有 MongoDB 信息并为您配置客户端和模板。

将其视为您不想复制的实用程序 class:将您的配置文件移动到一个单独的项目,并使您的两个应用程序都包含该项目。

如果您需要添加额外的项目特定配置,Spring 提供了 @Import 注释,允许您从单独的 classes 导入配置,因此您可以创建两个项目特定配置 classes,它们都从共享库中导入通用配置并提供自己的个人 bean 和 属性 源,例如:

@Configuration
@PropertySource("classpath:/com/appspecific/app.properties")
@Import(com.genericlib.BaseConfig.class)
public class AppConfig {
 @Inject BaseConfig baseConfig;

 @Bean
 public MyBean myBean() {
     // reference the base config context
     return new MyBean(baseConfig.getSomething());
 }
}