@Bean vs @Component
@Bean vs @Component
두 어노테이션 모두 Bean을 등록하도록 하는 어노테이션이다.
언뜻보면 같은 기능을 하는 어노테이션을 왜 두개나 만든이유는
용도가 다르기 때문이다.
@Bean어노테이션의 경우 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용된다.
@Configuration
public class ApplicationConfig {
@Bean
public ArrayList<String> array(){
return new ArrayList<String>();
}
}
위의 경우 Bean어노테이션에 아무런 값을 지정하지 않았으므로 Method 이름을 CamelCase로 변경한 것이 Bean id로 등록
@Component
@Component 어노테이션의 경우 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션
@Component
public class Student {
public Student() {
System.out.println("hi");
}
}
@Component역시 아무런 추가 정보가 없다면 Class의 이름을 Camelcase로 변경한 것이 Bean id로 사용된다.
하지만 @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정
@Component(value="mystudent")
public class Student {
public Student() {
System.out.println("hi");
}
}
@Autowired
@Component
public class Pencil {
...
}
@Component(value="mystudent")
public class Student {
@AutoWired
private Pencil pencil;
public Student() {
System.out.println("hi");
}
}
@Component를 사용한 Bean의 의존성 주입은 @AutoWired 어노테이션을 이용하여 할 수 있다.
위와 같이 Student가 Pencil에 대한 의존성을 가지고 있는 경우 @AutoWired 어노테이션을 이용하여 의존성을 자동으로 주입할 수 있다.
이때 당연히 Pencil도 @Component 어노테이션을 가지고 있어야 한다.
그래야만 IOC Container에 Bean으로 등록이되기 때문
@Autowired 어노테이션의 경우 형(타입)을 통해 해당 자리에 들어올 객체를 판별하여 주입해준다.
따라서 해당 자리에 들어올 수 있는 객체가 여러개인 경우, 즉 다형성을 띄고있는 객체타입에 @Autowired를 사용한 경우에는
@Qualifier(“Bean이름”) 을 이용하여 해당 자리에 주입될 Bean을 명시해주어야 한다.
요약
@Component는 개발자가 직접 작성한 Class를 Bean으로 만드는 것이고. @Bean은 개발자가 작성한 Method 를 통해 반환되는 객체를 Bean으로 만드는것 이다.
또한 각자의 용도가 정해져있으므로 정해진 곳에서만 사용가능하며 다른곳에서 사용하려한다면 Compile 에러를 내뱉는다.