[Spring 오류 노트] 자신 이 새로 나 온 bean 에서 @ Autowired 주해 로 수 정 된 속성 보고 빈 포인터 이상: java. lang. NullPointException
10135 단어 일상 오류
이상 설명
원래 제 가 RabbitMQ 의 전송 프로그램 을 다시 테스트 했 는데 그 안에
AmqpTemplate
인 터 페 이 스 를 사 용 했 고 @Autowired
주 해 를 사 용 했 습 니 다.그러나 내 가 AmqpTemplate
의 convertAndSend()
방법 을 사 용 했 을 때 항상 빈 지침 이상 을 알 렸 다. 자바. 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+"#############"
이상 분석
이해 해 야 할 전제:
이상 분석: 우 리 는 결 과 를 보고 네 마디 를 출력 했다.
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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android RelativeLayout 에서 작은 문 제 를 사용 합 니 다.Relative Layout 는 프로젝트 에서 없어 서 는 안 된다 고 할 수 있 지만 최근 에 사용 할 때 예전 에 주의 하지 않 았 던 문 제 를 발 견 했 습 니 다.저 는 Relative Layout 에서 두...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.