본문 바로가기

웹/spring boot

@PostConstruct 란?

스프링 빈의 생성자에 대한 어노테이션이다.

 

1. @PostConstruct 란?

의존성 주입이 이루어진 후 초기화를 수행하는 메서드에 적용을 한다.

즉, 어떤 스프링 빈이 자신의 생성자로 초기화 되기 전에

실행되어야 하는 메서드에 적용되는 어노테이션이다.

이 메서드는 다른 리소스에서 호출되지 않는다해도 수행이된다.

WAS 가 띄워질 때 @PostConstruct로 설정된 메소드가 실행된다.

예를 들어보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
    }
}
cs

@Inject 는 java에서 지원하는 어노테이션으로 특정 프레임워크에 종속되지 않는다.

@Inject 사용을 위해서 javax 라이브러리 의존성 추가를 해야한다.

@Inject는 @Autowired 처럼 주입하려는 객체의 타입이 일치하는 객체를 자동 주입한다.

@Autowired와 마찬가지로 필드, setter에 사용할 경우 기본생성자가 정의되어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo2 {
 
    @Autowired
    Bar bar;
    
    Foo() {
        System.out.println(bar); // null
        System.out.println("bar does not injected");
    }
    
    @PostConstruct
    public void barInit() {
        System.out.println(bar); // package.Bar@...
        System.out.println("bar is injected.");
    }
}
cs

 

2. 11버전에서

11버전에서는 못쓴다. 9버전 이후로 deprecate 되었기 때문

만약 사용하려면 javax.annotation-api 종속성을 추가해야된다.

Spring의 경우 InitailizingBean 과 DisposableBean 인터페이스를 구현해서 

@PostConstruct , @PreDestroy를 대체할 수 있다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.springframework.beans.factory.DisposableBean; 
import org.springframework.beans.factory.InitializingBean; 
 
@Component 
public class TestComponent implements InitializingBean, DisposableBean{
 
    @Override public void afterPropertiesSet() throws Exception { 
        // @PostConstruct 대체 
    } 
    @Override public void destroy() throws Exception {
         // @PreDestroy 대체
    } 
}
 
출처: https://devbible.tistory.com/461 
cs

 

' > spring boot' 카테고리의 다른 글

에러페이지 처리  (0) 2021.06.11
view 부분 구현해보기  (0) 2021.03.25