[SPRING] spring @Lookup 주석을 사용하는 방법은 무엇입니까?
SPRINGspring @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.@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.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.또한 TARGET_CLASS proxyMode를 사용하여 myClass2 bean을 선언 할 수 있습니다.
또한 TARGET_CLASS proxyMode를 사용하여 myClass2 bean을 선언 할 수 있습니다.
@Bean @Scope("prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) public MyClass2 myClass2() { return new SidebarQuickMenuController(); }
from https://stackoverflow.com/questions/26028341/how-to-use-spring-lookup-annotation by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JUnit 테스트에서 스프링 MVC가 밸리데이션을 호출하게하려면 어떻게해야합니까? (0) | 2019.01.15 |
---|---|
[SPRING] Spring 데이터는 Pageable 액션 인수 생성을 처리하지 않습니다. (0) | 2019.01.15 |
[SPRING] 사용자 지정 HTTP 메시지 변환기가 사용되지 않음, 415 지원되지 않는 미디어 형식 (0) | 2019.01.15 |
[SPRING] @RequestBody가 여러 개있는 스프링 MVC 컨트롤러 (0) | 2019.01.15 |
[SPRING] Spring에서 XML을 통해 MySql 데이터 소스 빈을 정의하는 방법 (0) | 2019.01.15 |