해당 예시는 Bean 의 동작 방식을 설명하기 위해 든 예시이며, 실제 스프링의 Bean이 동작 하는 방식은 훨씬 정교하고 잘 구성 되어 있습니다.
book1=exam.Book
public class Book { //
private String title; // title 인스턴스 field(속성)
private int price; // price 인스턴스 field(속성)
// 기본 생성자
public Book() {
}
// Book 생성자
public Book(String title, int price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
public class ApplicationContext {
Properties props;
public ApplicationContext() {
props = new Properties();
try {
props.load(new FileInputStream("src/main/resources/Beans.properties'));
} catch (IOException e) {
e.printStackTrace():
}
public Object getBean(String id) throws Exception {
String className = props.getProperty(id);
// Class.forName(className) -> ClassPath에 해당하는 클래스를 찾은 후
Class clazz = Class.forName(className);
// ClassLoader를 이용한 인스턴스 생성. 기본생성자가 있어야 한다.
Object o = clazz.newInstance(); // clazz 정보를 이용해 인스턴스를 생성한다
return o;
}
}
package exam;
public class ApplicationContextMain {
public static void main(String[] args) throws Exception {
ApplicationContext context = new ApplicationContext();
Book book1 = (Book)context.getBean("book1")
book1.setPrice(5000);
book1.setTitle("즐거운 자바");
Sytem.out.println(book1.getPrice()); // 5000
Sytem.out.println(book1.getTitle()); // 즐거운 자바
}
}
위 과정을 통헤 만들어 주는 것이 일반적입니다. 그러나 객체를 무작위로 생성해 낸다면 어플리케이션에 부하를 주게 되어 서버가 멈출 수도 있습니다. 그러한 경우를 방지해 싱글턴 패턴을 적용한 코드를 보도록 하겠습니다.
book1=exam.Book
public class Book { //
private String title; // title 인스턴스 field(속성)
private int price; // price 인스턴스 field(속성)
// 기본 생성자
public Book() {
}
// Book 생성자
public Book(String title, int price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
public class ApplicationContext {
private Properties props;
private Map objectMap;
// 1. 클래스 객체를 저장하는 static 필드 선언, 바로 초기화
private static ApplicationContext instance = new ApplicationContext();
// 3. 인스턴스를 반환하는 static 메서드, getInstance()
public static ApplicationContext getInstance() {
return instance;
}
// 2. 생성자를 private으로 선언한다.
private ApplicationContext() {
props = new Properties();
objectMap = new HashMap<String, Object>();
try {
props.load(new FileInputStream("src/main/resources/Beans.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
public Object getBean(String id) throws Exception {
Object o1 = objectMap.get(id);
if (o1 == null) {
String className = props.getProperty(id);
// Class.forName(className) -> ClassPath에 해당하는 클래스를 찾은 후
Class clazz = Class.forName(className);
// ClassLoader를 이용한 인스턴스 생성. 기본생성자가 있어야 한다.
Object o = clazz.newInstance(); // clazz 정보를 이용해 인스턴스를 생성한다.
objectMap.put(id, o);
o1 = objectMap.get(id);
}
return o1;
}
}
package exam;
public class ApplicationContextMain {
public static void main(String[] args) throws Exception {
ApplicationContext context = ApplicationContext.getInstance();
Book book = (Book) context.getBean("book1"); // id에 해당하는 인스턴스를 달라.
book.setPrice(5000);
book.setTitle("자바 프로그래밍");
System.out.println(book.getPrice());
System.out.println(book.getTitle());
System.out.println("-----------------");
Book book2 = (Book) context.getBean("book1");
System.out.println(book2.getTitle());
if (book == book2) {
System.out.println("같은 인스턴스"); // 같은 인스턴스
} else {
System.out.println("다른 인스턴스");
}
}
}