2014-10-28 4 views
1

나는 TaskTaskHandler을 가지고있다.스프링 부트의 빈 관리에 관한 패턴

처리기 액세스 DB는 DaoService입니다. DaoService은 Spring Container에 의해 으로 관리되지만 핸들러는 new에 의해 생성되고 Spring Container에 의해 관리되지 않습니다.

그래서 나는 에 의해 처리기의 DaoService에 액세스 할 수 없다고 생각합니다.

그래서 나는 DaoService을 처리기로 전달하려고 시도했습니다. 그러나 나는 그것을 전달하는 방법을 모르겠습니다. 나의 현재의 구현에서

는 :

1, 나는 작업에 DaoService을 설정합니다. Taskcall()에서

public Task generateTask(Param param, DaoService dao) 
{ 
    Task task = new Task(); 
    task.setDao(dao); 
    task.setparam(getTaskParam(param)); 
    return task; 
} 

2

는 내가 처리기에 DaoService을 설정합니다. 마침내
class Task implements Callable<Boolean> 
{ 
    DaoService dao; 
    // getter and setter 
    public boolean call() 
    { 
     TaskHandler handler = TaskHandlerMap.getHandler(); 
     handler.setDaoService(dao); 
     return handler.process(param); 
    } 
} 

3

는, 나는 main() 나는 generateTask가() 작업을 얻기 위해 전화를 내.

class MainClass() 
{ 
    @Autowired 
    DaoService dao; 

    Param param = new Param(); 

    public static void main(String[] args) 
    { 
     Task task = generateTasks(param, dao); 
     // submit the task to thread pool. 
    } 
} 

내 문제는 다음과 같습니다

1, Task는 회원이 DaoService라는 포함 할 수 없습니다, TaskDaoService와는 아무 이 없습니다, TaskTaskHandler에 대한 유일한 우려해야한다.

2, DaoServicegenerateTasks()으로 전달하면 안됩니다. TaskDaoService이 없어도 이 될 수 있습니다.

어떻게 피 하시겠습니까? 아니면 좋은 조언?

도움을 주시면 감사하겠습니다. @AndyWilkinson 조언, 어쩌면이 같은 코드에 따르면

:

업데이트

class TaskHandlerMap 
{ 
    @Autowired 
    private static XXXHandler xxxHandler; 

    private static Map<String,AbstractItemHandler> map = Maps.newHashMap(); 

    static 
    { 
     map.put(Constants.XXX_PATH, xxxHandler); 
    } 


    public static AbstractItemHandler get(String key) 
    { 
     return map.get(key); 
    } 

} 

하지만 정적 필드를 자동 설정할 수 수 있다고 생각하지 않습니다.

+0

당신은 왼쪽 무엇 코드를 충분히 제거하기 위해 관리했습니다 심지어 유효하지 않습니다, 그래서 당신이 요구하는지 정확히 말해 불가능하다. 서로 다른 종류의 작업에 서로 다른 종속성이 필요하고 DAO를 모든 작업에 명시 적으로 전달하고 싶지 않다는 의견이 있으면 추상 팩토리가 필요할 것입니다. – chrylis

+0

@chrylis 죄송합니다. 제 질문에 대해 명확하게 설명하지 않았으므로 질문을 업데이트하고 저를 이해할 수 있기를 바랍니다. – NingLee

+1

여전히 메소드 변수를 autowire 할 수 없습니다. – chrylis

답변

0

TaskHandlerMap에서 정적 방법이나 필드를 사용할 필요가 없습니다. 대신, Spring bean으로 TaskHandlerMap을 선언하면, Spring은 하나의 인스턴스가 있음을 보장 할 것이다. 그런 다음 Spring이 모든 종속성을 클래스에 삽입하고이를 사용하여 맵을 작성할 수 있습니다. 이 같은

뭔가가 :

@Component 
class TaskHandlerMap { 

    private final Map<String, AbstractItemHandler> handlerMap = Maps.newHashMap(); 

    @Autowired 
    TaskHandlerMap(XXXHandler handler) { 
     handlerMap.put(Constants.XXX_PATH, handler); 
    } 

    public AbstractItemHandler get(String key) { 
     return handlerMap.get(key); 
    } 
} 
관련 문제