복붙노트

[SPRING] spring @Lookup 주석을 사용하는 방법은 무엇입니까?

SPRING

spring @Lookup 주석을 사용하는 방법은 무엇입니까?

싱글 톤에서 프로토 타입 클래스를 가져와야합니다. 그 방법 주입 방법이 있다는 것을 알았지 만 spring @Lookup 어노테이션을 사용하는 방법을 모른다.

저는 의존성 삽입을 처음 접했고 주석 구성을 선택하기 때문에 그 방향으로 계속하고 싶습니다.

@Lookup 주석이 최근에 추가 된 것을 알았지 만 (https://spring.io/blog/2014/09/04/spring-framework-4-1-ga-is-here), 어디서나 어떻게 찾을 수 있습니까? 그걸 써.

여기에 단순화 된 예제가 있습니다.

구성 클래스 :

@Configuration
@Lazy
public class ApplicationConfiguration implements ApplicationConfigurationInterface {

  @Bean
  public MyClass1 myClass1() {
    return new ContentHolderTabPaneController();
  }

  @Bean
  @Scope("prototype")
  public MyClass2 myClass2() {
    return new SidebarQuickMenuController();
  }
}

다음은 클래스 예제입니다.

public class MyClass1 {
  doSomething() {
    myClass2();
  }

  //I want this method to return MyClass2 prototype
  public MyClass2 myClass2(){
  }
}

@Lookup 주석으로 어떻게 할 수 있습니까?

해결법

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

    1.@Lookup 어노테이션을 public MyClass2 myClass2 () 메소드에 적용하기 전에 @ Lookup의 Javadoc에서 이것을 읽으십시오.

    @Lookup 어노테이션을 public MyClass2 myClass2 () 메소드에 적용하기 전에 @ Lookup의 Javadoc에서 이것을 읽으십시오.

    따라서 ApplicationConfiguration에서 다음 팩토리 메소드 스타일 bean 선언을 제거하십시오.

      @Bean
      public MyClass1 myClass1() {
        return new ContentHolderTabPaneController();
      }
    

    @Component 어노테이션을 추가하여 Spring이 Bean을 인스턴스화하도록한다 (@Lookup 어노테이션을 메소드에 추가한다) :

    @Component
    public class MyClass1 {
      doSomething() {
        myClass2();
      }
    
      //I want this method to return MyClass2 prototype
      @Lookup
      public MyClass2 myClass2(){
        return null; // This implementation will be overridden by dynamically generated subclass
      }
    }
    

    이제 myClass1 빈을 컨텍스트 밖으로 가져오고 매번 새로운 프로토 타입 빈을 얻으려면 myClass2 메소드를 대체 / 대체해야합니다.

    최신 정보:

    @Lookup 주석이 달린 메소드 ( "lookup method")를 구현하는 것은 어렵지 않습니다. @Lookup을 사용하지 않고 설정 클래스를 변경하지 않으면, MyClass1은 다음과 같이 보입니다 (사실, @Lookup이 사용되면 Spring은 서브 클래스에서 유사한 구현을 생성합니다) :

    public class MyClass1 {
      doSomething() {
        myClass2();
      }
    
      //I want this method to return MyClass2 prototype
      @Autowired
      private ApplicationContext applicationContext;
      public MyClass2 myClass2() {
          return applicationContext.getBean(MyClass2.class);
      }
    }
    

    Spring은 당신을 위해 ApplicationContext를 삽입한다.

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

    2.Spring 4.1에 있지 않다면 대신 provider injection을 사용할 수 있습니다 :

    Spring 4.1에 있지 않다면 대신 provider injection을 사용할 수 있습니다 :

    public class MyClass1 {
      @Autowired
      private Provider<MyClass2> myClass2Provider;
    
      doSomething() {
        MyClass2 myClass2 = myClass2();
        myClass2.fooBar()
      }
    
      public MyClass2 myClass2(){
        return myClass2Provider.get();
      }
    }
    

    이는 DI, IoC로, 조회 메소드에 대한 추상 클래스 및 xml 정의를 피합니다.

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

    3.또한 TARGET_CLASS proxyMode를 사용하여 myClass2 bean을 선언 할 수 있습니다.

    또한 TARGET_CLASS proxyMode를 사용하여 myClass2 bean을 선언 할 수 있습니다.

      @Bean
      @Scope("prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
      public MyClass2 myClass2() {
        return new SidebarQuickMenuController();
      }
    
  4. from https://stackoverflow.com/questions/26028341/how-to-use-spring-lookup-annotation by cc-by-sa and MIT license