kenzi
스프링 5일차 (Autowired, interface, scope) 본문
오늘의 정리
1) Autowired란 정확히 무엇인가?
한마디로 "의존관계 설정"이다
xml에서 Component-scan을 할 때에 @Component가 붙은 객체(=Bean)에 의존성을 주입시켜준다
일반적으로 xml에서 의존성 주입을 할 때에 <constructor~ />(=생성자 방식)나 <property~ />(=setter메서드 방식) 로 injection을 해준다
하지만 Component로 빈 객체를 등록할 때에는 의존성 주입을 어떻게 해야할까?
정답은 @Autowired이다
생성자나 setter메서드에 @Autowired를 걸어주면 자동으로 엮어준다 (=주입시켜준다)
2) 인터페이스?
@Configuration
public class Container2 {
@Bean
public Viewer viewer() {
MonitorViewer viewer = new MonitorViewer();
viewer.setDisplayMode(displayMode());
return viewer;
}
//애초에 인터페이스 없이 이렇게 만들면 안되나요?
public MonitorViewer monitorViewer() {
MonitorViewer viewer = new MonitorViewer();
viewer.setDisplayMode(displayMode());
return viewer;
}
}
안됩니다
왜요?
MonitorViewer말고 ScreenViewer가 추가될수도 있는데 그때 또 만들어서 클래스마다 수정하는 거보단
MonitorViewer가 Viewer인터페이스를 상속받아서 추상 메서드의 몸통을 구체적으로 만들고 실행하는 걸로 하고 그 객체를 리턴하는게 낫죠
예를 들면 설명서의 기본 언어는 한국어인데 영어도 추가해야할 때 모든 설명을 영어로 일일이 바꿀려면 야근해야하잖아요....!
그래서 인터페이스에는 추상 메서드만 적고 구현 클래스에서는 추상 메서드의 몸통을 구체적으로 적어야한다!
인터페이스에 있는 모든 메서드를 override(나 이거 조상의 메서드 오버라이딩하는거다!의 표시) 하지 않으면 에러난다
//Viewer 인터페이스
public interface Viewer {
//인터페이스 메서드는 기본이 public이다 public을 붙여도 되고 안 붙이면 public이 생략된거다
void draw();
void add(Camera camera);
}
//MonitorViewer
public class MonitorViewer implements Viewer { //인터페이스를 상속받고
private DisplayMode displayMode;
public void setDisplayMode(DisplayMode displayMode) {
this.displayMode = displayMode;
}
//Viewer인터페이스에 있는 메서드의 몸통을 구체적으로 만들어줘야한다
@Override
public void draw() {
System.out.println(displayMode.getType() + " 모드로 카메라 이미지 출력됨");
}
@Override
public void add(Camera camera) {
// TODO Auto-generated method stub
System.out.println("모니터에 " + camera + " 영상 추가");
}
}
3. scope
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
는 메서드를 실행할 때마다 새로운 빈 객체를 생성해주는 거고
@Scope("prototype")
은 getBean으로 빈을 불러올때만 새로운 빈 객체를 생성해주는거다
4. xml로 <property name = "kenzi" ref = "~~">
하고 setKenzi(~~) 할때
setter메서드의 파라미터(~~)는 1개밖에 넣지 못한다 명심!
여러개 넣기? 불가능
//KenziHomeController.java
private AlarmDevice alarmDevice;
private Viewer viewer;
//Anno로 할 때는 이런 메서드가 가능하지만
public void prepare(AlarmDevice alarmDevice, Viewer viewer) {
this.alarmDevice = alarmDevice;
this.viewer = viewer;
}
//xml일때는 이렇게 나눠야 한다 set메서드의 파라미터는 하나만 가질수 있어서 ..
public void setAlarmDevice(AlarmDevice alarmDevice) {
this.alarmDevice = alarmDevice;
}
public void setViewer(Viewer viewer) {
this.viewer = viewer;
}
//anno로 할 때 컨테이너
@Bean
public KenziHomeController kenziHomeController() {
KenziHomeController kenziHomeController = new KenziHomeController();
kenziHomeController.prepare(alarmDevice(),viewer());
}
//xml로 할 때 컨테이너
<bean id = "kenziHomeController" class = "KenziHomeController">
<property name = "alarmDevice" ref = "alarmDevice" />
<property name = "viewer" ref = "viewer" />
</bean>
xml이 가독성은 좋으나 setter로밖에 메서드를 못 넣어서 그게 좀 불편하다 어노테이션으로 하면 메서드 만들어서 여러개 넣으면 되는데....
오늘 저녁은
1. 자바 인터페이스, 인스턴스 개념 다시 잡고
2. 노마드 코더 강의
3. 정처기 실기 정리
'Spring' 카테고리의 다른 글
pom.xml이 무엇인지 정리해보자 .. (0) | 2022.04.04 |
---|---|
AOP (0) | 2022.04.04 |
스프링 4일차 정리 (0) | 2022.03.31 |
스프링은 3가지로 끝난다 (0) | 2022.03.31 |
컨테이너와 빈 방식에 관하여 (0) | 2022.03.30 |