Spring 학습 - 같은 인 터 페 이 스 를 자동 으로 조립 하 는 여러 실현 류

13652 단어 spring
원본 링크:http://followtry.cn/2019-12-03/spring-mutli-autowire-beans.html
소개 하 다.
평소에 Spring 의 DI 메커니즘 을 사용 할 때 거의 모든 종류 에서 인 터 페 이 스 를 인용 하 는 단일 한 실현 이다.그러나 Spring 은 어떻게 여러 실현 류 를 동시에 List 에 주입 합 니까?그래, 쓸데없는 소리 하지 말고 코드 를 바로 달 아 라.
원래 의 인용 방식
public interface HelloService {
    void sayHello();
}

@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private HelloService  helloService;
}

Spring 고급 기능
아니면 HelloService 인 터 페 이 스 를 예 로 들 어 여러 개의 인 스 턴 스 를 실현 합 니까?
HelloService 인터페이스
public interface HelloService {

    void sayHello();
}

HelloService 실현 클래스
각각 실례 화 , , 의 세 가지 세계 인사 실현 류.
@Service("Cat")
@Order(10)
public class CatHelloService implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("I'm a Cat,Hello world!");
    }
}

@Service
@Order(3)
public class DogHelloService implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("I'm a Dog,Hello world!");
    }
}

@Service
@Order(1)
public class PigHelloService implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("I'm a pig,Hello world!");
    }
}
@Service("Cat") 을 통 해 실현 류 의 bean 이름 을 지정 하고 @Order(3) 을 통 해 실현 류 의 순 서 를 지정 합 니 다.
HelloService 의 테스트 클래스 참조
public interface TestService {

    void sayHello();
}

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    private List<HelloService> multiServiceList;

    @Autowired
    private Map<String, HelloService> multiServiceMap;

    @Override
    public void sayHello() {
        System.out.println("--------------list--------------");
        for (HelloService multiService : multiServiceList) {
            multiService.sayHello();
        }

        System.out.println("--------------map--------------");
        for (Map.Entry<String, HelloService> entry : multiServiceMap.entrySet()) {
            System.out.println("key=" + entry.getKey());
            entry.getValue().sayHello();
        }
    }
}
TestServiceImpl 이 유형 에서 List 와 Map 두 가지 방식 으로 HelloService 의 실현 류 주입 을 도 입 했 는데 우리 가 기대 하 는 대로 HelloService 의 모든 유형 을 주입 할 수 있 기 를 기대한다.
테스트 주 클래스
Spring 을 초기 화하 고 호출 하 는 방법 TestService
public class TestMain {
    public static void main(String[] args) {
        GenericApplicationContext applicationContext = new AnnotationConfigApplicationContext("cn.followtry.boot");
        TestService testService = applicationContext.getBean(TestService.class);
        testService.sayHello();
        System.out.println("  ");
    }
}

실행 결과
--------------list--------------
I'm a pig,Hello world!
I'm a Dog,Hello world!
I'm a Cat,Hello world!
--------------map--------------
key=Cat
I'm a Cat,Hello world!
key=dogHelloService
I'm a Dog,Hello world!
key=pigHelloService
I'm a pig,Hello world!
  

인쇄 결 과 를 통 해 알 수 있 듯 이,
  • Spring 은 인터페이스의 모든 실현 류 를 TestServiceList 에 주입 하고 우리 가 @Order 을 통 해 지정 한 순서에 따라 Service 이름 을 지정 하지 않 으 면 기본 이름 의 이니셜 로 정렬 합 니 다.
  • Spring 도 인터페이스의 모든 실현 류 를 TestServiceMap, Key 는 Bean 의 이름, value 는 대응 하 는 실현 류 에 주입 했다.맵 의 구체 적 인 유형 은 LinkedHashMap 이기 때문에 우리 가 지정 한 순서에 따라 집행 되 지 않 았 다.
  • 좋은 웹페이지 즐겨찾기