Tools/Spring

ApplicationContext-1 (Bean을 등록하는 방법)

칼쵸쵸 2020. 8. 4. 23:16

ApplicationContext : BeanFactory를 상속받은 인터페이스 , 스프링에서 주로 사용

 

>ApplicationEventPublisherBeanFactoryEnvironmentCapableHierarchicalBeanFactoryListableBeanFactoryMessageSourceResourceLoaderResourcePatternResolver 상속

 

1. 프로젝트 resources에 Spring XML Configuration file을 생성 후 Bean 등록

repo1

package main;
public class repo1{
	

	public repo3 giveA(repo3 repo)
	{
		return repo;
	}
}

 

repo2

package main;

public class repo2{
	

	repo1 rp1;
	public void setRp1(repo1 rp1) {
		this.rp1 = rp1;
	}

	public repo3 geta(repo3 rp)
	{
		return rp1.giveA(rp);
	}
}

: repo1의 Setter를 가지고 있음

 

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"
	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 http://www.springframework.org/schema/context/spring-context.xsd">
    <bean id="repo1" class = "main.repo1">
	</bean>
	
	<bean id="repo2" class = "main.repo2">
		  <property name ="rp1" ref="repo1"/>
	</bean>
</beans>

repo1 과 repo2 등록

repo2 등록시 필드값 rp1에 ref에 해당하는 repo1을 넣음

이때 repo2에서 repo1값을 받을수 있는 setter메서드가 존재하여야함 (의존성 주입)

 

SpringstudyApplication

package main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class SpringstudyApplication {

	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
		repo1 rp1 = (repo1) ctx.getBean("repo1");
		repo2 rp2 = (repo2) ctx.getBean("repo2");
	}

}

ApplicationContext : ctx 를 ClassPathXmlApplicationContext로 가져와서 getBean(Bean id)를 통해 Bean을 싱글톤으로 주입받음 (object형으로 받기 때문에 캐스팅 필수)

 

>> XML로 하나씩 등록하기가 번거로움

 

 

2. Component를 활용한 Bean등록

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"
	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 http://www.springframework.org/schema/context/spring-context.xsd">
	<context:component-scan base-package="main"/>

</beans>

 

component scan을 활용하여 main package안에 어노테이션(Service,component등)으로 등록된 객체들을 Bean으로 등록

 

repo2

package main;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class repo2{
	
	@Autowired
	repo1 rp1;
	
	public void setRp1(repo1 rp1) {
		this.rp1 = rp1;
	}

	public repo3 geta(repo3 rp)
	{
		return rp1.giveA(rp);
	}
}

필드값 repo1 rp1을 Autowired를 통해 의존성 주입 가능

 

>>여전히 XML은 불편함

 

3. Java Configuration을 활용한 Bean 등록

ApplicationConfig

package main;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
	
	@Bean
	public repo1 r1()
	{
		return new repo1();
	}
	
	@Bean
	public repo2 r2()
	{
		repo2 rp2 = new repo2();
		rp2.setRp1(r1());
		return rp2;
	}
}

 ApplicationConfig 클래스를 만든후 @Configuration을 붙여 설정파일임을 알림

이후 Bean으로 등록될 객체를 @Bean 어노테이션이 붙은 메서드를 만들어 직접 생성후 등록

의존성주입도 직접 입력

그러나 Setter를 사용하면 의존성 주입을 직접하지 않고 Autowired로 필드값 입력가능

생성자에서 의존성주입시 new를 사용한 객체 생성자체가 불가하므로 Autowired 사용불가

 

SpringstudyApplication

package main;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class SpringstudyApplication {

	public static void main(String[] args) {
		ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		repo1 rp1 = (repo1) ctx.getBean("r1");
		repo2 rp2 = (repo2) ctx.getBean("r2");
	}

}

ApplicationContext 를 AnnotaionConfigApplicationContext로 가져옴

GetBean으로 Bean을 사용시 Configuration 에서 Bean으로사용했던 메서드 명이 등록된 Bean의 id

( GetBean(메서드명) )

 

 

4. ApplicationConfig에 ComponentScan을 활용한 Bean등록 (SpringBoot)

ApplicationConfig

package main;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@ComponentScan(basePackageClasses = SpringstudyApplication.class)
@Configuration
public class ApplicationConfig {
	
}

ComponentScan을 활용하여 SpringstudyApplication이 있는 패키지내에 Bean등록 어노테이션이 붙은 모든 객체를 찾은후 Bean으로 등록

 

SpringstudyApplication

package main;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringstudyApplication {
	@Autowired
	repo1 rp1;
	@Autowired
	repo2 rp2;
	public static void main(String[] args) {
		
	}
}

@SpringBootApplication으로 등록하면 Configuration 어노테이션이 붙은 설정 파일을 실행하며 모든 Bean들을 사용가능하게함 

 

'Tools > Spring' 카테고리의 다른 글

스프링 AOP 적용 예제  (0) 2021.02.28
스프링 AOP 기본 동작 원리  (0) 2021.02.27
Component와 Component Scan  (0) 2020.08.09
ApplicationContext-2 (Autowired)  (0) 2020.08.06
Spring Ioc 컨테이너와 Bean  (0) 2020.08.04