java의 class 상속 / Interface 를 이용한 추상화를 기반으로 하는 개발 방법
Spring은 아래 DI/IoC를 강력하게 지원하는 프레임워크
IoC : Inversion of Control
프로그램을 제어하는 패턴 중 하나.
DI 는 IoC패턴의 구현방법 중 하나.
DI에 따라 프로그램의 흐름이 완전히 변경됨.
- 스프링 프레임워크가 동작할 때 프로그램이 필요로 하는 객체들을 전부 생성한 뒤 관리하는 곳이다.
- 자바에서는 new키워드를 사용해서 직접 만들어 사용했지만, 스프링에서는 필요한 객체를 미리 만들어 놓는다.
- 그 다음 자바 코드에서 미리 생성된 객체를 꺼내어 쓰는 형태다.
- 대표적인 클래스는 application-context 이다.
- bean은 xml파일에 만든다.

DI : Dependency Injection (의존성 주입)
스프링 Container 에 만들어둔 각종 클래스(bean)들은 서로 의존적이다
(A객체가 B객체 없이 동작이 불가능한 상황 / 즉 객체 안에 객체가 저장되는 형태)
스프링은 DI를 기준으로 많은 프레임워크모듈 들이 만들어짐.
Spring 은 DI Framework 혹은 IoC Framework 라고 부름.
DI (의존성 주입) 설정 방법 2가지
( 1 ) 생성자를 통한 의존성 주입
객체를 집어넣어줄 때 사용하는 속성 ref
<constructor-arg ref="빈id"></constructor-arg>
( 2 ) setter를 통한 의존성 주입
<property name = "변수명" value="값"/>
<property name = "변수명" ref="객체"/>
예제 1번.
Chef
package ex02;
public class Chef {
public void cooking() {
System.out.println("요리");
}
}
Hotel
package ex02;
public class Hotel {
//생성자
private Chef chef;
public Hotel(Chef chef) {
this.chef = chef;
}
public Chef getChef() {
return chef;
}
}
DatabaseDev
package ex02;
public class DatabaseDev {
private String url;
private String uid;
private String upw;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUpw() {
return upw;
}
public void setUpw(String upw) {
this.upw = upw;
}
}
MemberDAO
package ex02;
public class MemberDAO {
private DatabaseDev databaseDev;
public DatabaseDev getDatabaseDev() {
return databaseDev;
}
public void setDatabaseDev(DatabaseDev databaseDev) {
this.databaseDev = databaseDev;
}
}
MainClass
package ex02;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("application-context.xml");
//생성자를 통한 주입 확인
Hotel hotel = ctx.getBean(Hotel.class);
hotel.getChef().cooking();
//세터를 통한 주입 확인
MemberDAO dao = (MemberDAO)ctx.getBean("dao");
System.out.println(dao.getDatabaseDev().getUid());
}
}
예제 2번.
Customer
package ex03;
import java.util.List;
import java.util.Map;
public class Customer {
//List or Map의 의존성 주입
private List<String> list;
private List<Person> person;
private Map<String, Object> map;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public List<Person> getPerson() {
return person;
}
public void setPerson(List<Person> person) {
this.person = person;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
Person
package ex03;
public class Person {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
Main
package ex03;
import java.util.Map;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("Collection-context.xml");
Customer customer = ctx.getBean("customer", Customer.class);
Map<String, Object> map = customer.getMap();
System.out.println(map.get("name"));
System.out.println(map.get("id"));
}
}
예제 3번.
Car
package ex04;
public class Car {
private IBattery battery;
//생성자 주입
public Car(IBattery battery) {
this.battery = battery;
}
//getter
public IBattery getBattery() {
return battery;
}
}
Airplane
package ex04;
public class Airplane {
private IBattery battery;
//getter
public IBattery getBattery() {
return battery;
}
//setter
public void setBattery(IBattery battery) {
this.battery = battery;
}
}
IBattery (인터페이스)
package ex04;
public interface IBattery {
public void energy();
}
Battery1
package ex04;
public class Battery1 implements IBattery {
@Override
public void energy() {
System.out.println("자동차 배터리");
}
}
Battery2
package ex04;
public class Battery2 implements IBattery{
@Override
public void energy() {
System.out.println("비행기 배터리");
}
}
MainClass
package ex04;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
//Car, Airplane 빈을 생성하고, 의존성 주입
//각 객체 안에 있는 배터리를 자바클래스에서 출력.
GenericXmlApplicationContext ctx
= new GenericXmlApplicationContext("Battery-context.xml");
Airplane airplane = ctx.getBean("airplane", Airplane.class);
Car car = ctx.getBean("car", Car.class);
airplane.getBattery().energy();
car.getBattery().energy();
}
}
빈의 범위
'Spring' 카테고리의 다른 글
스프링 MVC Controller객체 구현 (0) | 2023.02.23 |
---|---|
스프링 부트 | 개발환경 구축 (0) | 2023.02.10 |
스프링 | 의존객체 자동주입 태그 (0) | 2023.02.07 |
스프링 | 스프링 개발 환경 세팅 (0) | 2023.01.30 |