如何使用@Autowired动态注入工厂模式之类的实现

时间:2011-04-20 03:37:13

标签: spring autowired

我是Sprint的新手,我正在使用Spring 3.x和roo1.1.1作为我的应用程序。

我有一个接口的多个实现,它将@Autowired到其他不同的类中。我只能决定在运行时使用哪个实现。这应该像工厂模式一样实现。

public interface SomeInterface {
    public void doSomething();
}

实施1。

public class SomeOb implements SomeInterface {
    public void doSomething() {
        //Do something for first implementation here
    }
}

实施2。

public class SomeOtherOb implements SomeInterface {
    public void doSomething() {
        //Do something for first implementation here
    }
}

现在在我的服务中,我需要像

这样的Autowired
@Service 
public class MyService {

   @Autowired
   SomeInterface ob;
   //Rest of the code here

}

1)选择要实现Autowired的实现的逻辑只知道运行时,因此我不能使用@Qualifier注释来限定它。 2)我尝试创建像

这样的FactoryBean
public class SomeFactoryBean implements FactoryBean<SomeInterface> {
@Override
public SomeInterface getObject() throws Exception {
    if(/*Somecondition*/) {
        return new SomeOb();
    } else
        return new SomeOtherOb();
}

@Override
public Class<? extends SomeInterface> getObjectType() {
    if(/*Somecondition*/) {
        return SomeOb.class;
    } else
        return SomeOtherOb.class;
}

@Override
public boolean isSingleton() {
    return false;
}
}

在applicationContext.xml中,我有提到的标签。

当我运行网络服务器时,我遇到了像

这样的错误
No unique bean of type [com.xxxx.xxxx.SomeInterface] is defined: expected single matching bean but found 3: [xxxx, xxxxxxx, xxxxFactory]

任何人都可以帮我解决这个问题。如果我没有这样做,请指导我以正确的方式做到这一点。

感谢并感谢任何帮助, JJK

2 个答案:

答案 0 :(得分:3)

感谢您的建议。我能够在同事的帮助下解决问题。我做错了什么

  1. 我使用@Service实现了SomeInterface。所以这是由弹簧扫描仪拾取并添加到豆子里。
  2. 在试验和错误期间,我从FactoryBean实现中删除了@Component注释。
  3. 在做出这些改变后,它就像一个魅力。

答案 1 :(得分:0)

如果你只需要为应用程序的给定实例提供一个bean实现,那么

从isSingleton()返回true

但我质疑你的设计。

我总是会使用属性文件切换出这样的实现。我曾经不得不为网站实施CAPTCHA集成。我们使用JCaptcah和ReCAPTCHA API进行原型设计。我创建了一个新的界面,其中只包含我们需要的功能,然后为两个API创建了实现。使用Spring配置文件和Maven配置文件中的占位符,我们可以在编译时或部署时切换实现类,例如,mvn jetty:run -DcaptchaImpl = recaptcha或-DcaptchaImpl = jcaptcha。

在不知道您想要完成的任务的情况下,很难提供更多建议。