我是Springs的新手,所以如果我的问题很愚蠢,请不要介意。
我有一个实现两个接口的类
public class AAA implements BBB, CCC {
}
public interface BBB {
void method BBB_method();
}
public interface CCC {
void CCC_method();
}
我在Context类中定义bean对象如下:
public class Context {
@Bean
public BBB myObject(){
return new AAA();
}
@Bean
public CCC myObject(){ //Issue is here
return new AAA(); //Duplicate API name not allowed
}
}
我已经在两个不同的类中自动装配了bean,如下所示:
@Autowired
private BBB myObject;
@Autowired
private CCC myObject;
自动装配这个并在Context类中定义bean的最佳方法是什么?并且在Context.java中定义2个bean对象有意义吗?如何解决这种情况,我希望我的bean可以自动连接到两个不同的接口(和对象名相同......在我的情况下是myObject)?非常感谢您的回复。谢谢!
答案 0 :(得分:0)
您遗漏的一点是,您不需要与参考变量名称相同的方法名称,即您不需要将您的方法名称设为 class GetAddressAsyncTask extends AsyncTask<Void, void, void> {
double lat = mLastLocation.getLatitude();
double lng = mLastLocation.getLongitude();
@Override
protected Void doInBackground(Void... params) {
// Do some background work
Geocoder geoCoder = new Geocoder(MainActivity.this, Locale.getDefault());
StringBuilder builder = new StringBuilder();
try {
List<Address> address = geoCoder.getFromLocation(lat, lng, 1);
int maxLines = address.get(0).getMaxAddressLineIndex();
for (int i=0; i<maxLines; i++) {
String addressStr = address.get(0).getAddressLine(i);
builder.append(addressStr);
builder.append(" ");
}
} catch (IOException e) {
// Handle IOException
} catch (NullPointerException e) {
// Handle NullPointerException
}
return null;
}
@Override
protected void onPostExecute(String result) {
String finalAddress = builder.toString(); //This is the complete address.
addressField.setText(finalAddress); //This will display the final address.
}
}
。
Spring容器只是试图找到依赖项的实现类,如果找到它们,它们将被注入myObject
字段(引用变量名称并不重要,只是它们的类型,即类名很重要。)
在Autowired
课程中,您无法使用相同的签名定义两个方法,因此请将其更改为如下所示的名称:
Context
答案 1 :(得分:0)
Spring按名称解析bean,因为在运行时它无法从bean声明中获取方法返回类型。
这是解决问题的最佳方法 - 只需指定不同的bean声明方法名称(例如bbbObject和cccObject)
当自动装配时,如果存在歧义且弹簧无法在默认情况下解析它,请使用Qualified
注释指定bean名称。