티스토리 뷰
<Spring 환경>
new로 객체 생성을 했을 때, 그 생성한 객체를 통해 bean 등록이 되어있는 service 객체를 사용하고 싶을 때가 있다.
예를 들어, Thread 안에서 서비스 객체를 불러서 쓰고 싶을 때가 그런 경우인데.
이때 Thread 클래스에서 그냥 @Autowired할 경우 nullpointerexcecption이 떨어진다.
그러면 어떻게 해야 하나?
만들어진 서비스 빈을 빈 네임으로 불러서 가져오면 된다.
1. Bean을 가져오기 위해서는 ApplicationContext가 일단 필요하다.
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
applicationContext = ctx;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
2. 그 다음 ApplicationContext를 사용하는 BeanUtils를 만들어준다.
import org.springframework.context.ApplicationContext;
public class BeanUtils {
public static Object getBean(String beanName) {
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
return applicationContext.getBean(beanName);
}
}
3. 아래는 예약다운로드 하는 Thread(쓰레드)에서 불러온 빈을 사용하는 예시다.
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.MethodNotSupportedException;
import com.admin.services.MemberService;
public class ReservationUtil extends Thread{
private int mYear, mMonth, mDay, mHour, mMinute;
private HttpServletResponse res;
private HttpServletRequest req;
private HashMap<String, Object> param = new HashMap<String, Object>();;
// 서비스!
private MemberService memberService;
public ReservationUtil(int year, int month, int day, int hour, int minute, HashMap<String, Object> paramMap, HttpServletResponse response, HttpServletRequest request) throws MethodNotSupportedException{
mYear = year;
mMonth = month;
mDay = day;
mHour = hour;
mMinute = minute;
this.res = response;
this.req = request;
this.param = paramMap;
// 서비스 Bean을 가져온다! 이렇게 사용.
memberService = (MemberService) BeanUtils.getBean("memberServiceImpl");
}
@Override
public void run() {
System.out.println("run 들어감.");
try {
// 이때까지 잠깐 타임!
sleep(timeUntil(mYear, mMonth, mDay, mHour, mMinute));
// 일 시작.
work();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void work() {
System.out.println("일 시작함~");
try {
// 여기서 서비스 객체 사용.
memberService.downloadMemberList(param, res, req);
} catch (Exception e) {
e.printStackTrace();
}
}
public long timeUntil(int year, int month, int day, int hour, int minute) {
Date now = new Date();
Calendar calUntil = Calendar.getInstance();
calUntil.set(Calendar.YEAR, year);
calUntil.set(Calendar.MONTH, month - 1);
calUntil.set(Calendar.DATE, day);
calUntil.set(Calendar.HOUR_OF_DAY, hour);
calUntil.set(Calendar.MINUTE, minute);
calUntil.set(Calendar.SECOND, 0);
Date until = calUntil.getTime();
long sleep = until.getTime() - now.getTime();
return sleep;
}
}
<참고한 곳>
'공장 (factory) > - Programming..' 카테고리의 다른 글
[javascript/jQuery/bootstrap4] 메시지Modal 커스텀. (0) | 2020.01.09 |
---|---|
[MSSQL] UPDATE문에 JOIN/LEFT JOIN/INNER JOIN 사용하기. (0) | 2019.11.12 |
[eclipse] Remote System Explorer Operation 해제 (0) | 2019.10.23 |
[MSSQL/Mybatis] Merge, insert/update 한 번에 처리하기. (0) | 2019.10.15 |
[Javascript/jQuery] 페이지 이동 후에도 체크박스 체크 상태 유지 (0) | 2018.08.31 |
댓글