첫번째 예시는 기본적인 사용법을 알려준다. 예시에서는 커스텀한 BeanPostProcessor 구현체가 컨테이너에 의해 생성됨에 따라 각 bean들의 toString() 메소드를 호출하는 것을 보여준다. 그리고 결과 문자열을 시스템 콘솔에 출력한다.
다음 예시는 커스텀한 BeanPostProcessor 구현 클래스의 정의를 보여준다.
package scripting;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class InstantiationTracingBeanPostProcessor implements BeanPostProcessor {
// 단순히 기존의 인스턴스화된 bean을 반환한다.
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean; // 잠재적으로 어떤 객체에 대한 참조도 이곳에서 반환받을 수 있다.
}
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("Bean '" + beanName + "' created : " + bean.toString());
return bean;
}
}
다음 beans 요소는 InstantiationTracingBeanPostProcessor를 사용한다.
<?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:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/lang
https://www.springframework.org/schema/lang/spring-lang.xsd">
<lang:groovy id="messenger"
script-source="classpath:org/springframework/scripting/groovy/Messenger.groovy">
<lang:property name="message" value="Fiona Apple Is Just So Dreamy." />
</lang:groovy>
<!-- 위의 messenger bean이 인스턴스화 될 때, 이 커스텀 BeanPostProcessor 구현체가
시스템 콘솔에 결과값을 출력할 것이다 -->
<bean class="scripting.InstantiationTracingBeanPostProcessor" />
</beans>
InstantiationTracingBeanPostProcessor가 얼마나 단순히 정의되었는지 보라. 심지어 이름도 없으면서 bean이기 때문에 다른 bean에 의존성으로 주입될 수 있다. 위의 설정은 Groovy 스크립트의 보조를 받아 bean을 정의했다. 스프링의 동적 언어 지원은 '동적 언어 지원' 부분에서 자세히 확인할 수 있다.
다음 자바 애플리케이션은 위의 코드와 설정을 구동시킨다.
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.scripting.Messenger;
public final class Boot {
public static void main(final String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("scripting/beans.xml");
Messenger messenger = ctx.getBean("messenger", Messenger.class);
System.out.println(messenger);
}
}
위의 애플리케이션의 결과는 다음과 비슷하다.
Bean 'messenger' created : org.springframework.scripting.groovy.GroovyMessenger@272961
org.springframework.scripting.groovy.GroovyMessenger@272961
'SpringFramework Core - I. IoC 컨테이너 > 8. 컨테이너의 확장가능한 부분들' 카테고리의 다른 글
1.8.2.1. 예시: 클래스명의 대체자 PropertySourcesPlaceholderConfigurer (0) | 2020.03.24 |
---|---|
1.8.2. BeanFactoryPostProcessor로 설정 메타데이터 커스터마이징하기 (0) | 2020.03.24 |
1.8.1.2. 예시: RequiredAnnotationBeanPostProcessor (0) | 2020.03.24 |
1.8.1. BeanPostProcessor로 Bean 커스터마이징하기 (0) | 2020.03.24 |
1.8. 컨테이너의 확장가능한 사항들 (0) | 2020.03.24 |