나 같은 경우 서브업무로 업무가 분리되어 있는 경우 업무를 처리하고 특정 Interface를 구현한 Class를 찾아서 후처리하는 기능 때문에 필요한 기능이었습니다.

추가적으로 찾은 Class에서 특정 Annotaion을 사용한 Method를 찾아서 실행하도록 하였습니다.


ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); 
provider.addIncludeFilter(new AssignableTypeFilter(Interface명.class));

Set components = provider.findCandidateComponents("Package명");  // co/kr/test형식

for (BeanDefinition component : components) {
    Class<?> clazz = Class.forName(component.getBeanClassName());
    logger.debug("Class Name : " + clazz.getName() );

    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        if( method.isAnnotationPresent(PostApprove.class) ) {
            logger.debug("Method Name : " + method.getName() );
            PostApprove annotation = method.getAnnotation(Annotation명.class);
            logger.debug("Annotation CODE : " + code + ", KEY : " + key );

            if( Arrays.asList(annotation.code()).contains(code) ) {
                String serviceValue = method.getDeclaringClass().getAnnotationsByType(Service.class)[0].value();
                ApproveHelper helper = (ApproveHelper) context.getBean(serviceValue);
         helper.postApprove(code, key);
           }
        }

    }
}


+ Recent posts