programing

@PostConstruct를 사용하는 이유

copyandpastes 2022. 7. 7. 23:52
반응형

@PostConstruct를 사용하는 이유

관리용 콩에@PostConstruct는 일반 Java 오브젝트 컨스트럭터 뒤에 호출됩니다.

내가 왜?@PostConstruct일반 컨스트럭터 자체가 아니라 콩으로 초기화해야 하는 건가요?

  • 왜냐하면 컨스트럭터가 호출되었을 때 콩은 아직 초기화되지 않았기 때문입니다.즉, 의존관계는 주입되지 않습니다.에서@PostConstructbean이 완전히 초기화되어 종속성을 사용할 수 있는 방법입니다.

  • 이 계약은 이 메서드가 빈 라이프 사이클에서 한 번만 호출된다는 것을 보증하기 때문입니다.내부 작업 중 컨테이너에 의해 콩이 여러 번 인스턴스화 되는 경우가 발생할 수 있지만 다음과 같은 것이 보증됩니다.@PostConstruct는 한 번만 호출됩니다.

주요 문제는 다음과 같습니다.

컨스트럭터에서 종속성이 아직 주입되지 않았습니다.*

*명백히 컨스트럭터 주입 제외


실제 예:

public class Foo {

    @Inject
    Logger LOG;

    @PostConstruct
    public void fooInit(){
        LOG.info("This will be printed; LOG has already been injected");
    }

    public Foo() {
        LOG.info("This will NOT be printed, LOG is still null");
        // NullPointerException will be thrown here
    }
}

중요:@PostConstruct그리고.@PreDestroy Java 11에서 완전히 제거되었습니다.

계속 사용하려면 종속성에 javax.annotation-api JAR을 추가해야 합니다.

메이븐

<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

그라들

// https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api
compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'

클래스가 컨스트럭터에서 모든 초기화를 수행할 경우@PostConstruct정말 장황합니다.

그러나 클래스에 setter 메서드를 사용하여 종속성이 주입되어 있는 경우 클래스의 컨스트럭터는 개체를 완전히 초기화할 수 없습니다.또한 모든 setter 메서드가 호출된 후에 일부 초기화가 수행되어야 합니다.따라서 사용 예:@PostConstruct.

또한 어떤 종류의 프록시 또는 원격 작업이 수반될 때마다 컨스트럭터 기반 초기화가 의도한 대로 작동하지 않습니다.

CT는 EJB가 역직렬화될 때마다 호출되며, 새로운 프록시가 생성될 때마다 호출됩니다.

언급URL : https://stackoverflow.com/questions/3406555/why-use-postconstruct

반응형