[Spring 오류 노트] 자신 이 새로 나 온 bean 에서 @ Autowired 주해 로 수 정 된 속성 보고 빈 포인터 이상: java. lang. NullPointException

10135 단어 일상 오류
자신 new 에서 나 온 bean 중 @ Autowired 주석 으로 수 정 된 속성 이 빈 포인터 이상 을 알 립 니 다.
이상 설명
원래 제 가 RabbitMQ 의 전송 프로그램 을 다시 테스트 했 는데 그 안에 AmqpTemplate 인 터 페 이 스 를 사 용 했 고 @Autowired 주 해 를 사 용 했 습 니 다.그러나 내 가 AmqpTemplateconvertAndSend() 방법 을 사 용 했 을 때 항상 빈 지침 이상 을 알 렸 다. 자바. lang. NullPoint Exception
오류 코드
수 정 된 문제 코드 재현 가능:
@Component
public class Test 
{	//          

    @Autowired
    AmqpTemplate amqpTemplate;

    public Test() {
        System.out.println("constructer: amqpTemplate"+Objects.isNull(amqpTemplate)+"#############");
    }

	@PostConstruct  //         Autowired      
    public  void init(){
        System.out.println("init:amqpTemplate"+Objects.isNull(amqpTemplate)+"#############");
    }

    public void send(){ //       
        System.out.println("send: amqpTemplate"+Objects.isNull(amqpTemplate)+"#############");
    }
}

public class TestController{
	
	@GetMapper("...  ")
	public void testMethod(){
		Test test = new Test(); //    new,    Controller @Autowired   
		test.send();
	}
}



결실
//      
constructer: amqpTemplate true+"#############"
init: amqpTemplate false+"#############"
constructer: amqpTemplate true+"#############"
send: amqpTemplate true+"#############"


이상 분석
이해 해 야 할 전제:
  • 구조 방법 과 @ Autowired 와 @ PostConstruct 의 실행 순 서 는: constructor > @ Autowired > @ PostConstruct
  • 입 니 다.
  • @ PostConstruct 수식 방법 은 @ Autowired 주입 후 실 행 됩 니 다
  • 상황 은 이렇다.
  • 우 리 는 Test 클래스 에서 @ Component 를 발 표 했 기 때문에 프로젝트 가 시 작 될 때 Spring 은 Test 클래스 를 구축 하여 Spring Bean 용기
  • 에 넣 습 니 다.
  • 저 희 는 Test 클래스 에서 @ Autowired 주해 방식 으로 속성 을 주입 합 니 다. 즉, Spring 방식 으로 AmqpTemplate 인 스 턴 스
  • 를 얻 습 니 다.
  • 저 희 는 TestController 류 에서 @ Autowired 방식 으로 Test 인 스 턴 스 를 얻 지 않 고 자체 new
  • 를 사용 합 니 다.
    이상 분석: 우 리 는 결 과 를 보고 네 마디 를 출력 했다.
    constructer: amqpTemplate true+"#############"
    init: amqpTemplate false+"#############"
    constructer: amqpTemplate true+"#############"
    send: amqpTemplate true+"#############"
    
  • 첫 번 째 말 은 @Component 주해 의 역할 이 분명 하 다. 즉, spring 은 Test 류 의 인 스 턴 스 를 구축 하여 Spring Bean 용기 에 넣 었 는데 이때 amqpTemplate 는 아직 주입 되 지 않 았 기 때문에 null
  • 이다.
  • 두 번 째 문장 은 스프링 용기 가 구 축 될 때 Init 방법 이 촉발 되 었 는데 이때 amqpTemplate 는 이미 @Autowried 주입 을 거 쳤 기 때문에 false 이 고 null 이 아니다.Spring 용기 의 amqpTemplate 은 Test 인 스 턴 스 의 amqpTemplate 속성 에 주입 되 었 습 니 다.
  • 세 번 째 문장 은 바로 중점 입 니 다. 우리 가 TestController 에서 집행 한 new Test() 방법 입 니 다. 인위적으로 Test 의 구조 함 수 를 촉발 시 켰 습 니 다. Spring 용기 가 아 닙 니 다.이때 의 amqpTemplate 사례 에서 우 리 는 true 라 는 것 을 발견 했다.하지만 구조 함수 단계 에 서 는 null 도 정상 입 니 다.
  • 네 번 째 문장 은 구조 함수 와 @Autowired 주입 init 방법 에 따라 촉발 된다.우 리 는 amqpTemplate 이 비어 있 는 지, 아니면 true 인지, 즉 @Autowired 주입 에 성공 하지 못 한 것 을 발견 했다.

  • 자, 문제 의 소 재 를 발 견 했 습 니 다. 즉, 자신의 new test 인 스 턴 스 를 발 견 했 을 때 Test 류 의 amqpTemplate 속성 은 주입 되 지 않 았 습 니 다.
    결론.
    왜 빈 지침 이 이상 합 니까?이것 은 확실히 좋 은 문제 이다. 사실 매우 멍청 하 다. 왜냐하면 본질 적 인 문 제 는 Spring 의 체제 에 대해 잘 모 르 기 때문이다.원인:
    그 이 유 는 @ Autowired 주석 이 들 어 있 는 Bean 입 니 다. 우 리 는 Spring 방식 으로 이 Bean 을 얻어 야 합 니 다. 스스로 new 를 얻 을 수 없습니다.자신 이 new 로 나 온 bean 은 Spring 용 기 를 통 해 자신 이 필요 로 하 는 bean 을 얻 을 수 없 기 때 문 입 니 다. 간단하게 이해 할 수 있 습 니 다. 모두 Spring 용 기 를 사용 하여 관리 해 야 합 니 다. 그렇지 않 으 면 사용 하지 않 습 니 다. 당신 의 new 물건 은 Spring 용기 에 들 어 가 는 입장권 이 없습니다.
    다른 사람의 답 을 도입 합 니 다: 즉, 특정한 유형의 구성원 이 @ Autowired 로 Spring Bean 을 주입 한다 면 현재 클래스 의 인 스 턴 스 는 Spring Bean 이 어야 성공 적 으로 주입 할 수 있 습 니 다. 즉, 이 인 스 턴 스 는 new xxx () 로 얻 을 수 없습니다. 이런 방식 으로 얻 은 인 스 턴 스 는 @ Autowired 가 주입 한 Bean 을 호출 할 수 없고 @ Autowired 로 주입 해 야 합 니 다.
    해결 방안
    그래서 해결 방안 은 간단 하 다.
    public class TestController{
    	@Autowired
    	Test test;
    	
    	@GetMapper("...  ")
    	public void testMethod(){
    
    		this.test.send();
    	}
    }
    

    좋은 웹페이지 즐겨찾기