스프링 레시피 CH2.2 생성자 호출해서 POJO 생성하기

2023. 12. 10. 22:09spring

 

과제

IoC 컨테이너에서 생성자를 호출해서 POJO 인스턴스/빈을 생성하세요. 생성자를 호출하는 건 스프링에서 빈을 생성하는 가장 일반적이면서 직접적인 방법입니다. 자바 new 연산자로 객체를 생성하는 것과 같습니다.

 

해결책

1. POJO 클래스에 생성자를 하나 이상 정의한다.

2. 자바 구성 클래스에서 IoC 컨테이너가 사용할 POJO 인스턴스값을 생성자로 설정한다.

3. IoC 컨테이너를 인스턴스화해서 애너테이션을 붙인 자바 클래스를 스캐닝한다.

 

Product 추상 클래스 설계

public abstract class Product {

    private String name;
    private double price;

    public Product() {}

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    public double getPrice() { return price; }

    public void setPrice(double price) { this.price = price; }

    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

 

1. POJO 클래스에 생성자를 하나 이상 정의한다.

public class Battery extends Product{
    private boolean rechargeable;

    public Battery() {
        super();
    }

    public Battery(String name, double price) {
        super(name, price);
    }

    public boolean isRechargeable() {
        return rechargeable;
    }

    public void setRechargeable(boolean rechargeable) {
        this.rechargeable = rechargeable;
    }
}

 

public class Disc extends Product{

    private int capacity;

    public Disc () {
        super();
    }

    public Disc(String name, double price) {
        super(name, price);
    }

    public int getCapacity() {
        return capacity;
    }

    public void setCapacity(int capacity) {
        this.capacity = capacity;
    }
}

 

 

2. 자바 구성 클래스에서 IoC 컨테이너가 사용할 POJO 인스턴스값을 생성자로 설정한다.

@Configuration
public class ShopConfiguration {

    @Bean
    public Product aaa() {
        Battery p1 = new Battery("AAA", 2.5);
        p1.setRechargeable(true);
        return p1;
    }

    @Bean
    public Product cdrw() {
        Disc p2 = new Disc("CD-RW", 1.5);
        p2.setCapacity(700);
        return p2;
    }
}

 

 

3. IoC 컨테이너를 인스턴스화해서 애너테이션을 붙인 자바 클래스를 스캐닝한다.

public class ShopMainExample {

    public static void main(String[] args) {
        ApplicationContext context =
                new AnnotationConfigApplicationContext(ShopConfiguration.class);

        Product aaa = context.getBean("aaa", Product.class);
        Product cdrw = context.getBean("cdrw", Product.class);

        System.out.println(aaa);
        System.out.println(cdrw);
    }
}
=>
Product{name='AAA', price=2.5}
Product{name='CD-RW', price=1.5}