μ€νλ§ λΉ μ¬μ©
* ν΄λμ€λ₯Ό μ€νλ§ λΉμΌλ‘ λ§λλ μ€νλ§ λΉ μ μλ₯Ό μ€μ νλ€.
* μ€μ λ μ€νλ§ λΉ μ μλ₯Ό μ€νλ§ λΉ μ»¨ν μ΄λκ° μ°Ύμ μ μλλ‘ μ€μ νλ€.
* μλ‘ μμ‘΄μ±μ΄ μλ μ€νλ§ λΉλ€μ 쑰립ν μ μλλ‘ μ€μ νλ€.
μ€νλ§ μ ν리μΌμ΄μ μ μμκ³Όμ
1. μ€νλ§ λΉ μ»¨ν μ΄λ ꡬν체μ λ°λΌ μ ν΄μ§ ν¬λ§·μ μ€μ νμΌ λ‘λ© (XML, μλ° ν΄λμ€, κ·Έλ£¨λΉ λ±...)
- μ€νλ§ λΆνΈμ κΈ°λ³Έ μ€νλ§ λΉ μ»¨ν μ΄λ ꡬν체λ ConfigurationApplicationConetext μ΄λ©° μ€μ ν¬λ§·μ μλ°ν΄λμ€μ΄λ€.
2. μ§μ λ ν΄λμ€ ν¨μ€μ μμΉν ν΄λμ€λ€μ μ€μΊνκ³ , μ€νλ§ λΉ μ μκ° μμΌλ©΄ λ‘λ©.
3. λ‘λ© λλΈ ν μ€μ€νλ§ λΉ μ»¨ν μ΄λλ μ μλ λλ‘ μ€νλ§ λΉμΌλ‘ μμ±νκ³ μ»¨ν μ΄λμμ κ΄λ¦¬.
4. μ€νλ§ λΉλ€ μ¬μ΄μ μλ‘ μμ‘΄μ±μ΄ μλ κ°μ²΄λ€μ μ€νλ§ λΉ μ»¨ν μ΄λκ° μ‘°λ¦½νλ€.
5. μ€νλ§ λΉ μ»¨ν μ΄λ ꡬν ν΄λμ€μ λ°λ₯Έ μΆκ° μμ
6. μ ν리μΌμ΄μ μ€ν μ€λΉ μλ£.
μ€νλ§ λΉ λΆλ₯
1. μ€νλ§ νλ μμν¬μ κΈ°λ₯μ μ€νλ§ λΉμΌλ‘ μ μν κ²λ€.
- org.springframework.core.env.Environment
- org.springframework.context.ApplicationContext λ±
μ΄ λΉλ€μ κ°λ°μμ κ°μ μμ΄ μμ±λλ κ²λ€.
2. μ€νλ§ λΉ μ»¨ν μ΄λκ° λ‘λ©νλ μ€μ νμΌμ μ μλ κ²λ€.
- @Bean μ λν μ΄μ μ μ¬μ©νμ¬ μ μ, κ°λ°μκ° μ€νλ§ νλ μ μν¬μ κΈ°λ₯μ μ€μ νκ±°λ μ ν리μΌμ΄μ μμ 곡ν΅μΌλ‘ μ¬μ©νλ μ€νλ§ λΉ λ€μ μ€μ νλλ° μ£Όλ‘ νμ©.
3. μ€νλ§ λΉ μ»¨ν μ΄λκ° μ€μ λ ν¨ν€μ§ κ²½λ‘λ₯Ό μ€μΊν ν μ€νλ§ λΉμΌλ‘ μ μλμ΄ μμ±λλ μ€νλ§ λΉλ€.
- μ€ν λ μ€ νμ μ λν μ΄μ λ€μ μ¬μ©νμ¬ μ μνλ€.
μ΄λ κ² μμ±λ μ€νλ§ λΉλ€μ μλ‘ μμ‘΄μ±μ κ°μ§ μ μμΌλ©°, λͺ¨λ μ€νλ§ λΉ κ°μ²΄λ₯Ό κ΄λ¦¬νλ μ€νλ§ λΉ μ»¨ν μ΄λκ° μ€μ μ λ°λΌ μμ‘΄μ±μ μ£Όμ ν μ μλ€.
μ€νλ§ λΉ νΉμ§
- μ€νλ§ λΉ μ»¨ν μ΄λκ° κ΄λ¦¬νλ μμ μλ°(POJO) κ°μ²΄μ΄λ€.
- μ€νλ§ λΉ μ»¨ν μ΄λκ° μ€νλ§ λΉμ μμ±, μ£Όμ , μ’ λ£κΉμ§ κ΄λ¦¬νλ€. ( μ€νλ§ λΉ μλͺ μ£ΌκΈ° κ΄λ¦¬ )
- μ€νλ§ λΉμ΄ λ€λ₯Έ μ€νλ§ λΉμ μ°Έμ‘°ν μ μλ€.
- μ€νλ§ λΉμ μ΄λ¦μ΄λ ν΄λμ€ νμ μ 보λ₯Ό μ¬μ©νμ¬ μ€νλ§ λΉ μ»¨ν μ΄λμμ μ μ ν λΉκ°μ²΄λ₯Ό μ°Ύμ μ μκ³ , λ€λ₯Έ μ€νλ§ λΉ κ°μ²΄μ λ§΄λ² λ³μ, μ ν΄μ§ λ©μλμ μΈμλ‘λ λ£μ΄μ€ μ μλ€.(DI)
- μ€νλ§ λΉμ μ΄λ¦, ν΄λμ€ νμ , κ°μ²΄λ‘ ꡬμ±λλ€. ( κ°μ ν΄λμ€ νμ μ΄λΌλ μ΄λ¦μ΄ λ€λ₯΄λ€λ©΄ λ€λ₯Έ μ€νλ§ λΉ ) -> ν΄λμ€ νμ μ κ°μ§λ§ μ΄λ¦μ΄ λ€λ₯Έ μ¬λ¬ μ€νλ§ λΉμ΄ 컨ν μ΄λμ μμ μ μλ€.
μ€νλ§ λΉ μ μ λ°©λ²
1. μλ° μ€μ ν΄λμ€μμ @Bean μ λν μ΄μ μ μ¬μ©νμ¬ μ μ
2. μ€ν λ μ€ νμ μ λν μ΄μ μ μ¬μ©νμ¬ μ μ
3. BeanDefinition μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μ μ
4. XML μ€μ λ°©μμ μ¬μ©νλ λ°©λ²
1. Java Configuration
μλ° ν΄λμ€λ₯Ό κΈ°λ°μΌλ‘ μ ν리μΌμ΄μ μ μ€μ νκΈ° μν΄ μ λν μ΄μ μ 곡
@Bean, @ComponentScan, @Configuration, @Import
1.1. @Bean μ λν μ΄μ
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) --- 1
@Retention(RetentionPolicy.RUNTIME) --- 2
@Documented
public @interface Bean {
String[] value() default {}; --- 3
String[] name() default {}; --- 3
@Deprecated
Autowire autowire() default Autowire.NO;
boolean autowireCandidate() default true;
String initMethod() default "";
String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}
1. @Bean μ λν μ΄μ μ μ μν μ μλ νκΉμ λ©μλ, μ λν μ΄μ
2. λ°νμ μμ κΉμ§ @Beanμ λν μ΄μ μ΄ μ½λμ μ‘΄μ¬νλ€.
3. @Bean μ λν μ΄μ μ value λλ name μμ±μ κ°μ§ μ μμΌλ©°, μλ‘ μ°Έμ‘°νλ―λ‘ λμ€ νλλ₯Ό μ€μ ν΄λ κΈ°λ₯μ λκ°μ΄ λμ.
public class Test {
@Bean(name="testObj")
public TestObj testObj() {
return new TestObj();
}
@Bean
public TestObj noNameTestObj() {
return new TestObj();
}
}
- @Bean μ name or value κ° μ€μ μ ν΄λΉ μ΄λ¦μΌλ‘ λΉλ±λ‘, λ―Έμ€μ μ λ©μλλͺ μΌλ‘ λ±λ‘
1.2. @Configuration
- κ°μ₯ λ§μ΄ μ¬μ©νλ μ λν μ΄μ
- λ΄λΆμ @Bean μΌλ‘ μ μΈλ λ©μλ λ€μ ν¬ν¨ν μ μμ.
@Configuration
public class ThreadPoolConfig {
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
...
}
}
1.3. @ComponentScan
- ν¨ν€μ§μ νμ ν¨ν€μ§ κ²½λ‘μ ν¬ν¨λ μλ° μ€μ ν΄λμ€λ€κ³Ό μ€νΈλ μ€ νμ μ λν μ΄μ λ€μ΄ μ μΈλ ν΄λμ€λ€μ μ€μΊνλ€.
@Configuration
@ComponentScan(
basePackages = {"com.spring.toy"},
excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
}
)
public class BootApplication {
...
}
@ComponentScanμ μλ° μ€μ ν΄λμ€μ μ μλμ΄μΌ ν¨. λ°λΌμ @Configurationκ³Ό ν¨κ» μ¬μ©.
1.4. @Import
@Configuration
@Import(value = {ThreadPoolConfig.class})
public class BootConfig{
...
}
@ComponentScanκ³Ό λ¬λ¦¬ λμ μλ° ν΄λμ€λ₯Ό λͺ μμ μΌλ‘ μ§μ .
2. μ€ν λ μ€ νμ μ€νλ§ λΉ
μ€ν λ μ€ νμ μ μ λν μ΄μ λ€μ @ComponentScanμΌλ‘ μ€μΊλλ€.
@Component, @Controller, @Service, @Repository μ λν μ΄μ μ΄ μλ€.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
----------------------------------------------
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface Component {
String value() default "";
}
μ΄μ°¨νΌ κΈ°λ₯μ Componentμ κ°μ, ν΄λμ€ λͺ©μ μ΄λ ν¨ν΄μ λ°λΌ λͺ ννκ² μ μν΄μ μ¬μ©νκΈ° μν΄ λΆλ¦¬.