복붙노트

[SPRING] 스프링 부트 이해 @Autowired

SPRING

스프링 부트 이해 @Autowired

봄 부츠 어노테이션 @Autowired가 올바르게 작동하는지 이해할 수 없습니다. 다음은 간단한 예입니다.

@SpringBootApplication
public class App {
    @Autowired
    public Starter starter;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
    public App() {
        System.out.println("init App");
        //starter.init();
    }
}

--

@Repository
public class Starter {
    public Starter() {System.out.println("init Starter");}
    public void init() { System.out.println("call init"); }
}

이 코드를 실행하면 init app 및 init Starter 로그가 생성되므로 봄에이 객체를 만듭니다. 하지만 App의 Starter에서 init 메소드를 호출하면 NullPointerException이 발생합니다. 내 객체를 초기화하기 위해 @Autowired 주석을 사용하면 더 할 일이 있습니까?

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'app': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [{package}.App$$EnhancerBySpringCGLIB$$87a7ccf]: Constructor threw exception; nested exception is java.lang.NullPointerException

해결법

  1. ==============================

    1.App 클래스의 생성자에서 init 메소드를 호출하면 Spring은 App 객체에 종속성을 자동으로 제공하지 않습니다. Spring이 App 객체의 생성과 autowiring을 완료 한 후에이 메소드를 호출하려면, 다음과 같이 @PostConstruct 주석을 가진 메소드를 추가하십시오.

    App 클래스의 생성자에서 init 메소드를 호출하면 Spring은 App 객체에 종속성을 자동으로 제공하지 않습니다. Spring이 App 객체의 생성과 autowiring을 완료 한 후에이 메소드를 호출하려면, 다음과 같이 @PostConstruct 주석을 가진 메소드를 추가하십시오.

    @SpringBootApplication
    public class App {
        @Autowired
        public Starter starter;
    
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
    
        public App() {
            System.out.println("constructor of App");
        }
    
        @PostConstruct
        public void init() {
            System.out.println("Calling starter.init");
            starter.init();
        }
    }
    
  2. from https://stackoverflow.com/questions/38476486/understanding-spring-boot-autowired by cc-by-sa and MIT license