본문 바로가기

Programming/Spring

[Spring] Bean을 등록하는 방법

스프링에서는 빈을 개발자가 직접 생성하지 않고 스프링에게 위임해 생성된 빈을 주입하는 방법으로 사용하게 된다.

IOC를 위해 주입할 빈을 등록하고 관리를 위임해야 한다.

 

 

1. xml에 직접 설정하기

// application.xml
<bean id="car" class="aaa.bbb.ccc.Car">
    <property name="tire" ref="tire"/> <!-- name :setter로 등록된 메소드 , ref : 참조할 빈의 id -->
</bean>
<bean id="tire" class="aaa.bbb.ccc.Tire"/>
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");

단점으로는 모든 빈을 직접 등록하고 의존성도 모두 작성해야 했기 때문에 굉장히 번거롭고 불편하다.

 

 

2. Component Scan

@Component 가 붙은 객체를 스캔해 등록한다. @Service, @Repository, @Controller, @Configuration 들은 모두 @Component를 상속받고 있기 때문에 등록된 클래스들은 스프링 컨테이너에 자동으로 생성되고 스프링 빈으로 등록된다.

 

xml

<context:component-scan base-package="패키지_경로"/> 

지정된 패키지 아래에 등록된 모든 컴포넌트들을 등록한다.

 

 

Annotation

@Configuration
@ComponentScan(basePackageClasses = Application.class)
public class ApplicationConfig {
}

지정된 클래스가 위치한 곳부터 컴포넌트 스캐닝을 해 컴포넌트 애노테이션을 찾아 등록한다.

 

 

3. 자바 설정 파일

@Configuration
public class ApplicationConfig {

    @Bean
    public Tire tire() {
        return new Tire();
    }

    @Bean
    public Car car() {
        Car car = new car();
        car.setTire(tire()); 
        return car;
    }
}

컴포넌트 안에 작성된 @Bean들도 등록시켜 준다.

 

4. @SpringBootApplication

@SpringBootApplication@Configuration@ComponentScan을 이미 상속받고 있기 때문에 클래스들이 등록될 수 있도록 제공하고 있다. 때문에 개발자가 특별한 선언을 하지 않아도 Component 관련 애노테이션만을 붙여주면 auto-scan되어 빈이 등록되게 된다.

 

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
...
}

 

 

 

 


📚 Reference

[인프런] 스프링 프레임워크 핵심 기술 / 백기선

'Programming > Spring' 카테고리의 다른 글

[Spring] AOP, Spring AOP  (0) 2021.04.30
[Spring] Bean 주입하기 : DI  (0) 2021.04.24
[Spring] Bean Scope와 주의할 점  (0) 2021.04.22