Spring Bean - Spring Context에 등록

이정수·2025년 10월 16일

Spring

목록 보기
4/18

Spring Framework에서 Spring Bean을 등록하여 Spring Context에게 제어를 맡기는 방법
。해당 3가지 방법을 수행하지않아 Spring Bean으로 등록되지 않은 자바 객체POJO

  • XMLSpring Bean을 등록
<beans>
  <bean id="memberService" class="com.example.MemberService"/>
</beans>

XMLSpring Bean을 일일이 기입하여 등록

  • Annotation을 선언하여 Spring Bean을 등록
    어플리케이션 전역으로 관리되는 Spring Context@SpringBootApplication가 선언된 진입점 클래스 이하 패키지 경로에 존재하는 Spring Bean을 등록
    ▶ 가장 많이 사용하는 방식

    @Configuration -> @Controller -> @Service -> @Repository -> @Component 순으로 선언된 클래스Spring Bean으로서 등록
    단방향 의존성에 따라 고수준 클래스로서 Service 클래스 객체를 포함하는 Controller 클래스Service 클래스보다 먼저 Spring Bean으로 등록되어야한다.

  • Spring Context구현체를 생성 및 Spring Bean을 등록
    。전역의 Spring Context가 아닌 Spring Context의 구현체 ( = ApplicationContext )를 생성하는 방식

    new AnnotationConfigApplicationContext(Configuration클래스.class)

    ▶ 내부에 @Bean이 정의된 Configuration Class를 전달하여 Spring Bean을 등록
    Spring Bean을 독립적으로 저장가능
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
interface GamingConsole{
    String up();
}
class MarioGame implements GamingConsole{
    public String up(){
        return "Mario goes upside";
    }
}
class SuperContraGame implements GamingConsole{
    public String up(){
        return "Character goes upside";
    }
}
// Configuration class 선언
@Configuration
public class MemberService {
    @Bean( name = "lee" )
    public GamingConsole gm1(){
        return new MarioGame();
    }
    @Bean
    @Primary
    public GamingConsole gm2(){
        return new SuperContraGame();
    }
    public static void main(String[] args) {
        // Spring Context 구현체 생성
        try(var ct = new AnnotationConfigApplicationContext(MemberService.class)){
            String result1 = ct.getBean(MarioGame.class).up(); // Class Type으로 Spring Bean 가져오기
            String result2 = ct.getBean("lee", MarioGame.class).up(); // 스프링빈명칭으로 Spring Bean 가져오기
            String result3 = ct.getBean(GamingConsole.class).up(); // Interface Type으로 Spring Bean 가져오기
            System.out.println(result1); // "Mario goes upside"
            System.out.println(result2); // "Mario goes upside"
            System.out.println(result3); // "Character goes upside"
        }
    }
}

객체를 생성하여 반환하는 method에 @Bean을 선언

Spring Context 구현체Configuration Class를 매개변수로 전달하여 를 생성
Configuration class에 정의된 @Bean들을 일괄적으로 Spring Context 구현체에 등록

@ComponentScan("경로") :
Spring Context 구현체( ex. AnnotationConfigApplicationContext )가 위치한 Configuration Class에 선언하여 정의한 패키지 경로의 하위에 있는 모든 Spring BeanSpring Context 구현체에 식별 및 등록되도록하는 어노테이션

@Component
@Qualifier("wjdtn")
class SuperContraGame implements GamingConsole{
    public String up(){
        return "Character goes upside";
    }
}
@Component
class Runner {
    private final GamingConsole gc2;
    public Runner( @Qualifier("wjdtn") GamingConsole gc2){
        this.gc2 = gc2;
    }
    public void run(){
        System.out.println(gc2.up()); // Character goes upside
    }
}
@Configuration
@ComponentScan("com.ktcloud.springpractice")
// 해당 패키지에 있는 어노테이션이 선언된 클래스들을 Spring Bean으로 등록
public class AAAA {
    public static void main(String[] args) {
        try( var springContext = new AnnotationConfigApplicationContext(AAAA.class)){
            springContext.getBean(Runner.class).run();
        }
    }
}

ApplicationContext 구현체@Component가 선언된 SuperContraGameRunnerSpring Bean으로 등록

Spring Context 구현체에서 Spring Bean를 가져오는 방법

// Spring Context 구현체 생성
        try(var ct = new AnnotationConfigApplicationContext(MemberService.class)){
            String result1 = ct.getBean(MarioGame.class).up(); // Class Type으로 Spring Bean 가져오기
            String result2 = ct.getBean("lee", MarioGame.class).up(); // 스프링빈명칭으로 Spring Bean 가져오기
            String result3 = ct.getBean(GamingConsole.class).up(); // Interface Type으로 Spring Bean 가져오기
            System.out.println(result1); // "Mario goes upside"
            System.out.println(result2); // "Mario goes upside"
            System.out.println(result3); // "Character goes upside"
        }
  • Class Type으로 Spring Bean을 가져올 경우

    SpringContext객체.getBean(클래스타입.class)

    。동일한 Interface를 구현하는 Spring Bean을 반환하는 @Bean method가 복수 존재 시 @Primary로 설정된 @Bean MethodSpring Bean을 우선시하여 가져온다.

  • Spring Bean에게 할당된 이름으로 Spring Bean을 가져오는 경우

    SpringContext객체.getBean("스프링빈이름", 클래스타입)

    Spring Bean명칭으로 참조 시 클래스타입을 추가정의
    클래스타입을 정의하지 않으면 Object TypeSpring Bean으로 반환

    Spring Bean 이름Spring Context에 의해 카멜케이스로 작성됨을 유의
    @Bean methodSpring Bean인 경우 @Bean(name="이름")을 통해 개발자가 임의로 부여가능
profile
공부기록 블로그

0개의 댓글