1 minute read

@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 에러를 내뱉는다.

Categories:

Updated: