根据目标类注入不同的Spring bean

时间:2014-12-26 14:19:57

标签: java spring

说我有这个:

interface Something {
}

interface Fetcher {
}

class FetcherImpl implements Fetcher {
   private final Class<?> klass;

   public FetcherImpl(Class<?> klass) {
      this.klass = klass;
   }

   public Something fetch() {
      // Fetch an instance Something depending on the klass
   }
}

class ClassA {
   private final Fetcher fetcher;

   public ClassA(Fetcher fetcher) {
      this.fetcher = fetcher;
   }

   public void someMethod() {
      // ...
      Something something = fetcher.fetch();
      // ...
   }
}

class ClassB {
   private final Fetcher fetcher;

   public ClassB(Fetcher fetcher) {
      this.fetcher = fetcher;
   }

   public void someMethod() {
      // ...
      Something something = fetcher.fetch();
      // ...
   }
}

所以,这个想法是:

  • 我有一个数据类Something
  • 我有一个数据类的抓取器Fetcher,它根据类取出它。例如,它根据路径/tmp/<class-name>.txt
  • 中的文件内容创建它
  • 在上面的示例中,有很多类正在使用(它们各自的实例)抓取器,ClassAClassB

一些要点:

  • 提取器的所有客户端都在进行构造函数注入,即使用最终字段来存储提取器。因此无法使用bean后处理器
  • 使用fetcher的类集是一个开放的
  • 不应手动配置fetcher实例的创建。即当添加上面的类ClassC使用其自己的类似于ClassAClassB的获取器实例时,不应该为该特定类添加额外的Spring配置

类似模式的一些现实世界的例子:

  • 记录器,例如而不是使用

    final Logger logger = LoggerFactory.getLogger(this.getClass())
    

    记录器将通过构造函数

  • 注入
  • 缓存实现(即获取特定类的缓存)
  • DAO对象(即获取特定bean的DAO,只要它足够通用)

这可能使用Spring吗?如果是这样,你能提供一些我可以阅读的指示或类似的例子吗?如果重要的话,我正在使用Spring的Java配置。

0 个答案:

没有答案