[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.팩토리 메소드 패턴 사용 :
팩토리 메소드 패턴 사용 :
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 등을 제안 할 것이다.
from https://stackoverflow.com/questions/7537620/conditional-injection-of-bean by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3.0 FileUpload는 POST에서만 사용할 수 있습니까? (0) | 2019.02.11 |
---|---|
[SPRING] 스프링 3.1에서 JDO 구성하기 (0) | 2019.02.11 |
[SPRING] Java / Jetty : Embedded Jetty에 필터를 추가하는 방법 (0) | 2019.02.11 |
[SPRING] JAXB 주석이있는 Spring 3.1.2의 등록자 MappingJackson2HttpMessageConverter (0) | 2019.02.11 |
[SPRING] spring-security-context.xml에서 사용자 이름 / 패스워드를 이동하는 방법? (0) | 2019.02.11 |