yoncho`s blog

[Spring MVC] ApplicationContext에 Dynamic Bean Create 본문

기술, 나의 공부를 공유합니다./[Web][BE] JAVA

[Spring MVC] ApplicationContext에 Dynamic Bean Create

욘초 2023. 10. 10. 20:41

조건 : 

1) Spring Container가 생성되는 시점을 event listener로 Catch해서 동적으로 Bean 생성

2) Bean은 BlogVo(Class)로 생성된 blog 라는 이름으로 등록

 

작업 순서 :

1) EventListener 생성 및 이벤트 핸들러 작업

2) EventListener를 applicationContext.xml (root-context.xml)에 등록


1. Event Listener 생성

(1) ApplicationListener Interface를 구현해야함.

public class SpringContextEventListener implements ApplicationListener<ContextRefreshedEvent>

ApplicationListener<T> : 환경 또는 ApplicationContext가 사용 가능하기 전이나 ApplicationListener가 등록된 후

SpringApplication이 시작되자마자 발생하는 이벤트

*T : ContextRefreshedEvent / ApplicationStartedEvent  / etc..ContextRefreshedEvent : SpringContext가 refresh된 경우 event catch

 

(2) @Override  onApplicationEvent 함수

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
	//event 발생 시 실행해야할 코드..
}

event가 발생했을 때 실행되는 함수

 

(3) 이벤트 발생 시 실행할 코드

if (event.getApplicationContext().getParent() != null) {
	System.out.println("SpringContext Refreshed [sub]");
	ConfigurableApplicationContext applicationContext = (ConfigurableApplicationContext) event.getApplicationContext();
	
	BlogVo blog = new BlogVo();
	applicationContext.getBeanFactory().registerSingleton("blog", blog);
}else {
	System.out.println("SpringContext Refreshed [root]");
}

Spring Container가 refresh되는 경우는 두 가지임.

1) SpringContainer (root)   - Repository & Service 

2) SpringContainer             - Controller 

 

여기서 SpringContainer (root가 아닌 경우)가 refresh된 경우일 때 (물론 start된 경우로 event class를 변경해도 상관없음)
bean을 applicationContext에 singleton으로 등록함. 

이때 등록하는 blog 는 빈 BlogVo 객체임.

 

 

2. Event Listener 를 ApplicationContext에 등록

(1) bean 등록

<bean class="com.*******.jblog.event.SpringContextEventListener" />

applicationContext.xml (root-context) 혹은 spring-servlet.xml (servlet-context)에 등록

Comments