Bean을 등록하는 여러가지 방법들
우선 Spring boot Project 만들고
BookService, BookRepository를 생성
BookRepository.java
public class BookRepository {
}
BookService.java
public class BookService {
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
1. xml - Bean 태그 이용
Resource 폴더에 application.xml 생성
application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="bookService"
class="com.springstudy.springapplicationcontext.BookService">
<property name="bookRepository" ref="bookRepository"/>
<!--name="bookRepository" 이부분에서 bookRepository는 bookService의 setter에서 가져옴-->
<!--ref="bookRepository" 이부분에서 bookRepository는 bean id 에서 가져옴-->
</bean>
<bean id="bookRepository"
class="com.springstudy.springapplicationcontext.BookRepository">
</bean>
</beans>
xml 파일을 로드하여 Application 실행
DemoApplication.java
public class DemoApplication {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames)); // bean name 출력
BookService bookService = (BookService)context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
// bookService의 bookRepository의 의존성 주입 여부 확인
}
}
2. XML - componentScan 사용
application.xml 수정
application.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<context:component-scan base-package="com.springstudy.springapplicationcontext"/>
<!--Spring 2.5부터 가능했던 기능으로 bask-package에서부터 @Component 혹은 Component를 상속받은 -->
<!--Repository, Service 등의 어노테이션을 찾아 빈으로 등록한다.-->
</beans>
Bean Class에 어노테이션 작성
BookRepository.java
@Repository
public class BookRepository {
}
BookService.java
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
3. Config파일을 통한 Bean 등록
ApplicationConfig.java 파일 생성 및 Bean 생성
ApplicationConfig.java
@Configuration // bean을 등록하는 Configuration 이다.
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
BookService bookService = new BookService();
// 아래와 같이 직접 의존성을 주입하지 않아도 @Autowired를 통하여 주입할 수 있다.
// 하지만 BookService에 setter메서드가 있어야 가능하다 !
// bookService.setBookRepository(bookRepository());
return bookService;
}
}
ApplicationConfig를 로드하여 Application 실행
DemoApplication.java
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
// annotation을 통한 bean 등록
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
System.out.println(Arrays.toString(beanDefinitionNames)); // bean name 출력
BookService bookService = (BookService)context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
// bookService의 bookRepository의 의존성 주입 여부 확인
}
}
4. Config의 ComponentScan을 활용한 Bean 등록
ApplicationConfig.java 파일 생성 및 Bean 생성
ApplicationConfig.java
@Configuration // bean을 등록하는 Configuration 이다.
//@ComponentScan(basePackages = "com.springstudy.springapplicationcontext")
//위의 방법은 type safety 하지 않으므로 아래의 방법을 추천한다.
@ComponentScan(basePackageClasses = DemoApplication.class)
// DemoApplication 클래스가 위치한 곳부터 scan
public class ApplicationConfig {
}
BookService에 Autowired를 통한 DI 주입
BookService.java
@Service
public class BookService {
@Autowired
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
@SpringBootApplication Annotation 사용
4번의 방법을 통하여 간단하게 Bean을 등록하는 방법은 @SpringBootApplication Annotation을 사용하는 것이다.
해당 어노테이션의 클래스에 들어가 확인해 보면 아래와 같다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
...
위와 같이 ComponentScan 어노테이션이 들어가 있는 것을 확인할 수 있다.
따라서 DemoApplication.java 파일을 아래와 같이 수정하면 된다.
DemoApplication.java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Project Repository
- https://github.com/Seongmun-Hong/SpringStudy
Reference
- https://www.inflearn.com/course/spring-framework_core