【问题标题】:Advanced Spring @Qualifier高级 Spring @Qualifier
【发布时间】:2012-04-05 12:06:55
【问题描述】:

我有:

@Component
class MyDecorator{
  private Cache cache;
  /*
  some wrapped methods like get put remove
  */
}

是否可以在不同的地方用不同的缓存自动连接MyDecorator
我可以像这样配置 XML:

<bean id="id1" class="MyDecorator ">
    <property name="cache" value="Cache1" />
</bean>
<bean id="id2" class="MyDecorator ">
    <property name="cache" value="Cache2" />
</bean>

但是有没有更优雅的方式而不添加 xml 配置,只有注释?

正确的代码应该是

    @Configuration
    public class AppConfig { 
@Bean
    public MyAdapter adaptedCache2() {
        return new MyAdapter (cache1);
    }

    @Bean
    public MyAdapter adaptedCache2() {
        return new MyAdapter (cache2);
    }} 

根据specs会生成两个bean adaptCache1 和adaptedCache2 现在我可以 使用限定符 adaptCache1 和 adaptCache2 自动装配这些 bean

【问题讨论】:

    标签: java spring code-injection autowired


    【解决方案1】:

    使用 Java 配置(Spring 3.1),您可以编写:

    @Bean
    public MyDecorator decoratedCache1() {
        return new MyDecorator(cache1);
    }
    
    @Bean
    public MyDecorator decoratedCache2() {
        return new MyDecorator(cache2);
    }
    

    当然在这种情况下MyDecorator 不需要@Component

    @Component
    class MyDecorator{
        private final Cache cache;
    
        public MyDecorator(Cache cache) {
            this.cache = cache;
        }
    
    }
    

    【讨论】:

    • 如上所示,如果我有 MyDecorator 必须扩展缓存,我不确定这是否是个好主意
    • @Diyko:这不是 Decorator 模式的工作原理吗?它扩展/实现与包装对象相同的接口?否则它是一个 Adapter...
    • 看来我明白你的意思了
    猜你喜欢
    • 2017-04-11
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多