我有一个I
带有实现的服务接口I1,I2,I3...I10
,我想用I1-I5
它来自动装配为List<I>
控制器类C
。I6-I10
不应自动装配。我怎样才能做到这一点。此外,I 实现是带注释的 @Service bean。我不想将它们移动到 xml 声明中。
问问题
1069 次
3 回答
1
根据 mvb13 的评论,我试图为这个问题编织一个解决方案....
所以我写了一个扩展 ArrayList 的类并将其标记为 Component
@Component("mysublist")
public class MyList extends ArrayList implements ApplicationContextAware
{
@Value("comma.sep.eligible.beans.classnames")
private String eligibles;
private ApplicationContext appCtx;
@PostConstruct
public void init()
{
Map allBeans = appCtx.getBeansOfType(I.class);
for(Object bean:allBeans.values())
{
if(eligibles.contains(bean.getClass().getSimpleName()))
{
add(bean);
}
}
}
public void setApplicationContext(ApplicationContext appCtx)
{
this.appCtx = appCtx;
}
}
现在我可以在我需要的类定义中自动装配上面的 bean:
@Service
public class MyService
{
@Resource(name="mysublist")
private List<I> myReqdBeans;
......
}
*请忽略代码中与泛型相关的含义。
于 2013-12-23T14:13:11.697 回答
0
你应该使用@Qualifier
. 它定义了您需要的任何子集。
@Autowired
@Qualifier("MySubset")
private List<I> list;
但我认为你应该在 xml 中移动你的 bean 定义以使用<qualifier ... />
属性。我认为您没有其他选择来指定限定符。
于 2013-10-24T13:57:13.077 回答
0
@Qualifier
注释应该给你你需要的东西。您需要在两个地方应用它:
- 在您希望包含在子列表中的 @Service bean 上
- 在注入控制器的@Autowired 列表中
所以@Service
首先解决bean:
@Service
@Qualifier("MySubList")
public class MyService implements IMyService
{
}
然后在您的控制器中:
@Controller
public class MyController
{
@Qualifier("MySubList")
@AutoWired
private List<IMyService> myServices;
}
这指示 Spring 将@AutoWire
所有IMyService
实现@Qualified
作为“MySubList”
于 2013-10-25T11:02:47.760 回答