2009-06-06 5 views
4

데이터베이스 마이그레이션을 사용할 때, 분명히 마이그레이션을 실행하기 전에 DAO를 사용할 수 없기를 바란다.많은 bean을 만드는 짧은 방법은 하나의 bean에 의존한다.

현재 은 DAO 중 많은 숫자가이며 모두 depends-on=databaseMigrator입니다. 특히 오류가 발생하기 쉽기 때문에 문제가 있음을 알았습니다.

더 간단한 방법이 있습니까?


주 :

답변

3

당신은 자동으로 종속성을 등록 할 BeanFactoryPostProcessor 인터페이스를 구현하는 클래스를 작성 시도 할 수 :

경고 :이 클래스는 컴파일되지 않았습니다.

public class DatabaseMigratorDependencyResolver implements BeanFactoryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
     String[] beanNames = beanFactory.getBeanDefinitionNames(); 
     for (String beanName : beanNames) { 
      BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); 

      // Your job is here: 
      // Feel free to make use of the methods available from the BeanDefinition class (http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/config/BeanDefinition.html) 
      boolean isDependentOnDatabaseMigrator = ...; 

      if (isDependentOnDatabaseMigrator) { 
       beanFactory.registerDependentBean("databaseMigrator", beanName); 
      } 
     } 
    } 

} 

그런 다음이 클래스의 빈을 다른 모든 빈과 함께 포함 할 수 있습니다.

<bean class="DatabaseMigratorDependencyResolver"/> 

스프링은 나머지 빈 시작을 시작하기 전에 자동으로 실행됩니다.

+0

감사합니다. –

+0

아무도 내 솔루션이 마음에 들지 않으므로 답변을 선택하겠습니다. 감사! –

3

응용 프로그램 시작시이 작업을 수행합니다. 응용 프로그램에 필요한 스키마 버전은 빌드 프로세스의 일부로 응용 프로그램에 컴파일됩니다. 또한 데이터베이스에 저장되고 데이터베이스 이주 스크립트에 의해 갱신됩니다.

응용 프로그램 시작시 응용 프로그램은 데이터베이스의 스키마 버전이 예상 한 버전인지 확인하고 그렇지 않은 경우 오류 메시지가 나타나면 즉시 중단합니다.

정상적인 Java 프로그램에서이 문제는 main 메소드가 시작될 때 발생합니다.

웹 응용 프로그램에서는 응용 프로그램의 ServletContextListener에 의해 수행되며 서블릿 컨텍스트가 만들어 질 때 가장 먼저 수행됩니다.

그건 내 (애플 리케이션) 베이컨 여러 번 저장되었습니다.

+0

답변 해 주셔서 감사합니다. 모든 데이터 소스가 이미 선언 되었기 때문에 Spring 솔루션을 찾고있었습니다. –

+0

이것을 구현하기 위해 Spring을 사용할 수있을 것입니다. 이 경우 실제로 도움이되는지 여부가 또 다른 질문입니다. – Nat

+0

스프링 사용 여부가 도움이 될까요? 확실히 데이터 소스 정의를 단일체로 유지함으로써 개발자가 Spring 외부의 구성 요소를 추가하는 것에 놀라움을 금치 못했습니다. –

3

내가 맥락에서 나타나는 간단한 ForwardingDataSource 클래스를 생성 결국은 파일 :

<bean id="dataSource" class="xxx.ForwardingDataSource" depends-on="databaseMigrator"> 
    <property name="delegate"> 
     <!-- real data source here --> 
    </property> 
</bean> 

Adam Paynter's solution보다 더 우아한, 그러나 명확하게 찾을 경우.

관련 문제