나는 Task
과 TaskHandler
을 가지고있다.스프링 부트의 빈 관리에 관한 패턴
처리기 액세스 DB는 DaoService
입니다. DaoService
은 Spring Container에 의해 으로 관리되지만 핸들러는 new
에 의해 생성되고 Spring Container에 의해 관리되지 않습니다.
그래서 나는 에 의해 처리기의 DaoService
에 액세스 할 수 없다고 생각합니다.
그래서 나는 DaoService
을 처리기로 전달하려고 시도했습니다. 그러나 나는 그것을 전달하는 방법을 모르겠습니다. 나의 현재의 구현에서
는 :
1, 나는 작업에 DaoService을 설정합니다. Task
의 call()
에서
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
라는 포함 할 수 없습니다, Task
는 DaoService
와는 아무 이 없습니다, Task
TaskHandler
에 대한 유일한 우려해야한다.
2, DaoService
은 generateTasks()
으로 전달하면 안됩니다. Task
은 DaoService
이 없어도 이 될 수 있습니다.
어떻게 피 하시겠습니까? 아니면 좋은 조언?
도움을 주시면 감사하겠습니다. @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);
}
}
하지만 정적 필드를 자동 설정할 수 수 있다고 생각하지 않습니다.
당신은 왼쪽 무엇 코드를 충분히 제거하기 위해 관리했습니다 심지어 유효하지 않습니다, 그래서 당신이 요구하는지 정확히 말해 불가능하다. 서로 다른 종류의 작업에 서로 다른 종속성이 필요하고 DAO를 모든 작업에 명시 적으로 전달하고 싶지 않다는 의견이 있으면 추상 팩토리가 필요할 것입니다. – chrylis
@chrylis 죄송합니다. 제 질문에 대해 명확하게 설명하지 않았으므로 질문을 업데이트하고 저를 이해할 수 있기를 바랍니다. – NingLee
여전히 메소드 변수를 autowire 할 수 없습니다. – chrylis