프로그램을 실행하면 다른 방법과 동일한 결과를 얻을 수 있습니다.
빈 초기화 이름: John Mayer 나이: 39 빈 초기화 기본 가수 이름 설정 이름: Eric Clapton 나이: 72 빈 초기화 빈 구성 도중 에러 발생: Error creating bean with name 'singerThree': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: class com.apress.prospring5.ch4.SingerWithJSR250 빈 타입에는 반드시 age 프로퍼티를 설정해야 합니다.
세 가지 방법은 모두 제각각 장단점이 있습니다. 초기화 메서드를 사용하면 애플리케이션이 스프링과 결합되지 않는 효과가 있지만 초기화가 필요한 모든 빈을 빠짐없이 구성에 등록해야 합니다. InitializingBean 인터페이스를 사용하면 빈 클래스의 모든 인스턴스 초기화 콜백을 한번에 지정할 수 있지만 애플리케이션을 스프링에 결합해야 합니다. 애너테이션을 사용할 때는 메서드에 애너테이션을 적용해야 하고 사용하는 IoC 컨테이너가 JSR-250을 확실히 지원해야 합니다. 결국 어떤 접근 방법을 사용할지는 애플리케이션 요구사항에 따라야 합니다. 이식성이 중요하다면 초기화 메서드나 애너테이션을 사용합니다. 그렇지 않다면 InitializingBean 인터페이스를 사용해 애플리케이션이 해야 할 구성을 줄여서, 구성 오류로 인해 애플리케이션에 잠재하는 에러 발생 가능성을 낮춰야 합니다.
Note init-method나 @PostConstruct로 초기화 구성을 할 때는 접근 권한을 다르게 하여 초기화 메서드를 정의할 수 있는 장점이 있습니다. 초기화 메서드는 반드시 스프링 IoC 컨테이너가 빈 생성 시점에 한 번만 호출해야 합니다. 이를 반복적으로 호출하면 예상치 못한 결과가 발생하거나 심지어 애플리케이션에 장애가 발생합니다. 초기화 후 외부에서 또다시 초기화 메서드를 호출할 수 없게 하려면 초기화 메서드의 접근 권한을 private으로 정의해야 합니다. 이렇게 하면 스프링 IoC 컨테이너는 이 메서드를 리플렉션으로 호출할 수 있지만, 다른 빈이나 애플리케이션 코드에서는 이를 호출할 수 없습니다.