빈 인스턴스 생성
의존관계 설정
빈 제공
빈 설정 파일이 꼭 필요함.
ApplicationContext
ClassPathXmlApplicationContext (XML config)
SampleRepository.java
package me.hw.sample1;
public class SampleRepository {
}
SampleService.java
package me.hw.sample1;
public class SampleService {
SampleRepository sampleRepository;
public void setSampleRepository(SampleRepository sampleRepository) {
this.sampleRepository = sampleRepository;
}
}
application.xml (bean config)
<?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="sampleService" class="me.hw.sample1.SampleService">
<property name="sampleRepository" ref="sampleRepository"></property>
</bean>
<bean id="sampleRepository" class="me.hw.sample1.SampleRepository"></bean>
</beans>
- sampleService 빈설정에 sampleRepository 빈을 set메소드로 주입 시켜준다
Sample1Application.java - 실제 sampleRepository가 주입되어 있는지 확인
package me.hw.sample1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
@SpringBootApplication
public class Sample1Application {
public static void main(String[] args) {
// SpringApplication.run(Sample1Application.class, args);
ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
SampleService sampleService = (SampleService) ctx.getBean("sampleService");
System.out.println(sampleService.sampleRepository != null);
}
}
결과
- sampleRepository가 null이 아닌 걸 확인할수 있음.
AnnotationConfigContext(Java Config)
SampleRepository.java, SampleService.java : 내용동일
SampleConfig.java
package me.hw.sample1;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SampleConfig {
@Bean
public SampleRepository sampleRepository( ) {
return new SampleRepository();
}
@Bean
public SampleService sampleService() {
SampleService sampleService = new SampleService();
sampleService.setSampleRepository(sampleRepository());
return sampleService;
}
}
Sample1Application.java
package me.hw.sample1;
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;
@SpringBootApplication
public class Sample1Application {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SampleConfig.class);
SampleService sampleService = (SampleService) ctx.getBean("sampleService");
System.out.println(sampleService.sampleRepository != null);
}
}
결과
- null이 아닌것을 확인
빈설정
빈명세서
빈에 대한 정의를 담고 있다.
- 이름
- 클래스
- 스코프
- 생성자 아큐먼트 (Constructor)
- 프로퍼티(setter)
- ...
컴포넌트 스캔
Config에 일일이 빈을 등록하지 않고 특정 패키지 이하의 모든클래스 중에 @Component 어노테이션을 사용한 클래스를 빈으로 자동 등록
ex) @Component, @Service .. 어노테이션 설정시 자동등록처리
설정방법
- XML 설정 - base-package 기준으로 스캔
- <context:component-scan base-package="me.hw.sample1""></context:component-scan>
- JAVA 설정
// 해당 클래스가 있는곳부터 스캔(Class)
@ComponentScan(basePackageClasses = Sample1Application.class)
// 해당 패키지 부터 스캔(String Array)
@ComponentScan(basePackages = {"me.hw.sample1"})
참고자료
https://www.inflearn.com/course/spring-framework_core
'프로그래밍 > SPRING' 카테고리의 다른 글
[스프링기본 : IoC 컨테이너] Environment - Profile (0) | 2019.10.10 |
---|---|
[스프링 기본 : IoC 컨테이너]빈 스코프 (0) | 2019.10.06 |
[스프링 기본 : IoC 컨테이너] @Component 와 컴포넌트 스캔 (0) | 2019.10.06 |
[스프링 기본 : IoC 컨테이너] @Autowired (0) | 2019.10.06 |
[스프링 기본 : IoC 컨테이너 ] IoC 컨테이너 와 빈 (0) | 2019.10.06 |
댓글