Spring初期化後のカスタム注釈beanの取得


インタフェース番号などの特定のクラスの情報をクラスに注釈で関連付けることを目的とし、その後、インタフェース番号から対応するbeanを取得して対応論理を実行することができる.
1.新しい注釈クラス:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface ServiceCode {
    String code() default "";

    String className() default "";
}

インタフェース番号とbeanName情報が含まれています.
2.新しいインタフェースクラス:
@ServiceCode(code = "100010", className = "echoService")
@Service("echoService")
public class EchoService {

}

3.springコンテナの初期化が完了した後に実行するインタフェースApplicationListenerを実装する.
@Component
@Order(1)
public class ServiceInitListener implements ApplicationListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceInitListener.class);

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        ApplicationContext applicationContext = event.getApplicationContext();
        //                  bean,  event                bean
        if (applicationContext.getParent() != null) {
            applicationContext = applicationContext.getParent();
        }
        Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(ServiceCode.class);
        for (Object bean : beansWithAnnotation.values()) {
            ServiceCode annotation = bean.getClass().getAnnotation(ServiceCode.class);
            String code = annotation.code();
            String className = annotation.className();
            //       beanName
            //        code  beanName,    springContext    bean       
            //        
        }
    }

}

注意: ContextRefreshedEventが取得したコンテキスト環境はルートspringコンテナではなく、一部のspringにbeanが内蔵されているだけで、注釈でカスタムbeanを取得することはできません.親コンテナを取得して操作を完了する必要があります.私が最初に取得したのはbeanListが常に空で、その後、そのコンテナの内部beanにはカスタムサービスbeanがないことに気づき、親コンテナを取得した後、すべて正常に動作しました.
@Order注記で実行順序をカスタマイズし、小さいほど優先的に実行します.