object.getClass().equals(clazz)
@Resource(name="superEngine")
...
1) non-Web : GenericXmlApplcationContext
2) Web : XmlWebApplcationContext
1) non-Web : AnnotationConfigApplcationContext
2) Web : AnnotationConfigWebApplcationContext
// in xml (텍스트 문서)
<bean id ... />
// in java Config (컴파일러가 관리!)
@Bean
new XmlWebApplicationContext();
1) isPrototype(String name)
2) isSingleton(String name)
3) isTypeMatch(String name, Class<//T> typeToMatch)
1) 제어의 역전 IoC : 제어의 흐름을 전통적인 방식과 다르게 뒤바꾸는 것
void turboDrive() {
engine = new TurboEngine();
// superEngine으로 바꾸고 싶으면..!
// 라이브러리 자체를 뜯어 고쳐야됨~~
engine.start();
}
2) 의존성 주입 DI : 사용할 객체를 외부에서 주입받는 것
car.drive(new SuperEngine()); // 수동 주입!
// 자동 주입 : @Autowired
...
void drive(Engine engine) {
engine.start();
...
}
// 1. iv
class Car {
@Autowired Engine engine;
}
...
// 2. setter
@Autowired
public void setEngineAndDoor(Engine engine) {
this.engine = engine;
}
...
// 3. 참조형 매개변수 생성자, 메서드에 적용
@Autowired
public Car (@Value("red") String color, Engine engine) {
this.color = color;
this.engine = engine;
}
=> 1,2는 빼먹을 수도 있으니까 생성자에 한꺼번에 주입하는게 나음!
class Car {
@Resource(name="superEngine")
Engine engine;
}
class Car {
@Autowired // 1. 타입 검색 후,
@Qualifier("superEngine") // 2. 어떤거 주입할지 지정!
Engine engine;
}
class Car {
@Resource(name="engine")
@Resource // 이름 생략 가능!
Engine engine;
}
<component-scan>
으로 @Component가 클래스를 자동 검색해서 빈으로 등록<context:component-scan base-package="com.fastcampus.ch3" />
<!-- 서브 패키지까지 다 검색해서
@Component 붙은 클래스들 다 모아서 빈으로 등록해줌 -->
package com.fastcampus.ch3;
import org.springframework.stereotype.*;
// 1. <bean id="superEngine"
// class="com.fastcampus.ch3.SuperEngine">
// 2. @Component("superEngine") // 이름 생략 가능
@Component
class SuperEngine extends Engine {}
@Value("#{systemProperties['user.timezone']}")
// 시스템 속성 / 환경 변수 가져올 때!
...
Properties prop = System.getProperties();
@Value("${autosaveDir}")
1) @Autowired = @Inject
2) @Qualifier = @Resource (annotations-api.jar 가 필요함!)
3) @Scope("singleton") : 표준에서는 prototype이 디폴트
4) @Component
※ annotations-api.jar : @Qualifier, @PreDestroy, @Singleton
<property>
와 setter<property>
를 이용한 빈 초기화 (setter 이용)<constructor-arg>
를 이용한 빈 초기화 (생성자 이용)<list>
, <set>
, <map>