방법1.
빈에 @Scope 어노테이션을 이용한다.
예) 로그인 정보를 어디선가(예. 인터셉터)에서 넣어준다고 할 때 아래와 같이 로그인 정보를 담는 요청 스코프의 빈을 만들 수 있다.
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class LoginHolder {
private Login login;
protected void setLogin(Login login) {
this.login = login;
}
public Login getLogin() {
return login;
}
}
실제로 스프링에서는 해당 구현을 ThreadLocal등에 map의 형태로 관리한다.
자세한 것은 아래 소스코드 참고.
방법2.
여러 컨트롤러에서 공통된 객체 (예. 로그인 정보)를 받는다면 org.springframework.web.method.support.HandlerMethodArgumentResolver 인터페이스를 구현하는 것도 좋다.
supportsParameter가 true가 되면 resolveArgument에 해당 객체를 넣어주는 것을 구현하면 된다.
예)
public class LoginArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private LoginHolder loginHolder;
@Override
public boolean supportsParameter(MethodParameter parameter) {
return Login.class.isAssignableFrom(parameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
return loginHolder.getUser();
}
}
supportsParameter에서 특정 어노테이션이 붙어 있는지에 따라 판단하게 하려면 getParameterAnnotation으로 가져온 레퍼런스가 null인지 비교하면 된다.
'Programing > Framework' 카테고리의 다른 글
[스프링] ReloadableResourceBundleMessageSource 관련한 테스트 에러 (0) | 2018.02.27 |
---|---|
[스프링] URI 만드는 구성 요소 UriComponentsBuilder (0) | 2018.02.27 |
[Spring] afterCompletion 에서 annotation으로 로그 찍기 (0) | 2016.09.13 |
[Spring] 스프링에서 정적리소스 설정하기 (0) | 2016.09.13 |
[Spring] @Controller에서 @RequestParam로 Date 타입 받기. (0) | 2016.09.08 |