0

我有一个I带有实现的服务接口I1,I2,I3...I10,我想用I1-I5它来自动装配为List<I>控制器类CI6-I10不应自动装配。我怎样才能做到这一点。此外,I 实现是带注释的 @Service bean。我不想将它们移动到 xml 声明中。

4

3 回答 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 回答