스프링 - 컨테이너와 스프링 빈

meluu_·2023년 8월 7일
0

스프링

목록 보기
2/27
post-thumbnail

🌿스프링 컨테이너 와 스프링 빈

ApplicationContext

스프링 컨테이너이자 , 인터페이스

스프링 컨테이너 : XML , 에노테이션 기반의 자바 설정 클래스도 가능

new GenericXmlApplicationContext(); // xml 설정 

new AnnotationConfigApplicationContext(AppConfig.class);
// @Bean 으로 등록후 사용하는 것이  이에 해당

AppConfig.class를 기반으로 스프링 컨테이너 생성

💡 참고로 파라미터로 넘긴 값(AppConfig.class)도 컨테이너에 등록된다.

🌼생성과정

스프링 컨테이너 생성(AppConfig.class)
구성 정보 활용 하여 스프링 컨테이너에 빈 이름과 객체를 등록한다.
이때 구성 정보클래스의 메소드 명이 빈 이름이 된다.

@Bean
public MemberRepository memberRepository (){ // memberRepository 가 빈 이름
	return new MemoryMemberRepository(); // 객체 등록
}

빈이름 설정

@Bean(name="")
// 중복 주의

🔎 컨테이너 빈 조회

✔️ 컨테이너에 등록된 모든 빈 조회

ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회 (배열로 받기)

Ex)
String[] beanDefinitionNames = ac.getBeanDefinitionNames()

ac.getBean() : 빈 이름으로 빈 객체를 조회

✔️ 애플리케이션 빈 출력

getRole()를 사용하여 스프링 내부 빈 or 사용자 정의 빈 구분

ROLE_APPLICATION : 일반적인 사용자 정의 빈
ROLE_INFRASTRUCTURE : 스프링 내부 사용 빈



ex)
String[] beanDefinitionNames = ac.getBeanDefinitionNames();

for (String beanDefinitionName : beanDefinitionNames) {
	BeanDefinition beanDefinition =
		ac.getBeanDefinition(beanDefinitionName);
        
        if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION)

✔️ 스프링 빈 조회 - 기본

ac.getBean(빈이름, 타입)

타입만으로도 조회가 가능하다.

// 빈이름 조회
MemberService memberService = ac.getBean("memberService", MemberService.class);

//타입
MemberService memberService = ac.getBean(MemberService.class);



✔️ 동일 타입 둘이상

  1. 빈 이름 지정 (빈 이름을 따로 다르게 설정)
  2. ac.getBeansOfType() : 특정 타입 모두 조회
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);

👨‍👩‍👧‍👦 상속관계

부모 타입 조회         : 자식 타입도 함께 조회
Object 타입으로 조회 : 모든 스프링 빈 조회됌

✔️ BeanFactory

스프링 컨테이너 최상위 인터페이스
빈 관리 조회 역할 담당
getBean() 제공

✔️ ApplicationContext

BeanFactory 기능을 모두 상속받아 제공
-> 빈 관리기능 + 편리한 부가 기능을 제공

📓 스프링 빈 설정 메타 정보

✔️ BeanDefinition

스프링 컨테이너는 BeanDefinition을 통해 자바 코드, xml 상관없이 메타 정보를 통해 스프링 빈 등록(생성)

@Bean , <bean> 당 각각 하나씩 메타 정보가 생성


🏴 생각 정리

이보다 더 편리한 컴포넌트 스캔이 있다. 하지만 수동으로 직접 빈을 등록하는 방법도 알아야한다. 보통 AnnotationConfigApplicationContext을 쓰는 듯하다.

Config 구성정보의 메소드명이 빈 이름이 되는 것과
파라미터로 넘긴 Config도 컨테이너에 등록된다는 것을 기억하자.


🔖 학습내용 출처

스프링 핵심 원리 - 기본편

profile
열심히 살자

0개의 댓글