Spring IoC 컨테이너가 관리하는 객체
Bean으로 등록이 되어 있어야 Spring IoC 컨테이너에 의해 의존성 주입이 가능하다.
Spring IoC 컨테이너가 Bean의 LifeCircle 관리
기본적인 Scope은 싱글톤이다. (싱글톤 : 인스턴스 1개 / 프로토타입 : 매번 다른 인스턴스 생성)
→ 기본적으로 싱글톤으로 생성되기 때문에 메모리 관점, 런타임시 성능 최적화에도 효율적임
BeanFactory (Spring Framework 5.0.8.RELEASE API)
ApplicationContext (Spring Framework 5.0.8.RELEASE API)
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); // xml 기반으로 bean 설정
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class); // java Config 파일을 기반으로 bean 설정
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@Autowired 애노테이션을 이용해서 필요한 의존 객체의 타입과 이름에 해당하는 빈을 찾아 주입한다.
required 옵션 : default가 true, false는 optional의 개념
사용할 수 있는 위치
@Autowired
public BookService(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
@Autowired(required = false)
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@Autowired(required = false)
BookRepository bookRepository;
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
// BookRepository 인터페이스를 상속받는 여러 클래스 중
// MyBookResitory.class를 사용하겠다.
@Autowired
BookRepository myBookResitory;
postProcessBeforeInitialization
methods of BeanPostProcessors)@ComponentScan은 Spring 3.1부터 적용이 되었다.
@ComponentScan은 basePackages(String Type)
패키지 이름으로 컴포넌트 스캔을 하는 데,
String값으로 패키지 이름을 받는 것은 TypeSafe하지 않다.
그래서 TypeSafe한 방법으로 basePackageClasses
라는 옵션을 사용한다.
basePackageClasses
을 사용하면, 해당 옵션에 전달된 클래스가 있는 패키지를 기준으로 컴포넌트 스캔을 시작한다.
→ SpringBoot에서 @SpringBootApplication 애노테이션은 @ComponentScan을 포함하고 있다.
따라서, @SpringBootApplication이 붙은 클래스의 Package와 다른 상속 Package에 있는 클래스들은 ComponetScan이 되지 않는다.
// MyBean.class / ComPonentScan 외에 있는 bean을 function을 이용해서 등록이 가능하다.
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(Demospring51Application.class)
.initializers((ApplicationContextInitializer<GenericApplicationContext>)
applicationContext -> {
applicationContext.registerBean(MyBean.class);
})
.run(args);
}
인스턴스를 여러개로 만들 수 있다.
참조하는 싱글톤은 늘 인스턴스가 1개이기 때문에 개발자의 의도대로 사용이 된다.
@Scope*(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
: 프로토타입 클래스의 선언부에 다음과 같이 설정한다.ObjectProvider
Provider