LocalContainerEntityManagerFactoryBean 을 이용해서 직접 Bean 을 등록할 때

LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
return emf.getObject();

를 하면 null 이 리턴된다.

이유는 LocalContainerEntityManagerFactoryBeanAbstractEntityManagerFactoryBean 을 상속하여 구현하는데 이 클래스의 메소드 afterPropertiesSet() 가 모든 속성값이 세팅이 다 됐음을 알리는 역할을 한다.

XML 로 Bean 설정을 하면 BeanFactory 가 이 메소드를 호출하지만 Annotation 으로 Bean 을 등록할 때에는 직접 호출해줘야 한다.

따라서 위 코드에서 getObject() 를 호출하기 전에 afterPropertiesSet() 을 호출하여 설정이 완료됐음을 알리고 오브젝트를 가져와야 한다.

LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.afterPropertiesSet()
return emf.getObject();