如何干净地“获得”春天原型豆?

时间:2011-12-05 06:11:44

标签: spring

我希望我的其他类与我的域的接口而不是实现进行交互,我希望避免在代码中硬编码实现,例如:

public void addToMyList(String s, int i) {
  DomainModel model = new DefaultDomainModelImpl(); // it's hardcoding the implementation here
  model.setName(s).setAge(i);
  myList.add(model);
}

如果我使用spring容器,使用 prototype 范围,我可以使用类似的东西:

// <bean id="myDomainBean" scope="prototype" class="my.package.domain.MyDomainImpl" />
DomainModel myDomainModel = springContext.getBean("myDomainBean"); 

但我想避免在我的代码中显式访问springContext。

我想知道干净的方法是什么?

我目前正在考虑为每个域实现创建一个工厂实现,并自动装配工厂来创建bean,但这意味着我的域的不同实现也会有不同的工厂实现。

请分享您的意见,谢谢!

1 个答案:

答案 0 :(得分:2)

  

我目前正在考虑为每个域实现创建一个工厂实现,并自动装配工厂来创建bean,但这意味着我的域的不同实现也会有不同的工厂实现。

这不是100%正确。您可以拥有一个工厂,该工厂采用需要创建的Domain对象的Interface(类)。您可以在课堂上注入该工厂。 因此,您将获得所要求的所有要求:

  • 没有硬编码new
  • 域对象代码不依赖于spring
  • 您只有一个工厂类和一个工厂方法。

例如

@Inject
MyStrangeSpringHiddingFactory myStrangeSpringHiddingFactory;

DomainModel myDomainModel = this.myStrangeSpringHiddingFactory.
                            createInstanceOf(DomainModel.class); 


class MyStrangeSpringHiddingFactory implements MyStrangeSpringHiddingFactory {
   @Inject
   ApplicationContext springContext:

   public <T> createInstanceOf(Class<T> clazz) {
      return springContext.getBean(clazz); 
   }
}

这只是我的想法,因为我不知道你的用例:你真的需要抽象吗?你真的有一个域模型,其中一个域类有几个需要工厂的子类。