복붙노트

[SPRING] 정적 와이어 스프링 클래스

SPRING

정적 와이어 스프링 클래스

봄에 유선이 아닌 클래스가 봄에 유선 클래스를 가져와야하는 레거시 코드 기반을 다루고 있습니다. 시작할 때 유선 된 팩토리 클래스를 생성하고 나서 getInstance () 메서드를 호출하여 유선 객체를 얻을 수 있기를 바랬습니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

예:

public class LegacyA {
    public void doSomething() {
        ...
        Foo foo = FooFactory.getInstance();
        ...
    }
}

public class FooFactory {
    private static Foo foo;

    public static Foo getInstance() {
        if (foo == null) throw new IllegalStateException();
        return foo;
    }
}

LegacyA가 getInstance ()를 호출하여 Foo의 인스턴스 (응용 프로그램 컨텍스트에 정의 된 bean이기도 함)를 반환 할 수 있도록 FooFactory를 시작시 유선 연결해야합니다.

<bean id="legacyA" class="LegacyA"/>

<bean id="foo" class="Foo"/>

<!-- I need this bean to be injected with foo so that the FooFactory can return a foo -->
<bean id="fooFactory" class="FooFactory"/>

편집 : 나는 내 머리 속에서 약간 혼란스러워서 약간의 예를 다시 써야했다.

해결법

  1. ==============================

    1.이와 같은 통계를 사용하는 것은 실제로 Spring IoC에 반하는 것이지만 실제로 사용해야하는 경우 Foo를 가져 와서 FooFactory에 삽입하는 간단한 스프링 훅을 작성하는 것이 좋습니다.

    이와 같은 통계를 사용하는 것은 실제로 Spring IoC에 반하는 것이지만 실제로 사용해야하는 경우 Foo를 가져 와서 FooFactory에 삽입하는 간단한 스프링 훅을 작성하는 것이 좋습니다.

    public class FooFactoryProcessor implements InitializingBean {
    
        private Foo foo;
    
        public void setFoo(Foo foo) {
            this.foo = foo;
        }
    
        public void afterPropertiesSet() throws Exception {
            Foofactory.setFoo(foo);
        }
    }
    

    그리고 XML에서 :

    <bean id="foo" class="Foo"/>
    
    <bean class="FooFactoryProcessor">
       <property name="foo" ref="foo"/>
    </bean>
    

    Foo 또는 FooFactory를 수정할 필요가 없습니다.

  2. ==============================

    2.Spring을 여기에서 사용하도록 싱글 톤으로 정의하고 있는가? 그런 다음 속성 또는 생성자 삽입 (내 기본 설정은 후자 임)을 사용하여 LegacyB에 삽입 한 다음 한 인스턴스 만 사용할 수 있습니다.

    Spring을 여기에서 사용하도록 싱글 톤으로 정의하고 있는가? 그런 다음 속성 또는 생성자 삽입 (내 기본 설정은 후자 임)을 사용하여 LegacyB에 삽입 한 다음 한 인스턴스 만 사용할 수 있습니다.

    편집 : 다시. 귀하의 변경된 질문 (!) 나는 왜 당신이 단순히 공장에 싱글 톤으로 다시 푸를 주입하지 모르겠다. 또한 factory-method를 사용하여 Spring 구성을 통해 getInstance () 메소드를 사용할 수 있으며 모든 클래스를 통해 주입을 유지할 수 있습니다.

  3. ==============================

    3.Skaffman의 답변 외에도 초기화 순서에 매우주의해야합니다.

    Skaffman의 답변 외에도 초기화 순서에 매우주의해야합니다.

    스프링 빈을 사용할 때 프레임 워크는 자동으로 물건을 초기화하는 순서를 자동으로 찾아냅니다. 그러나 싱글 톤 트릭을 수행하는 동안 조심하지 않으면 중단 될 수 있습니다.

    즉, 응용 프로그램 컨텍스트가로드되기 전에 LegacyA를 실행할 수 없도록하십시오.

  4. from https://stackoverflow.com/questions/1192823/spring-wire-a-static-class by cc-by-sa and MIT license