스프링 빈은 초기화(init)와 소멸화(destroy)의 라이프 사이클을 가지고 있다. 이 라이프 사이클을 이해하면 빈 객체가 생성되고 소멸될 때 추가적인 작업을 수행할 수 있다
init-method속성을 사용하면 스프링이 빈 객체를 생성한 다음 초기화 작업을 수행할 메소드를 지정할 수 있다. 이 메소드는 빈 객체 생성자가 완료된 이후에 호출된다.init-method속성으로 지정된 메소드는 일반적으로 빈의 초기화를 위해 사용된다.
@Bean(initMethod = "openShop", destroyMethod = "closeShop")
public Owner owner(){
return new Owner();
}
또한 실제로 실행파일에서 owner를 불러와서 써야 실행되는 듯하다..
public class Owner {
public void openShop(){
System.out.println("openShop");
}
public void closeShop(){
System.out.println("closeShop");
}
}
owner() 빈은 initMethod가 설정되어 있어, 추가적인 초기화 작업이 필요하므로 우선적으로 생성될 가능성이 높습니다.
destroy-method속성을 사용하면 빈 객체가 소멸될 때 호출할 메소드를 지정할 수 있다. 이 메소드는ApplicationContext의close()메소드가 호출되기 전에 빈 객체가 소멸될 때 호출된다.destroy-method속성으로 지정 된 메소드는 일반적으로 사용하던 리소스를 반환하기 위해 사용된다.
destroyMethod는 다음과 같이 container를 제거하여 bean을 제거해야 실행된다.
//설명. main 메소드 종료 전에 Container를 제거(bean 제거 강제화)
((AnnotationConfigApplicationContext)context).close();
Properties 는 키/값 쌍의 파일.
: 빈의 속성 값을 저장하고 읽어올 수 있다.
이건 절대 DI가 아님!! DI이려면 Bean이어야지.
key = value 형식으로 저장됨.
product-info.properties 라는 이름의 파일을 생성하고 Product 타입의 값이 될 value를 적절한 key를 설정하여 정의한다.
bread.carpbread.name=붕어빵
bread.carpbread.price=1000
beverage.milk.name=딸기우유
beverage.milk.price=1500
beverage.milk.capacity=500
beverage.water.name=지리산암반수
beverage.water.price=3000
beverage.water.capacity=500
product-info.properties 파일에 기재한 값으로 상품들의 값을 초기화 하려고 한다.
properties 파일을 읽어올 때 @PropertySource 어노테이션에 경로를 기재하여 읽어올 수 있으므로 읽어올 properties 파일의 경로를 작성한다.
빈 설정 파일 내부에 @Value 어노테이션을 사용하여 properties의 값을 읽어온다. @Value 어노테이션은 빈의 속성 값을 자동으로 주입받을 수 있는 어노테이션이다.
@Configuration
/* resources 폴더 하위 경로를 기술한다. 폴더의 구분은 슬러쉬(/) 혹은 역슬러쉬(\\)로 한다. */
@PropertySource("section03/properties/subsection01/properties/product-info.properties")
public class ContextConfiguration {
/* 치환자(placeholder) 문법을 이용하여 properties에 저장된 key를 입력하면 value에 해당하는 값을 꺼내온다.
* 공백을 사용하면 값을 읽어오지 못하니 주의한다.
* : 을 사용하면 값을 읽어오지 못하는 경우 사용할 대체 값을 작성할 수 있다.
**/
@Value("${bread.carpbread.name:팥붕어빵}")
private String carpBreadName;
/* 값은 여러 번 불러올 수 있다. */
// @Value("${bread.carpbread.name:슈크림붕어빵}")
// private String carpBreadName2;
@Value("${bread.carpbread.price:0}")
private int carpBreadPrice;
@Value("${beverage.milk.name:}")
private String milkName;
@Value("${beverage.milk.price:0}")
private int milkPrice;
@Value("${beverage.milk.capacity:0}")
private int milkCapacity;
@Bean
public Product carpBread() {
return new Bread(carpBreadName, carpBreadPrice, new java.util.Date());
}
@Bean
public Product milk() {
return new Beverage(milkName, milkPrice, milkCapacity);
}
@Bean
public Product water(@Value("${beverage.water.name:}") String waterName,
@Value("${beverage.water.price:0}") int waterPrice,
@Value("${beverage.water.capacity:0}") int waterCapacity) {
return new Beverage(waterName, waterPrice, waterCapacity);
}
@Bean
@Scope("prototype")
public ShoppingCart cart() {
return new ShoppingCart();
}
}
필드 또는 파라미터에 @Value 어노테이션을 사용할 수 있으며 해당 어노테이션에 ${key} 와 같이 치환자(placeholder) 문법을 이용하여 properties에 저장된 key를 입력하면 value에 해당하는 값을 꺼내와 필드 또는 파라미터에 주입한다.
key 뒤에
:을 이용하여 해당 key 값이 없을 경우에는 주입할 기본 값을 입력할 수 있다.