2016-09-26 2 views
0

Guice에서 Spring DI로 내 애완 동물 프로젝트를 옮겼다. 나는 약간의 노트를 공유하고 조언을 구합니다. guice config는 주석 (유일한 방법)으로 완료되었으며, Spring 설정은 @Configuration으로 주석 처리 된 하나의 AppConfig 클래스와 @Bean 내부에 주석 처리 된 많은 빈 생성 메소드도 포함합니다.Guice에서 Spring으로 이동 : 기본 생성자 및 속성 처리를 사용하는 bean

관찰과 질문 :

  1. 봄의 구성이 기본적으로 인자없는 생성자를 콩을 만들 수없는 방법이 가득 : 확실히 나쁜

    @Bean 
    public DataProvider getDataProvider() { 
        return new DataProvider(); 
    } 
    

    이잖아. Guice는 추가 구성없이 기본 생성자로 콩을 인스턴스화합니다. 봄에 에서이 작업을 수행 할 수 있습니까? 나는 만약 내가 @Component annotation을 클래스 패스와 함께 추가하면 트릭을 할 것이라는 것을 안다. 그러나 : 1. @Component로 주입하는 은 @Bean 2로 주입하는 것과 다릅니다. @Autowired를 추가하는 것보다 더 많은 파일로 구성을 분산시켜야합니다. 그 나쁜. 하나의 장소에 모든 설정을 유지하는 유일한 해결책은 오래된 XML 구성이지만 다시 모든 bean을 명시 적으로 선언하는 것입니다. 또는 나는 틀렸고 봄에 더 잘할 수 있습니까?

  2. 속성 파일 처리. Guice와 함께 작업하면서 나는 나쁜 것을 한 것입니다. 속성 값을 주입 한 수많은 개인 필드를 따라 @Named 주석을 분산 시켰습니다. 때로는 어떤 클래스에 5 가지 속성을 주입 할 수 있으며, 이로 인해 5 가지 주석이 생겼습니다. 그건 좋은 해결책이 아니 었습니다. 저는 Spring에서 더 잘하려했지만, 제가 발견 한 유일한 것은 설정 파일을 어디에서나 인스턴스화하고 주입하는 것입니다. 그냥이 완벽를 살펴 : 내 애완 동물 프로젝트가 다시 리팩토링 할 필요가 같은
    @Bean 
    public MyProjectStorageConfiguration getStorageConfiguration(
         @Value("${mongo.collections.names})") String mongoNames, 
         @Value("${mongo.collections.data})") String mongoData, 
         @Value("${files.maindata})") String mainData, 
         @Value("${files.secondarydata})") String secondaryData, 
         @Value("${files.backupdata})") String backupData, 
         @Value("${files.additionaldata})") String additionalData) { 
        return new MyProjectStorageConfiguration(mongoNames,mongoData, mainData,secondaryData,backupData,additionalData); 
    } 
    

보인다. 어떤 제안?

+1

포인트 1은 확실하지 않지만 포인트 2는 작성 후 빈을 가져 오는 빈 포스트 프로세서를 작성하여 수행 할 수 있습니다. 그런 다음 자신의 bean을 검사하고 문자열이나 정수와 같은 속성 유형을 자동 삽입 할 수 있습니다. 물론 주사 가능한 속성의 이름 지정 규칙이나 속성으로 표시하는 또 다른 주석을 제안해야합니다. 그런 다음 규칙에 따라 필드 이름을 속성 이름과 일치시킬 수 있으며 bean에 대한 주석 없이도 필드 이름을 확인할 수 있습니다. 개인적으로 나는 이것을 명백하게하는 것이 좋다고 느낍니다. 너무 많은 마법을 죽이다;) – pandaadb

답변

0
  1. 네, 맞습니다. 이것은 정말 나쁜 습관입니다.
    하지만 자습서와 다른 모든 것들이 쓰여지는 방식으로 봄 자체에 의한 것이 아닙니다. 실제로 생성자에서 @Autowired을 사용할 수 있으며 Spring은 필요한 매개 변수의 유형에 맞는 intefaces/classes를 삽입합니다.
    기억해야 할 큰 것 (Guice 출신) : 동일한 인터페이스 (두 개의 다른 구현)가 두 개 이상있는 경우 올바른 인스턴스를 선택하면 매개 변수를 세터로 이동시킬 수 있습니다 특수 효과 @Autowired@Qualifier("[beanName]")을 추가하십시오. 또는 구성 파일로 모든 것을 이동하십시오 ...

    @Service 
    class AClass implements MyService { 
    
        @Autowired 
        public AClass(UniqueInterface uniqueInterface) { 
        ... 
        } 
    
        @Autowired 
        @Qualifier("[beanName]") 
        public void setAnInterface(NotUniqueInterface notUniqueInterface) { 
         ... 
        } 
    } 
    
  2. 일반적으로 코드에서 속성 값을 직접 삽입 할 수 있습니다. values injection modes을 참조하십시오. 하지만, 어떤면에서는 주석에 값을 삽입하거나 구성 빈을 사용해야합니다. 다른 방법은 없습니다 (적어도 내가 아는 것 ...).

관련 문제