IOC 컨테이너가 관리하는 객체
@Component 와 그 하위 어노테이션을 가지고 있는 클래스를 찾아 자동으로 빈으로 등록하는 과정
사용 가능한 어노테이션
@Component
: 컴포넌트 스캔에서 사용
@Controller
: 스프링 MVC 컨트롤러에서 사용
@Service
: 스프링 비즈니스 로직에서 사용
@Repository
: 스프링 데이터 접근 계층에서 사용
@Configuration
: 스프링 설정 정보에서 사용
해당 어노테이션들이 있는 클래스들을 자동으로 등록해준다.
수동 등록에는 2가지 정도의 방법이 있다.
@Configuration
주석이 있는 클래스 안에@Bean
이 있는 메소드를 넣는것으로 빈을 등록할수있다.
@Configuration
public class ApplicationConfig {
@Bean
public MyService myService(MyRepository myRepository) {
return new MyService(myRepository);
}
@Bean
public MyRepository myRepository() {
return new MyRepository
}
}
resource
디랙토리 하단에application.xml
을 생성해<beans>
엘리먼트 내부에<bean>
엘리먼트를 추가해 빈을 추가할수 있다.
<?xml version="1.0" encoding="UTF-8" ?>
<beans ...>
<bean id="MyService"
class="com.example.my.MyService">
<property name="myRepository"
ref="myRepository"/>
</bean>
<bean id="MyRepository"
class="com.example.my.MyRepository">
</bean>
</beans>
빈은 IOC에서 자동으로 의존성을 주입될때 사용된다.
(IOC컨테이너가 관리하는 객체가 빈이기 때문)
@Autowired
와 @Inject
는 거의 유사하게 동작하지만 @Autowired
은 스프링에 의존적이라는 차이점이 있다.
@Autowired
를 이용한 의존성 주입의 방법은 3가지가 있다.
class OwnerController(){
//빈을 받아오기
@Autowired
private OwnerRepository repo;
public OwnerContorller(){}
}
class OwnerController(){
private OwnerRepository repo;
//빈을 받아오기
@Autowired
public OwnerContorller(OwnerRepository repo){
this.repo = repo;
}
}
class OwnerController(){
private OwnerRepository repo;
public OwnerContorller(){}
//빈을 받아오기
@Autowired
public void setRepo(OwnerRepository repo){
this.repo = repo;
}
}
OwnerRepository repo = ctx.getBean("ownerRepository",OwnerRepository.class);
다음과 같이 getBean()
메소드는 첫번째 인자로는 빈의 이름, 두번째 인자로는 빈의 클래스를 받는다.
빈의 이름은 클래스, 혹은 지정한 메소드의 첫 문자를 소문자로 바꾼것으로 지정된다.