使用`@Configuration` bean作为普通bean是一种好习惯吗?

时间:2015-01-19 02:01:30

标签: spring spring-bean

在Spring中,我们可以将类标记为@Configuration,并使用它来配置bean。

但是bean也可以用作普通bean,参见示例:

@Configuration
@EnableCaching
public class CacheConfig {
    private List<GuavaCache> caches = Collections.emptyList();

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(caches);

        return cacheManager;
    }

    public String statistics() {
        StringBuilder sb = new StringBuilder();
        for (GuavaCache cache : caches) {
            sb.append(cache.statistics()).append("\n");
        }
        return sb.toString();
    }

}

您可以看到我们在此CacheManager中配置了CacheConfig bean,但它还包含一个普通的statistics方法,我们可以引用此bean并调用它。

我只是想知道这是使用@Configuration类的推荐方法吗?

就个人而言,我会避免它,因为它混合了两个责任,#34;创建bean&#34;,&#34;提供一些业务逻辑&#34;。我更喜欢为统计数据创建另一个bean(以下代码可能不正确,仅用于演示)。

@Configuration
@EnableCaching
public class CacheConfig {
    private List<GuavaCache> caches = Collections.emptyList();

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        cacheManager.setCaches(caches);
        return cacheManager;
    }

    @Bean
    public CacheStatistics cacheStatistics() {
        return new CacheStatistics(caches);
    }

}

class CacheStatistics {
    private List<GuavaCache> caches;
    public CacheStatistics(List<GuavaCache> caches) {
        this.caches = caches;
    }
    public String statistics() {
        StringBuilder sb = new StringBuilder();
        for (GuavaCache cache : caches) {
            sb.append(cache.statistics()).append("\n");
        }
        return sb.toString();
    }
}

1 个答案:

答案 0 :(得分:0)

基本上我们使用@Configuration来替换spring中的.xml文件。这个文件不用于建立业务逻辑

因此,如果我们使用@Configuration,我们需要注意我们只是用它来声明bean。我不认为我们把其他东西放在那里。

谢谢, 人士Himanshu