반응형
빈 이란?
- 스프링 IoC 컨테이너가 관리 하는 객체
- 스프링 IoC 컨테이너란? BeanFactory 를 확장하는 ApplicationContext를 많이 사용한다.
- 컨테이너가 하는 일 : 빈 설정 소스로 부터 빈 정의를 읽어들이고, 빈을 구성하고 제공한다.
- ( 빈 인스턴스 생성, 의존 관계 설정, 빈 제공)
- 장점
1. 의존성 관리
2. 스코프
- 싱글톤 (기본값) : 하나의 객체만 사용 -> 빠른 성능
- 프로토타입 : 매번 다른 객체
3. 라이프사이클 인터페이스
- 빈 등록 하는 방법 두가지
1. 고전적인 방식의 빈 등록 방법 - ApplicationContext (XML)
<Application.xml>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bookService"
class="com.example.sspringaplicationcontext.BookService">
<property name="bookRepository" ref="bookRepository"/>
</bean>
<!--property name="setter의 이름" ref="참조할 빈의 id"
주석 단축키!
1. 줄 단위 : ctrl + /
2. 블럭 단위 : ctrl + shift +
aa-->
<bean id="bookRepository"
class="com.example.sspringaplicationcontext.BookRepository">
</bean>
</beans>
단점 : 일일히 하나하나 빈을 등록해야 한다는 불편함이 있다.
2. 어노테이션을 이용한 빈 등록 방법 ( Java )
<BookService.class>
package com.example.sspringaplicationcontext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service /*Component를 확장한 빈으로 등록가능한 annotation*/
public class BookService {
@Autowired /*의존성 주입을 위한 annotation*/
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
}
빈 설정 Annotation
@Component
- @Repository
- @Service
- @Controller
자바 빈 설정 파일 - - ApplicationContext (Java)
<Application.class>
package com.example.sspringaplicationcontext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.awt.print.Book;
@Configuration //이것은 빈 설정 파일 이다~ 표시하기 위해 @Configuration을 등록해준다.
public class ApplicationConfig {
//빈 등록
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}
@Bean
public BookService bookService(){
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository()); //의존성 주입 직접 해주기
return bookService;
}
}
이렇게 자바로 만든 파일은 어떻게 ApplicationContext로 사용하는가?
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
<DemoApplication.class>
package com.example.sspringaplicationcontext;
import javafx.application.Application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
자바 빈 설정 파일에서 의존성을 직접 주입 해줘도 되고, 아니면 @Autowired를 사용해도 된다.
의존성 주입 : @Autowired
<Application.class>
package com.example.sspringaplicationcontext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.awt.print.Book;
@Configuration //이것은 빈 설정 파일 이다~ 표시하기 위해 @Configuration을 등록해준다.
public class ApplicationConfig {
//빈 등록
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}
@Bean
public BookService bookService(){
//직접 주입해준 부분 삭제하고!
//BookService bookService = new BookService();
//bookService.setBookRepository(bookRepository());
return bookService;
}
}
package com.example.sspringaplicationcontext;
import org.springframework.beans.factory.annotation.Autowired;
public class BookService {
@Autowired //이렇게 해줘도 의존성이 자동으로 주입이 된다.
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository){
this.bookRepository = bookRepository;
}
}
아래 사진으로 자동으로 의존성이 주입이 된걸 확인 할수 있다.
컴포넌트 스캔 설정
1. XML 설정
<Application.xml>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.sspringaplicationcontext"/>
<!-- "com.example.sspringaplicationcontext" 이 패키지로 부터 빈을 스캐닝을 해서 빈으로 등록하겠다. -->
</beans>
패키지 이하로 부터 어노테이션을 스캐닝해서 빈으로 등록을 해주는 것이다.
2. 자바 설정
<ApplicationConfig.class>
@Configuration
@ComponentScan(basePackageClasses = DemoApplication.class)
//클래스가 위치한곳으로 부터 컴포넌트 스캐닝을 해라.
//(모든 클래스에 붙어있는 어노테이션을 찾아서 빈으로 등록을해라.
public class ApplicationConfig {
}
이제 빈을 일일히 등록하기 귀찮다. 자동으로 등록해주는 @ComponentScan 을 사용해라.
반응형