@PostConstruct를 사용하는 이유
관리용 콩에@PostConstruct
는 일반 Java 오브젝트 컨스트럭터 뒤에 호출됩니다.
내가 왜?@PostConstruct
일반 컨스트럭터 자체가 아니라 콩으로 초기화해야 하는 건가요?
왜냐하면 컨스트럭터가 호출되었을 때 콩은 아직 초기화되지 않았기 때문입니다.즉, 의존관계는 주입되지 않습니다.에서
@PostConstruct
bean이 완전히 초기화되어 종속성을 사용할 수 있는 방법입니다.이 계약은 이 메서드가 빈 라이프 사이클에서 한 번만 호출된다는 것을 보증하기 때문입니다.내부 작업 중 컨테이너에 의해 콩이 여러 번 인스턴스화 되는 경우가 발생할 수 있지만 다음과 같은 것이 보증됩니다.
@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
'programing' 카테고리의 다른 글
Vuex: 다른 모듈에서 액세스 상태 (0) | 2022.07.07 |
---|---|
루프를 만들 때 Vue Js에서 특정 번호 범위를 표시하는 방법은 무엇입니까? (0) | 2022.07.07 |
변수 이름은 C의 메모리에 어떻게 저장됩니까? (0) | 2022.07.04 |
Vue.js 또는 Nuxt.js 일원화된 애플리케이션 구성 (0) | 2022.07.04 |
Mac OS X 및 여러 Java 버전 (0) | 2022.07.04 |