티스토리 뷰

<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;
	}

}

 

<참고한 곳>

 

자바 스케쥴링 & 타이머 방법들

종종 어플리케이션은 백그라운드에서 정해진 시간간격으로 특정한 일을 하고 싶을때가 있습니다. 그때 사용하도록 아래와 같이 3가지 다른 스케쥴링하는 방법을 소개합니다. simple thread TimerTask ScheduledExe..

hamait.tistory.com

 

New로 생성한 Instance에서 Bean이 필요할 때 @Autowired 대신 Bean 주입 받는 방법(Spring boot에서 ApplicationContext를 가져와서 넣어버리기)

Spring boot에서 Bean 주입 받기 일반적으로 많이 사용하는 WebApplication을 개발하다보면 자연스럽게 @Repository, @Service, @Controller, @Component, ...등을 이용해서 bean으로 등록하고 Bean으로 등록되는..

jeong-pro.tistory.com

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함