복붙노트

[SPRING] 콩의 조건부 주사

SPRING

콩의 조건부 주사

클라이언트에서 전달 된 String 매개 변수를 기반으로 빈을 삽입하고 싶습니다.

public interface Report {
    generateFile();
}

public class ExcelReport extends Report {
    //implementation for generateFile
}

public class CSVReport extends Report {
    //implementation for generateFile
}

class MyController{
    Report report;
    public HttpResponse getReport() {
    }
}

전달 된 매개 변수를 기반으로 보고서 인스턴스를 주입하려고합니다. 어떤 도움이 크게 appretiated 것입니다. 미리 감사드립니다.

해결법

  1. ==============================

    1.팩토리 메소드 패턴 사용 :

    팩토리 메소드 패턴 사용 :

    public enum ReportType {EXCEL, CSV};
    
    @Service
    public class ReportFactory {
    
        @Resource
        private ExcelReport excelReport;
    
        @Resource
        private CSVReport csvReport
    
        public Report forType(ReportType type) {
            switch(type) {
                case EXCEL: return excelReport;
                case CSV: return csvReport;
                default:
                    throw new IllegalArgumentException(type);
            }
        }
    }
    

    보고서 유형 enum은? type = CSV로 컨트롤러를 호출 할 때 Spring에 의해 생성 될 수 있습니다 :

    class MyController{
    
        @Resource
        private ReportFactory reportFactory;
    
        public HttpResponse getReport(@RequestParam("type") ReportType type){
            reportFactory.forType(type);
        }
    
    }
    

    그러나 ReportFactory는 매우 서툴러서 새 보고서 유형을 추가 할 때마다 수정해야합니다. 고정 된 경우 보고서 유형 목록에 괜찮 으면. 그러나 더 많은 유형을 추가하려는 경우 더 강력한 구현 방법입니다.

    public interface Report {
        void generateFile();
        boolean supports(ReportType type);
    }
    
    public class ExcelReport extends Report {
        publiv boolean support(ReportType type) {
            return type == ReportType.EXCEL;
        }
        //...
    }
    
    @Service
    public class ReportFactory {
    
        @Resource
        private List<Report> reports;
    
        public Report forType(ReportType type) {
            for(Report report: reports) {
                if(report.supports(type)) {
                    return report;
                }
            }
            throw new IllegalArgumentException("Unsupported type: " + type);
        }
    }
    

    이 구현을 통해 새로운 보고서 유형을 추가하는 것은 Report 구현 새 Bean과 새 ReportType enum 값을 추가하는 것만 큼 간단합니다. 열거 형을 사용하지 않고 문자열 (어쩌면 콩 이름)을 사용하여 도망 갈 수도 있지만 유익한 입력을 강력하게하는 것으로 나타났습니다.

    마지막 생각 : 보고서 이름이 약간 불행합니다. Report 클래스는 일부 논리 (전략 패턴)의 캡슐화를 나타내지 만 이름은 값 (데이터)을 캡슐화 함을 나타냅니다. 나는 ReportGenerator 등을 제안 할 것이다.

  2. from https://stackoverflow.com/questions/7537620/conditional-injection-of-bean by cc-by-sa and MIT license