kenzi
스프링 4일차 정리 본문
1. context: annotation-config를 사용하면 자바어노테이션을 활성화할수 있습니다
2. ApplicationContextAware 와 GenericXmlApplicationContext 의 차이
여기 Main.java에서 GenericXmlApplicationContext로 factory 만들어서 getBean한거처럼
//Main.java
package ch03_lifeCycle;
import org.springframework.context.support.GenericXmlApplicationContext;
import ch03_obj.WorkScheduler;
public class Main2_Scope {
public static void main(String[] args) {
// TODO Auto-generated method stub
GenericXmlApplicationContext factory
= new GenericXmlApplicationContext("classpath:ch03_lifeCycle/Container2_Scope.xml");
WorkScheduler scheduler = factory.getBean("workScheduler",WorkScheduler.class);
scheduler.makeAndRunWork();
factory.close();
System.out.println("ok");
}
}
여기에서도 GenericXmlApplicationContext로 factory 불러서 getBean하면 안되나요?
//WorkScheduler.java
package ch03_obj;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
//ApplicationContextAware....??????
public class WorkScheduler implements ApplicationContextAware{
private WorkRunner workRunner;
private ApplicationContext ctx;
public void setWorkRunner(WorkRunner workRunner) {
this.workRunner = workRunner;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.ctx = applicationContext;
}
public void makeAndRunWork() {
for(long order = 1; order <= 10; order++) {
Work work = ctx.getBean("workProto",Work.class); //만들때마다 새로운 객체Bean을 만듬
System.out.println(work);
work.setOrder(order);
workRunner.execute(work);
}
}
} //end class
====>안됩니다
왜? ApplicationContextAware는 Container에 등록된 빈 객체(위에서는 WorkScheduler)가 Container에 등록된 다른 빈 객체(workProto)를 사용하고 싶을 때 불러오는 컨테이너이기 때문입니다.
애초에 Container에는 WorkScheduler와 workProto가 빈으로 등록되어 있고 빈끼리 서로 불러오고 싶을때
ApplicationContextAware를 사용해서 컨테이너를 불러옵니다.
하지만 GenericXmlApplicationContext은 빈에서 컨테이너에 종속된 다른 빈을 불러오는 게 아니라 빈에 등록되어 있지 않은 객체가 (컨테이너에 없는 객체)가 컨테이너를 불러와서 빈을 빼오고 싶을 때 사용합니다.
간단하게 예를 들면 같은 반 학생끼리 서로 부르는거(ApplicationContextAware)랑
다른 반 학생 또는 선생님 또는 학교직원 누군가가 교실 밖 복도에서 교실안에 있는 우리 반 학생 부르는거...?(GenericXmlApplicationContext)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:context = "http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id = "workProto" class = "ch03_obj.Work" scope = "prototype">
<property name = "timeout" value ="2000"/>
<property name = "type" value = "SINGLE"/>
</bean>
<bean id = "workRunner" class = "ch03_obj.WorkRunner" />
<bean id = "workScheduler" class = "ch03_obj.WorkScheduler">
<property name = "workRunner" ref = "workRunner" />
</bean>
</beans>
이렇게 Xml컨테이너에 bean이 총 3개가 있는데
이들끼리 서로 빈을 불러오고 싶으면 ApplicationContextAware로 컨테이너 불러서 사용하고,
bean으로 등록안된 클래스가 bean을 불러오고 싶으면 외부에서 xml을 읽어 컨테이너를 만드는 GenericXmlApplicationContext를 사용하는 것입니다
3. scope정리
4. 자바의 기초 ... 인스턴스 객체 생성 다시 한번 다지기
'Spring' 카테고리의 다른 글
AOP (0) | 2022.04.04 |
---|---|
스프링 5일차 (Autowired, interface, scope) (0) | 2022.04.01 |
스프링은 3가지로 끝난다 (0) | 2022.03.31 |
컨테이너와 빈 방식에 관하여 (0) | 2022.03.30 |
스프링 3일차 (0) | 2022.03.30 |