본문 바로가기
개발아닌개발/springboot

Autowired 안 될때 Bean 주입받아 해결하기(autowired Class is null 문제해결)

by 불청객 2022. 1. 10.
반응형

Spring Tool Suite 4(Spring Boot)

 

 

 

통신을 위한 주소와 포트번호를 Get,Set하며 여러 클래스에서 사용하고 있으며

주소와 포트번호는 언제 바뀔지 모르니 @Autowired 를 이용하여 SettingConfig(Class)를 불러와 사용하고 있다.

 

 

 

그러던 중

New로 생성한 Class에서 @Autowired SettingConfig 는 null이라며

멤버변수로 선언된 주소와 포트번호를 못가져오는 상황이 발생

 

 

당장 프로퍼티로 개선하기 위해 다방면 찾아봤으나, 

결국 프로퍼티클래스도 Autowired길을 걸어야하는 법

더보기

ConfigurationProperties null 

application.yml, application.properties 시도

등등 진짜 온갖거 다해봤음 ㅠ_ㅠ 

 

지난주에 거의 좌절감안고 ..  월요일 맞이

 

 

 

 

NULL 에러만 여러 차례보다가 Bean을 주입받는 방법을 발견

 

 

 

 

ApplicationContextProvider.java 

  • 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 {
		// TODO Auto-generated method stub
		applicationContext = ctx;
	}
	
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
}

 

 

BeanUtils.java

  • Bean을 주입받는 메소드
  • 주석처리된 코드가 있는데 사용가능한 코드다만, 나는 개선된 getBean을 적용해보았다.
import org.springframework.context.ApplicationContext;

import lombok.experimental.UtilityClass;

@UtilityClass
public class BeanUtils {
	
	public static <T> T getBean(Class<T> classType){
		ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
		return applicationContext.getBean(classType);
	}
	
//	public static Object getBean(Class<?> classType){
//		ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
//		return applicationContext.getBean(classType);
//	}
}

 

 

 

이렇게 되면 준비는 끝

autowired Class is null이 문제가 되었던 코드로 돌아가 해결한다.

 

 

 

 

Test Sample 코드

  • getBean 메소드의 파라메터로 주입할 Class를 전달하면 됨
public class RbSubscriber extends RabbitMQClient {

	.
	.

//	@Autowired SettingConfig settingConfig;
	private SettingConfig settingConfig;

    protected void workerThreadStart(){
        settingConfig = BeanUtils.getBean(SettingConfig.class);
    	System.out.println(settingConfig.getAddress());
    	System.out.println(settingConfig.getPort());
    }
}

 

 

 

 

상세한 글 덕분에 문제해결하고 기록중

자세한 정보는 하기 링크를 참조

출처 : https://jeong-pro.tistory.com/174

 

New로 생성한 Instance에서 Bean이 필요할 때 @Autowired 대신 Bean 주입 받는 방법(Spring boot에서 ApplicationC

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

jeong-pro.tistory.com

728x90
반응형

댓글