0

コントローラークラスとして自動配線するために使用したいI実装を備えたサービスインターフェイスがあります。を自動配線しないでください。どうすればこれを達成できますか。さらに、I 実装は注釈付きの @Service Bean です。それらをxml宣言に移動したくありません。I1,I2,I3...I10I1-I5List<I>CI6-I10

4

3 に答える 3

1

mvb13 のコメントに基づいて、問題の解決策を編み出そうとしました....

そこで、ArrayList を拡張するクラスを作成し、それをコンポーネントとしてマークします。

@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;

しかし、プロパティを使用するには、Bean 定義を xml に移動する必要があると思います<qualifier ... />。修飾子を指定する別のオプションはないと思います。

于 2013-10-24T13:57:13.077 に答える