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