2014-04-01 4 views
0

요청을 처리 할 때마다 수동으로 클래스 인스턴스를 가져 오는 데 사용하는 다음 코드를 사용합니다.어떤 클래스의 인스턴스를 얻는 방법?

가정하자 나는 각 클래스에 의해 구현됩니다 하나의 인터페이스를 가지고 :

class AddFoo implements fooBar{ 

} 
class DeleteFoo implements fooBar{ 

} 
class AddBar implements fooBar{ 

} 
class DeleteBar implements fooBar{ 

} 
:

interface fooBar{ 

} 

와 다음은 요청에 따라 다른 신체 나는 그 인터페이스와 각 클래스를 구현하고있는 클래스했다입니다

다음은 요청별로 인스턴스를 수동으로 반환하는 클래스입니다.

class ProcessAllRequest{ 

    @Autowired 
    private AddFoo addfoo; 
    @Autowired 
    private DeleteFoo deletefoo; 

    public fooBar fooBargetProcessor(fooBar f){ 
     if(f.getClass.equals(AddFoo.class)){ 
      return addfoo; 
     }else if(f.getClass.equals(DeleteFoo.class)){ 
      return deletefoo; 
     }else return null; 
    } 
} 
나는 또한 return new AddFoo();과 같은 시도했지만 그게 null 인스턴스를 제공하므로 Autowired을 사용하고 완벽하게 작동합니다.

이제 모든 클래스에서 fooBargetProcessor(fooBar f)을 호출하여 요청을 처리하면 요청 당 해당 클래스의 인스턴스가 제공됩니다.

그래서 내 질문은 fooBargetProcessor() 메서드에 @Autowired 및 기타 정적 데이터없이 인스턴스를 자동으로 얻을 수있는 방법은 무엇입니까?

UPDATE는 :

나는 다른 방법 이름 ProcessRequest()에서이 방법이라고했다.

그리고 내가 명령을 내리고 각각을 ModelMapper를 사용하여 양식 데이터로 매핑했습니다.

는 같은

ModelMapper mapper = new ModelMapper(); 

AddFoo f = mapper.map(form, AddFoo.class); 
ProcessRequest(f); 

ProcessRequest() i have called fooBargetProcessor() 방법

.

샘플 클래스 코드 : POST 후 추가 업데이트 후 PUT 및 DELETE 경우 다음과 같은 방법을 삭제할 경우처럼

@Controller 
@RequestMapping(value = "/api/foo") 
    public class Foo extends BaseApi{ 
     @RequestMapping(method= RequestMethod.POST,consumes = "application/json") 
     public @ResponseBody 
     String add(@RequestBody AddFooForm form){ 

      ModelMapper mapper = new ModelMapper(); 
      AddFoo f = mapper.map(form, AddFoo.class); 
      ProcessRequest(f); 

      return "Hello"; 
     } 
    } 

이제/API/foo는에 요청에 따라 /는 다양한 방법으로 전달합니다 너무, 첫 번째 해골을 만드는 데 너무 많은 시간이 걸리기 때문에 프로젝트의 전체 흐름과 코드를 설명하는 것은 다소 불가능합니다.

요청에 따라 요청에 따라 데이터를 매핑하고 해당 컨트롤러 클래스에 ProcessRequest() 메서드를 호출해야합니다.

누구나 알고 있으면 알려주세요.

+0

@Autowired가 어떻게 작동하는지 모르지만 fooBargetProcessor 함수에 대한 반환 유형이 없어야합니까? – TheWalkingCube

+1

코드가 실행되지 않고 반환 유형이 누락되어 코드가 의도하는 바를 확인하지 못합니다. – Kayaman

+0

예이 코드에서는 반환 형식을 제공하지 않았지만 실제로는 모두 반환 형식을 사용하므로 실행되고 클래스의 singleton 인스턴스 만 원합니다. –

답변

0

일부 코드를 변경 한 후 class ProcessAllRequest과 그 메소드를 호출하는 곳을 제거했습니다. fooBargetProcessor(fooBar f)이 코드를 작성 했으므로 잘 작동합니다. 이제는 런타임에 모든 작업/클래스의 인스턴스가 생겼습니다.

처음으로이 유형의 코드를 작성하고 잘 작동했기 때문에 사용감이 좋았습니다.

String processorName = Introspector.decapitalize(f.getClass().getSimpleName() + "Processor"); 
ICommandProcessor processor = (ICommandProcessor) context.getBean(processorName); 

: 내가 좋아하는 클래스 Autowired 애플리케이션 컨텍스트가

첫째 : 코드

인스턴스를 얻을 수 있도록

@Autowired private ApplicationContext context;

다음 ProcessRequest() 방법 나는이 코드를 작성해야 여기 ffooBar 개체입니다.

간단하고 간단한 코드로 너무 많은 불필요한 코드를 제거했습니다.

고맙습니다.

0

단순히 fooBar을 모두 가져 오려면 Spring에 배열이나 컬렉션을 요청하면 어떨까요? 그런 다음에 fooBargetProcessor() 당신이 좋아하는 뭔가를 할 수 :이 메모리에서 입력 된를, 그래서 몇 가지 테스트 및 코드 정리가 필요할 수 있습니다 :

@Autowired 
private List<fooBar> processors; 

public <T extends fooBar> T getProcessor(Class<T> type) { 
    fooBar processor = null; 
    for (fooBar p : processors) { 
     if (p.getClass().equals(type)) { 
     processor = p; 
     break; 
     } 
    } 
    return processor; 
} 

주의 사항.

기본적으로 우리는 List에 모두 fooBar을 제공하도록 Spring에 요청합니다. 인스턴스에 @Component 태그가 붙어 있어야 Spring에서 찾을 수 있습니다. Spring은 모든 인스턴스를 찾아서 List에 연결해야합니다 (@Autowired의 문서 참조). 그런 다음이 메서드는 Java Generics를 사용하여 원하는 유형을 확인한 다음 List을 반복하여 찾습니다. 개체의 고유성을 보장하기 위해 List 대신 Set을 사용할 수 있습니다.

+0

안녕하세요 선생님, 대답 해 주셔서 감사합니다. 내 대답을 참조하십시오. 나는 새로운 것을 시도해 봤고 그것은 나를 위해 잘 작동하고있다. 이것은 다른 것이지만이 짧은 코드는 모두 나를 위해 해냈습니다. –

관련 문제