- BeanFactory - Bean을 생성, 연결하는 기본 기능을 정의함
- ApplicationContext - BeanFactory를 확장해서 여러 기능을 추가함
root AC
루트 AC의 설정 파일 위치(name으로 알려주고)를 value(root-context.xml)로 적어주면 XmlWebApplicationContext가 new 될 때 설정파일을 이용해서 생성됨
Servlet AC
디스패쳐서블릿이 생성되는데 그때 설정파일 정보를 root AC처럼 받고(servlet-context.xml) new XmlWebApplicationContext해서 Servlet AC가 생성됨
두 개의 AC는 연결되는데, root AC가 부모, servlet AC가 자식 관계로 연결된다
빈을 찾을 때 자식(servlet)에서 먼저 찾고, 없으면 부모(root)에서 찾는다
자식 AC가 여러 개일 수 있다
그래서 그 자식들에서 공통으로 사용되는 빈을 부모 AC에 담아두고 각 모듈에서 사용되는 개별적인 빈들은 자식 AC에 담는다
부모 AC에는 웹과 상관 없는 non-Web 빈들을 넣는다
톰캣 서버 구조
ApplicationContext(JSP 기본 객체)
인스턴스 변수, setter, 참조형 매개변수를 가진 생성자나 메서드(객체의 주소를 참조하는 것들)
매개변수에 들어갈만한 것들을 AC에서 가져와서 연결해줌
생성자의 @Autowired는 생략 가능
각각 붙이는 것보다 생성자를 이용해서 한 번에 붙이는 것이 권장됨
생성자로 주입할 때 @Autowired를 생략하면, 기본 생성자가 있으면 자동 주입하지 않고 기본 생성자로 객체를 생성해버림
@Autowired를 붙여줘야함
타입으로 빈을 검색해서 참조 변수에 자동 주입함
검색된 빈이 여러개면 그 중에 참조변수와 이름이 일치하는 것을 주입함
주입할 대상이 변수(1개)일 때 검색된 빈이 1개여야 예외가 발생하지 않고
주입할 대상이 배열일 때 검색된 빈이 1개가 아니더라도 예외가 발생하지 않는다
@Autowired(required = false)면 0개여도 예외가 발생하지 않고 참조 값을 null로 갖는다
@Value("#{systemProperties['user.timezone']}")
String timeZone;
@Value("#{systemEnvironment['APPDATA']}")
String currDir;
@Value("${autosaveDir}")
String autosaveDir;
@Value("${autosaveInterval}")
int autosaveInterval;
@Value("${autosave}")
boolean autosave;
결과
ac.getBean(SysInfo.class)) = SysInfo{timeZone='Asia/Seoul', currDir='C:\Users\jju\AppData\Roaming', autosaveDir='/autosave', autosaveInterval=30, autosave=true}
Map<String, String> map = System.getenv();
System.out.println("map = " + map);
Properties properties = System.getProperties();
System.out.println("properties = " + properties);