요즘 클린코드 등등 .. 여러 책을 보면서

 

아 클래스 설계를 어떻게하면 조금 더 좋아질까라는 고민을 많이하다가

 

기능분류로 묶어가면서 해야겠다 라고 생각하던 도중에 찾게된 방법 ..

 

 

나같은 경우는 enum에서

 

@Autowired로 받아야되는 필드가있는데

 

어캐해야될지 몰랐었음

 

 

 

아래는 방법

 

 

public enum ReportType {

    REPORT_1("name", "filename"),
    REPORT_2("name", "filename");

    @Component
    public static class ReportTypeServiceInjector {
        @Autowired
        private DataPrepareService dataPrepareService;

        @PostConstruct
        public void postConstruct() {
            for (ReportType rt : EnumSet.allOf(ReportType.class))
               rt.setDataPrepareService(dataPrepareService);
        }
    }

[...]

}

 

 

글에서는 ReportTypeServiceInjector 를 public으로 선언하지만

 

나는 클래스 내부에서 한정적으로 private로 선언했다

 

 

 

그리고 enum class에서 @Autowired 받을 필드의 setter 메서드를 다음과 같이 만들었다

private static void set( ... field ) {
  //this.field = field
}

 

 

그리고 set 메서드를 postConstruct() 메서드 안에서 호출했다.

 

 

이런식으로 하면

 

enum 클래스에 @Component와 @Autowired 필드를 따로 두지 않고

inner 클래스를 활용해서 field를 set할 수 있당..

 

 

 

 

 

출처 : https://stackoverflow.com/questions/16318454/inject-bean-into-enum/39097926

+ Recent posts