我是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)我尝试创建像
这样的FactoryBeanpublic 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
答案 0 :(得分:3)
感谢您的建议。我能够在同事的帮助下解决问题。我做错了什么
在做出这些改变后,它就像一个魅力。
答案 1 :(得分:0)
从isSingleton()返回true
但我质疑你的设计。
我总是会使用属性文件切换出这样的实现。我曾经不得不为网站实施CAPTCHA集成。我们使用JCaptcah和ReCAPTCHA API进行原型设计。我创建了一个新的界面,其中只包含我们需要的功能,然后为两个API创建了实现。使用Spring配置文件和Maven配置文件中的占位符,我们可以在编译时或部署时切换实现类,例如,mvn jetty:run -DcaptchaImpl = recaptcha或-DcaptchaImpl = jcaptcha。
在不知道您想要完成的任务的情况下,很难提供更多建议。