20

同じインターフェースを実装する Bean がいくつかあります。各 Bean には注釈が付けられます

@Component 
@Order(SORT_ORDER).
public class MyClass implements BeanInterface{
    ...
}

ある時点で、コンポーネントのリストを自動配線し、ソートされた Bean のリストを期待します。Bean のリストは、アノテーションで設定した順序に従ってソートされません。

Ordered インターフェイスを実装してみましたが、同じ動作が発生します。

@Component
public class Factory{


    @Autowired
    private List<BeanInterface> list; // <- I expect a sorted list here
    ...
}

私は何か間違ったことをしていますか?

4

5 に答える 5

21

あなたが言うように、私は問題の解決策を見つけました。この注釈は、それが素晴らしい機能であるにもかかわらず、そのためのものではありません。

このように機能させるには、ソートされたリストを含む Bean に次のコードを追加する必要があります。

@PostConstruct
public void init() {
    Collections.sort(list,AnnotationAwareOrderComparator.INSTANCE);
}

それが役に立てば幸い。

于 2013-06-07T09:56:30.997 に答える
2

注釈は、@OrderAOP アドバイスが実行される順序を指定するために使用され、リストをソートしません。リストの並べ替えを実現するには、BeanInterfaceクラスにComparableインターフェイスを実装し、メソッドをオーバーライドしてcompareTo、オブジェクトの並べ替え方法を指定します。その後、 を使用してリストを並べ替えることができますCollections.sort(list)。オブジェクトの並べ替え順序を指定するオブジェクトを返すBeanInterfaceメソッドが呼び出されると仮定すると、次のようなことができます。getSortOrderInteger

@Component 
public class MyClass implements BeanInterface, Comparable<BeanInterface> {
    public Integer getSortOrder() {
        return sortOrder;
    }

    public int compareTo(BeanInterface other) {
        return getSortOrder().compareTo(other.getSortOrder());
    }
}

次に、次のようにリストを並べ替えることができます。

Collections.sort(list);
于 2013-06-06T20:35:01.450 に答える