@Component 와 @Bean의 차이

kimki·2022년 4월 11일
0

Spring ( Boot ) / Java

목록 보기
1/5

@Component 해당 클래스를 스프링에게 자바 빈으로 등록하라고 알려주는 것

  • @Service, @Controller, @Repository 등에는 그 안에 포함되어 있음
  • @ComponentScan이 있어야 스캔할 수 있다. ( @SpringBootApplication이 포함하고 있다 )

@Bean → 스프링에게 직접적으로 “ 이 빈은 이렇게 생성하라 “ 알려주는 것

  • @Component를 사용하고 싶지 않을 때. 즉,
  • @Autowired를 사용하지 않고 오브젝트를 어떻게 생성하고 어느 클래스에서 사용하는지 정확히 알아야 할 때
  • 어떤 라이브러리 클래스가 스프링 기반이 아니라서 @Component를 추가하지 못하는 때
  • (아래와 같이) 로컬에서 앱을 실행하는 경우 자동으로 연결된 빈이 아닌 다른 빈을 사용하고 싶을 때
@Configuration
public class ConfigClass {

	@Bean
	public Controller getController() {
		if(env == "local") return new LocalController(...);
		return new Controller(...);
	}
}

스프링 부트의 실행 순서

  1. Spring Boot Application 을 Run
  2. @ComponentScan 어노테이션이 있는 경우 (즉, @SpringBootApplication), 베이스 패키지와 그 하위 패키지에서 @Component가 달린 클래스를 찾는다.
  3. 필요한 때에 @Component가 달린 클래스의 오브젝트를 생성한다.
  • 생성하려는 오브젝트가 다른 오브젝트에 의존한다면(멤버 변수로 다른 클래스를 갖고 있다면) 그 멤버 변수 오브젝트를 찾아 넣어줘야 한다. @Autowired를 사용하는 경우 스프링이 그 오브젝트를 찾아 생성해 넣는다
    1. 이때 @Autowired에 연결된 변수의 클래스가 @Component가 달린 클래스면, 스프링이 오브젝트를 생성해 넘겨준다
    2. 만약 @Bean으로 생성하는 오브젝트인 경우, @Bean이 달린 메서드를 불러 생성해 넘겨준다.
profile
개발 자라는 사람.

0개의 댓글