반응형
1. 빈 (Bean) 이란?
- JavaBeans - 재사용 가능한 컴포넌트, 상태( iv ), getter&setter, no-args constructor
- Servlet & JSP Bean - MVC의 Model, EL, scope, JSP container가 관리
- EJB ( Enterprise Java Beans ) - 복잡한 규칙, EJB container가 관리
- Spring Bean - POJO ( Plain Old Java Object ) 단순, 독립적, Spring container가 관리
2. BeanFactory와 ApplicationContext
- Spring container가 관리하는 객체
- Spring container - Bean 저장소, Bean을 저장, 관리 ( 생성, 소멸, 연결 )
- BeanFactory - Bean을 생성, 연결 등의 기본 기능을 정의
- ApplicationContext - BeanFactory를 확장해서 여러 기능을 추가 정의
3. ApplicationContext의 종류
- 다양한 종류의 ApplicationContext 구현체를 제공
AC의 종류 | XML | Java Config |
non - Web | GenericXmlApplicationContext | AnnotationConfigApplicationContext |
Web | XmlWebApplicationContext | AnnotationConfigWebApplicationContext |
4.IoC와 DI
- 제어의 역전 IoC - 제어의 흐름을 전통적인 방식과 다르게 뒤바꾸는 것
- 의존성 주입 DI - 사용할 객체를 외부에서 주입받는 것
[전통적인 방식] 사용자 코드가 Framework 코드를 호출
Car car = new Car();
car.turboDrive();
void turboDrive() {
engine = new TurboEngine();
engine.start();
…
}
[IoC] Framework 코드가 사용자 코드를 호출
Car car = new Car();
car.drive(new SuperEngine());
void drive(Engine engine) {
engine.start();
…
}
5. 스프링 애너테이션
@Autowired
- 인스턴스 변수( iv ) , setter, 참조형 매개변수를 가진 생성자, 메서드에 적용
class Car {
@Autowired Engine engine;
@Autowired Door[] doors;
@Autowired(required = false)
SuperEngnie superEngine;
@Autowired
public Car(@Value("red")String color, @Value("100")int oil, Engine engine, Door[] doors) {
this.color = color;
this.oil = oil;
this.engine = engine;
this.doors = doors;
}
@Autowired
public void setEngineAndDoor(Engine engine, Door[] door) {
this.engine = engine;
this.door = door;
}
- Spring container에서 타입으로 빈을 검색해서 참조 변수에 자동 주입(DI)
검색된 빈이 n개면, 그중에 참조변수와 이름이 일치하는 것을 주입 - 주입 대상이 변수일 때, 검색된 빈이 1개 아니면 예외발생
- 주입 대상이 배열일 때, 검색된 빈이 n개라도 예외 발생 X
- [참고] @Autowired(required=false)일 때, 주입할 빈을 못찾아도 예외 발생 X
@Resource
- Spring container에서 이름으로 빈을 검색해서 참조 변수에 자동 주입(DI)
일치하는 이름이 없으면, 예외 발생
class Car {
@Resource(name="superEngine")
Engine engine;
}
class Car {
@Autowired
@Qualifier(name="superEngine")
Engine engine;
}
class Car {
// @Resource(name="superEngine")
@Resource
Engine engine;
}
@Component
- <component-scan>로 @Component가 클래스를 자동 검색해서 빈으로 등록
@Controller, @Service, @Repository, @ControllerAdvice의 메타 애너테이션
<context:component-scan base-package="com.springmvcstudy.ch3">
@Value 와 @PropertySource
@Component
@PropertySource("setting.properties")
class SysInfo {
@Value("#{systemProperties['user.timezone']}")
String timeZone;
@Value("#{systemEnvironment['PWD']}")
String currDir;
@Value("${autosaveDir}")
String autosaveDir;
@Value("${autosaveInterval}")
int autosaveInterval;
@Value("${autosave}")
boolean autosave;
@Override
public String toString() {
return "SysInfo{" +
"timeZone='" + timeZone + '\'' +
", currDir='" + currDir + '\'' +
", autosaveDir='" + autosaveDir + '\'' +
", autosaveInterval=" + autosaveInterval +
", autosave=" + autosave +
'}';
}
}
public class ApplicationContextTest {
public static void main(String[] args) {
ApplicationContext ac = new GenericXmlApplicationContext("config.xml");
System.out.println("ac.getBean(SysInfo.class) = " + ac.getBean(SysInfo.class));
Map<String, String> map = System.getenv();
System.out.println("map = " + map);
Properties properties = System.getProperties();
System.out.println("properties = " + properties);
}
}
6. 스프링 애너테이션 vs 표준 애너테이션 ( JSR-330 )
- javax.inject-1.jar - @Inject, @Named, @Qualifier, @Scope, @Singleton
annotations-api.jar - @Resource, @ManagedBean, @PreDestroy, @PostContruct
스프링 애너테이션 | 표쥰 애너테이션 | 비고 |
@Autowired | @Inject | @Inject에는 required 속성이 없음 |
@Qualifier | @Qualifier, @Named | 스프링의 @Qualifier는 @Named와 유사 |
- | @Resource | 스프링에는 이름 검색이 없음 |
@Scope("singleton") | @Singleton | 표준에서는 prototype이 default |
@Component | @Named, @ManagedBean | 표준에서는 반드시 이름이 있어야 함 |
7. 빈의 초기화
<property>와 setter
- <property>를 이용한 빈 초기화 .setter를 이용
<bean id="car" class="com.springmvcstudy.ch3.Car">
<property name="color" value="red"/>
<property name="oil" value="100"/>
<property name="engine" ref="engine"/>
<property name="doors">
<array value-type="com.springmvcstudy.ch3.Door">
<ref bean="door"/>
<ref bean="door"/>
</array>
</property>
</bean>
<bean id="engine" class="com.springmvcstudy.ch3.Engine" />
<bean id="door" class="com.springmvcstudy.ch3.Door" scope="prototype"/>
<constructor-arg>와 생성자
- <constructor-arg>를 이용한 빈 초기화. 생성자를 이용
반응형
'Spring' 카테고리의 다른 글
[스프링의 정석] AOP의 개념과 용어 (0) | 2023.04.21 |
---|---|
[스프링의 정석] Transaction, Commit, Rollback (0) | 2023.04.21 |
[스프링의 정석] Spring DI 흉내내기 (0) | 2023.04.18 |
[스프링의 정석] 예외 (0) | 2023.04.17 |
[스프링의 정석] Http, 컨트롤러 메서드의 반환타입 (0) | 2023.04.10 |