
1. 의존성 생성에 대한 책임이 없기 때문에 느슨한 결합도를 유지할 수 있다.
2. 스프링 Ioc 컨테이너에서는 모든 빈들을 싱글톤 객체로 생성한다.
(scope 옵션으로 해제 가능), (참고로, 객체를 매번 생성하는 타입은 프로토타입)
자원을 많이 사용하는 db 접근 객체들은 싱글톤으로 사용하는 게 좋은데,
저 선언 하나만으로 싱글톤으로 객체를 관리한다고 함.
<싱글톤>
객체가 하나만 만들어짐. 재사용하여 메모리를 절약하며, 런타임시 성능 최적화에 유리하다. 특히 데이터베이스와 관련된 객체들은 필드가 많기 때문에 만드는 비용이 많이 들기 때문에 싱글톤이 효율적임.<느슨한 결합>
객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받는 것이다. 이렇게 하면 결합도를 낮출 수 있고, 런타임시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.<강한 결합>
객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조. A 클래스 내부에서 B 라는 객체를 직접 생성하고 있다면, B 객체를 C 객체로 바꾸고 싶은 경우에 A 클래스도 수정해야 하는 방식이기 때문에 강한 결합이다.
실질적으로 우리가 많이 사용하게 될 빈 팩토리다. BeanFactory를 상속받으므로 BeanFactory의 IoC 기능을 가지고 있으면서도 추가적으로 다양한 기능을 가지고 있다.
-> 컴포넌트 스캔의 원리는 기본적으로 @Component 어노테이션이 있으면 자동으로 스프링 빈으로 등록된다.
참고로, @Component 어노테이션은 @Controller , @Service, @Repository를 포함한다.
-> 스프링에서는 xml 설정파일이 아닌 자바코드를 통해 인스턴스를 생성하면서 의존성을 주입하는 방식으로 만들어진 객체를 빈으로 사용할 수 있는 방법을 제공한다.
방법은 클래스 레벨에서는 @Configuration을 붙이고, 메서드 레벨에서는 @Bean애노테이션을 붙이면 됨.
1. @Autowired 또는 @Injec 선언하면 IoC 컨테이너에 있는 빈을 주입받아 사용할 수 있음
2. ApplicationContext 에서 getBean()으로 직접 꺼내는 방법이 있음
@Autowired : 멤버 변수, setter 메소드, 생성자, 일반 메소드에 적용 가능
@Inject : 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능
🌟스프링 모듈과 IoC , DI🌟
요것도 같이 보기
[Spring] IoC 컨테이너 와 Spring Bean
스프링 빈을 등록하는 2가지 방법 / DI 주입 방법
[백기선 스프링 프레임워크 핵심기술] IOC Container and Bean
[Spring] Bean LifeCycle 이란 무엇일까?