필요한 타입의 Bean을 모두 가져오기

namkun·2022년 3월 29일
0

Spring

목록 보기
13/18

해당 내용은 '스프링 입문을 위한 자바 객체 지향의 원리와 이해'와 인프런 김영한님의 '스프링 핵심 원리 - 기본편' 강의를 참고하였습니다.


의도적으로 특정 타입의 스프링 전부 필요할 때가 있다.

요청 또는 로직에 따라서 필요한 빈을 바꿔줘야 할 때가 있기 때문이다.

자 다음과 같은 테스트 코드를 짜보자.

베이스는 우리가 기존에 해왔던 Car 에서 진행한다.

 static class Fuel{
        Map<String, FuelTank> fuelTankMap;

        @Autowired
        public Fuel(Map<String, FuelTank> fuelTankMap){
            this.fuelTankMap = fuelTankMap;
            System.out.println("fuelTankMap = " + fuelTankMap);
        }

        public String returnEnergy(String fuelCode){
            FuelTank tank = fuelTankMap.get(fuelCode);
            return tank.getEnergy().getEnergy();
        }
    }

위와 같은 간단한 테스트용 클래스를 작성한다.

해당 클래스는 @AutowiredFuelTank에 해당하는 클래스들을 가져온다.

그리고 테스트 코드는 다음과 같이 작성한다.

    @Test
    void findAllBeanTest(){
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoApplicationConfig.class, Fuel.class);
        Fuel fuel = ac.getBean(Fuel.class); // Fuel 클래스 타입에 해당하는 Bean을 가져와라.
        String energy1 = fuel.returnEnergy("gasolineOil");
        assertThat(energy1).isEqualTo("gasolineOil");
    }

그럼 우리가 저번에 만들었던@ComponentScan을 통해서 Bean들이 등록이 되고, @Autowired를 통해서 의존성이 주입이 되는 것을 테스트 실행 로그를 통해 확인할 수 있다.

22:58:32.026 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'autoApplicationConfig'
22:58:32.029 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'allBeanTest.Fuel'
22:58:32.045 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'electricBattery'
22:58:32.046 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'gasolineOil'
22:58:32.047 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'allBeanTest.Fuel' via constructor to bean named 'electricBattery'
22:58:32.047 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Autowiring by type from bean name 'allBeanTest.Fuel' via constructor to bean named 'gasolineOil'

그 다음에 우리는 위에서 생성자에 표시한

System.out.println("fuelTankMap = " + fuelTankMap);

를 통해서 우리는 다음과 같이 Map에 Bean들이 들어온 것을 확인할 수 있다.

fuelTankMap = {electricBattery=hello.core.carTest.tank.ElectricBattery@c36f078f, gasolineOil=hello.core.carTest.tank.GasolineOil@7da48083}

그러므로 이제 위에 적어놓은 Fuel 클래스의 returnEnergy 메서드를 통해서 필요한 Bean을 넣으면 우리가 원하는 Bean을 가져올 수 있다.

energy1 = Gasoline
profile
개발하는 중국학과 사람

0개의 댓글