본문 바로가기
프로그래밍/SPRING

[스프링 기본 : IoC 컨테이너] Application Context와 빈 설정 방법

by hyunleeM 2019. 10. 6.

 

https://hardlearner.tistory.com/354

스프링 IoC 컨테이너의 역할

빈 인스턴스 생성

의존관계 설정

빈 제공

빈 설정 파일이 꼭 필요함.

 

ApplicationContext

ClassPathXmlApplicationContext (XML config)

c파일구조

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

 

스프링 프레임워크 핵심 기술 - 인프런

이번 강좌는 스프링 부트를 사용하며 스프링 핵심 기술을 학습합니다 따라서 스프링 부트 기반의 프로젝트를 사용하고 있는 개발자 또는 학생에게 유용한 스프링 강좌입니다. 초급 웹 개발 Java Spring 온라인 강의

www.inflearn.com

 

 

댓글