IOC컨테이너와 빈 (2)
1. Spring으로 프로젝트를 생성했을때의 장점
- 아래의 사진처럼 pom.xml에 spring-boot-starter-web만 포함하게 되면 많은 의존성들이 들어오게 됨.
2. @SpringbootApplication을 제거하고 빈 설정하기
2.1.1 application.xml을 활용한 빈 설정
BookRepository.java
public class BookRepository {
}
BookService.java
public class BookService {
BookRepository bookRepository;
public void setBookRepository(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
}
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="me.menggi.springapplicationcontext.BookService">
<property name="bookRepository" ref="bookRepository" />
</bean>
<bean id="bookRepository"
class="me.menggi.springapplicationcontext.BookRepository" />
</beans>
DemoApplication.java
package me.menggi.springapplicationcontext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;
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)));
BookService bookService = (BookService) context.getBean("bookService");
System.out.println(bookService.bookRepository != null);
}
}
실행결과
- 아래와 같이 정상적으로 application이 구동되었으며, bean설정이 되어 의존성 주입이 됨.
2.1.2 application.xml과 어노테이션을 활용한 빈 설정(component-scan)
- 위 2.1.1에서 @Service, @Repository, @Autowired와 같은 어노테이션과 아래의 xml 파일에서 pacakage를 component-scan 하는 방법
<?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="me.menggi.springapplicationcontext"></context:component-scan>
</beans>
해당 방법은 xml 파일에 bean을 일일히 등록해줘야 하는 수고를 안해도 되기때문에 2.1.1 보다 더 유연한 방법
2.2.1 java 파일을 활용한 빈 설정 : @Bean 어노테이션 활용 (모든 Bean을 등록)
ApplicationConfig.java
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}
@Bean
public BookService bookService(){
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository());
return bookService;
}
}
Tip : 위와 같이 의존성을 직접 엮지않고, BookService에서 @Autowired를 사용해도 의존성 주입이 된다.
=> 모든 Bean을 일일히 등록해줘야 하는 단점이 있음.
2.2.2 java 파일을 활용한 빈 설정 : @ComponentScan 어노테이션 활용
@Configuration
@ComponentScan(basePackageClasses = DemoApplication.class) //클래스가 위치한곳 부터 componentScan을 해라.
public class ApplicationConfig {
}
=> Bean 설정이 필요 없음, DemoApplicaiton 클래스가 위치한곳 부터 component-scan을 함.
3. SpringBootApplication 어노테이션 활용
- 아래와 같이 @SpringBootApplication만 붙여주면 ApplicationConfig.java // application.xml과 같은 Bean 설정 파일이 필요가 없다.
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
}
}
이번에는 다양한 빈 설정 방법에 대해서 알아보았습니다.
점점 빈 설정이 자동으로 되어 편해지고 결국에는 하나의 어노테이션(@SpringBootApplication)으로 해결이 되었습니다.
굳이 원리를 알지 못해도 간단히 쓰는데는 문제가 없기 때문에 스프링의 원리에 대해서 무심 해진다는 생각이 드네요.
개인적인 생각으로는, 프로그램을 더 잘 짜기 위해서는 원리를 파악해야 한다고 생각합니다 ㅎㅎ
봐주셔서 감사합니다. 이상 포스팅을 마치겠습니다~
Author And Source
이 문제에 관하여(IOC컨테이너와 빈 (2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jhk2334/IOC-컨테이너와-빈저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)