[Spring] μ λ Έν μ΄μ μ μ΄μ©ν λΉ μ€μ λ°©λ² μ 리
[Spring] μ λ Έν μ΄μ μ μ΄μ©ν λΉ μ€μ λ°©λ² μ 리
λΉ μ€μ μ νκΈ° μν΄ μ¬μ©λλ μ€νλ§ μ λ Έν μ΄μ @Required, @Autowired, @Qualifier, @Valueκ³Ό JSR-250 μ λ Έν μ΄μ @PostConstruct, @PreDestroy, @Resourceμ λν΄ μμ보μ
μ΄ μ λ Έν μ΄μ λ€μ μ¬μ©ν΄ κΈ°μ‘΄μ XML λΉ μ€μ νμΌμ λͺ¨λ μμ±νλ λΉ μ€μ μ λΉ ν΄λμ€μ μ§μ μ€μ ν μ μλ€.
XML μ€μ μ μ λ Έν μ΄μ λΉ μ€μ μ μ¬μ©νκΈ° μν μ½λ μΆκ°
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
context λ€μ μ€νμ΄μ€μ <context:annotation-config/> μ½λλ₯Ό μΆκ°νλ€.
μ΄λ κ² μ€μ νλ©΄ λΉ μ€μ μ XML νμΌμ΄ μλ λΉ ν΄λμ€μ μ λ Έν μ΄μ μ κ²μν΄ λ°μνλ€.
@Required
- setterμ λΆμ¬ λ°λμ μ£Όμ ν΄μΌνλ νλ‘νΌν°λ‘ μ€μ νλ μ λ Έν μ΄μ
- Spring 5.1 λ²μ λΆν° Deprecated λμλ€. β‘οΈ λ°λμ μ£Όμ ν΄μΌ ν νλ‘νΌν°λ μμ±μ μ£Όμ μ μ΄μ©νλ€.
- μ€νλ§ 5.1μ΄μμ μ¬μ©νκ±°λ μλ° νμΌλ‘ beanμ λ±λ‘νμ κ²½μ° λ¬΄μλλ€.
μμ μ½λ
public class TestBean1 {
private int data1;
public int getData1() {
return data1;
}
// νμ μ£Όμ
νλ‘νΌν°
// μ€νλ§ 5.1μ΄μμ μ¬μ©νκ±°λ μλ° νμΌλ‘ beanμ λ±λ‘νμ κ²½μ° λ¬΄μλλ€
@Required
public void setData1(int data1) {
this.data1 = data1;
}
}
@Configuration
public class BeanConfigClass {
@Bean
public TestBean1 testBean1() {
return new TestBean1();
}
}
@Autowired
- κ°μ²΄ νμ μ ν΅ν΄ λΉ κ°μ²΄λ₯Ό μλμΌλ‘ μ£Όμ νλ€.
- νλ, μμ±μ, setterμ λΆμΌ μ μλ€.
- νλ, setterμ λΆμ¬μ μ¬μ©ν κ²½μ° λ°λμ κΈ°λ³Έ μμ±μκ° μ μλμ΄ μμ΄μΌ νλ€.
- νλμ λΆμ΄λ©΄ setterλ₯Ό ν΅ν΄ μ£Όμ λλ©° setterκ° μμ κ²½μ° μ»΄νμΌ κ³Όμ μμ μλμΌλ‘ μΆκ°λλ€.
μμ μλ° μ½λ
public class TestBean1 {
// νλ μλ μ£Όμ
// μλμΌλ‘ setter λ©μλκ° μΆκ°λμ΄ setter λ©μλλ₯Ό ν΅ν΄ μ£Όμ
λλ€.
@Autowired
private DataBean1 data3;
}
public class DataBean1 { }
μ€μ - μλ°
@Configuration
public class BeanConfigClass {
@Bean
public TestBean1 testBean1() {
return new TestBean1();
}
@Bean
public DataBean1 dataBean1() {
return new DataBean1();
}
}
μ€μ - XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id='testBean1' class='com.atoz_develop.beans.TestBean1'/>
<bean class='com.atoz_develop.beans.DataBean1'/>
</beans>
@Qualifier
- @Autowiredμ ν¨κ» μ¬μ©νλ€.
- @Autowiredλ₯Ό ν΅ν μλ μ£Όμ μ κ°μ νμ μ λΉμ΄ μ¬λ¬ κ° μ μλμ΄ μμΌλ©΄ @Qualifierμ μ€μ λμ΄ μλ λΉμ μ°Ύμ μ£Όμ νλ€.
μμ μλ° μ½λ
public class TestBean1 {
@Autowired
@Qualifier("obj4")
private DataBean2 data4;
@Autowired
@Qualifier("obj5")
private DataBean2 data5;
}
public class DataBean2 { }
μ€μ - μλ°
@Configuration
public class BeanConfigClass {
@Bean
public TestBean1 testBean1() {
return new TestBean1();
}
@Bean
public DataBean2 obj4() {
return new DataBean2();
}
@Bean
public DataBean2 obj5() {
return new DataBean2();
}
}
μ€μ - XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id='testBean1' class='com.atoz_develop.beans.TestBean1'/>
<bean id='obj4' class='com.atoz_develop.beans.DataBean2'/>
<bean id='obj5' class='com.atoz_develop.beans.DataBean2'/>
</beans>
@Value
- μμ±μ μ£Όμ μ μλμΌλ‘ μ£Όμ λμ§ μλ κΈ°λ³Έ μλ£νκ³Ό λ¬Έμμ΄μ κ°μ μ€μ νλ€.
μμ μλ° μ½λ
public class TestBean2 {
private int data1;
private String data2;
private DataBean3 data3;
private DataBean4 data4;
public TestBean2(@Value("100") int data1, @Value("λ¬Έμμ΄") String data2, DataBean3 data3, DataBean4 data4) {
this.data1 = data1;
this.data2 = data2;
this.data3 = data3;
this.data4 = data4;
}
}
public class DataBean3 { }
public class DataBean4 { }
μ€μ - XML
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
<bean id='testBean2' class='com.atoz_develop.beans.TestBean2'/>
<bean class='com.atoz_develop.beans.DataBean3'/>
<bean class='com.atoz_develop.beans.DataBean4'/>
</beans>
XML μ€μ μμ <context:annotation-config/>λ₯Ό μΆκ°νλ©΄ λΉ ν΄λμ€μ μ£Όμ μ€μ μ λ°λ‘ νμ§ μμλ μμ±μ μ£Όμ μ΄ μλμΌλ‘ μ΄λ£¨μ΄μ§λ€.
μ΄λ κΈ°λ³Έ νμ κ³Ό λ¬Έμμ΄ νμ μ νλλ μλμΌλ‘ μ£Όμ λμ§ μμΌλ©° @Valueλ₯Ό μ¬μ©ν΄μ κ°μ μ€μ ν μ μλ€.
μλ° μ λ Έν μ΄μ μ€μ (@Configuration)μ μ¬μ©ν λλ μ΄ λ°©λ²μ΄ μ μ©λμ§ μλλ€.
JSR-250 μ λ Έν μ΄μ μμ‘΄μ± μΆκ°
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
@PostConstruct
- @Bean(initMethod="...") λμ μ¬μ©
- μμ±μ νΈμΆ ν μλμΌλ‘ νΈμΆλ λ©μλμ λΆμ¬μ μ¬μ©
@Configuration ν΄λμ€μμ @Beanμ initMethod μμ±μ λΉμ΄ μμ±λ λ νΈμΆλ λ©μλλ₯Ό μ§μ νλ λμ λΉμ ν΄λμ€μ λ©μλμ @PostConstructλ₯Ό λΆμ¬ μ§μ μ€μ ν μ μλ€.
μμ μ½λ
public class TestBean2 {
// μμ±μ νΈμΆ μ΄ν μλμΌλ‘ νΈμΆ
@PostConstruct
public void init2() {
System.out.println("TestBean2μ init λ©μλ");
}
}
μ€μ
@Configuration
public class BeanConfigClass {
@Bean
public TestBean2 obj2() {
return new TestBean2();
}
}
@PreDestroy
- @Bean(destroyMethod="...") λμ μ¬μ©
- κ°μ²΄ μλ©Έ μ μλμΌλ‘ νΈμΆλ λ©μλμ λΆμ¬μ μ¬μ©
@Configuration ν΄λμ€μμ @Beanμ destroyMethod μμ±μ λΉμ΄ μμ±λ λ νΈμΆλ λ©μλλ₯Ό μ§μ νλ λμ λΉμ ν΄λμ€μ λ©μλμ @PostConstructλ₯Ό λΆμ¬ μ§μ μ€μ ν μ μλ€.
μμ μ½λ
public class TestBean2 {
// κ°μ²΄κ° μλ©ΈλκΈ° μ μ μλμΌλ‘ νΈμΆ
@PreDestroy
public void destroy2() {
System.out.println("TestBean2μ destroy λ©μλ");
}
}
μ€μ
@Configuration
public class BeanConfigClass {
@Bean
public TestBean2 obj2() {
return new TestBean2();
}
}
@Resource
- λΉ μ΄λ¦(id)μ ν΅ν΄ μλ μ£Όμ
- @Autowired + @Qualifierμ μ μ¬
- νλλͺ κ³Ό λμΌν μ΄λ¦μ λΉμ μ£Όμ
- νλλͺ κ³Ό λΉ μ΄λ¦μ΄ λ€λ₯΄λ©΄ @Resource(name=“…”)
π νλλͺ κ³Ό λΉ μ΄λ¦(id)κ° λμΌν κ²½μ°
μμ μ½λ
public class TestBean5 {
// λ³μμ μ΄λ¦κ³Ό λμΌν μ΄λ¦μ Beanμ΄ μ£Όμ
λλ€.
@Resource
private DataBean1 data1;
@Resource
private DataBean2 data2;
}
μ€μ
@Configuration
public class BeanConfigClass {
@Bean
public DataBean1 data1() {
return new DataBean1();
}
@Bean
public DataBean2 data2() {
return new DataBean2();
}
@Bean
public TestBean5 obj5() {
return new TestBean5();
}
}
π νλλͺ κ³Ό λΉ μ΄λ¦(id)κ° λ€λ₯Έ κ²½μ° - name μμ± μ¬μ©
μμ μ½λ
public class TestBean6 {
@Resource(name = "data1")
private DataBean1 data100;
@Resource(name = "data2")
private DataBean2 data200;
}
μ€μ
@Configuration
public class BeanConfigClass {
@Bean
public DataBean1 data1() {
return new DataBean1();
}
@Bean
public DataBean2 data2() {
return new DataBean2();
}
@Bean
public TestBean6 obj6() {
return new TestBean6();
}
}
TestBean6μ DataBean1νμ νλλͺ μ΄ κ°κ° data100, data200μ΄κ³ λΉ λ±λ‘μ data1, data2λ‘ λμ΄μμΌλ―λ‘ κ·Έλ₯ @Resourceλ₯Ό λΆμ΄λ©΄ μλ μ£Όμ μ΄ μ΄λ£¨μ΄μ§μ§ μλλ€.
μ΄λ° κ²½μ° @Resourceμ name μμ±μ μ¬μ©ν΄μ λΉ μ΄λ¦μ μ§μ μ§μ νλ€.
Javaμ annotation-apiλ μ€νλ§μ μν λΌμ΄λΈλ¬λ¦¬κ° μλλΌ μ¬λ¬κ°μ§ μλ° μ΄ν리μΌμ΄μ κ°λ°μ μ¬μ©ν μ μλ λΌμ΄λΈλ¬λ¦¬μ΄λ€.
μ€νλ§μμλ @PostConstruct, @PreDestroy, @Resourceμ κ°μ μ λ Έν μ΄μ μ μ§μνλ―λ‘ νΈλ¦¬νκ² μ¬μ©ν μ μλ€.