반응형
BeanPostProcessor
Bean 객체를 정의할 떄 init-method 속성을 설정하면 객체가 생성될 떄 자동으로 호출될 메서드를 지정할 수 있습니다. 이 때 BeanPostProcessor 인터페이스를 구현한 클래스를 정의하면 Bean 객체를 생성할 때 호출될 init 메서드 호출을 가로채 다른 메서드를 호출할 수 있도록 할 수 있습니다.
postProcessBeforInitialization : init-method에 지정된 메서드가 호출되기 전에 호출됩니다.
postProcessAfterInitialization : init-method에 지정된 메서드가 호출된 후에 호출됩니다.
init-method가 지정되어 있지 않더라도 자동으로 호출됩니다.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>kr.co.softcampus</groupId>
<artifactId>BeanPostProcessor</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- xml에서 사용할 속성들 -->
<properties>
<!-- 자바 버전 -->
<java-version>1.8</java-version>
<!-- 스프링 버전 -->
<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
<!--<org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
<org.slf4j-version>1.7.26</org.slf4j-version>
<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
</properties>
<!-- 프로젝트에서 사용할 라이브러리 정보 -->
<dependencies>
<!-- spring context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${ch.qos.logback-version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
TestBean1.java
package kr.co.softcampus.beans;
public class TestBean1 {
public TestBean1() {
System.out.println("TestBean1의 생성자");
}
public void bean1_init() {
System.out.println("TestBean1의 init 메서드");
}
}
TestBean2.java
package kr.co.softcampus.beans;
public class TestBean2 {
public TestBean2() {
System.out.println("TestBean2의 생성자");
}
public void bean2_init() {
System.out.println("TestBeean2의 init 메서드");
}
}
beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id='t1' class='kr.co.softcampus.beans.TestBean1' lazy-init='true' init-method="bean1_init"/>
<bean id='t2' class='kr.co.softcampus.beans.TestBean2' lazy-init='true'/>
<bean class='kr.co.softcampus.processor.TestBeanPostProcessor'/>
</beans>
MainClass.java
package kr.co.softcampus.main;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
TestBean1 t1 = ctx.getBean("t1", TestBean1.class);
System.out.printf("t1 : %s\n", t1);
System.out.println("--------------------------------------");
TestBean2 t2 = ctx.getBean("t2", TestBean2.class);
System.out.printf("t2 : %s\n", t2);
ctx.close();
}
}
TestBeanPostProcessor.java
package kr.co.softcampus.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class TestBeanPostProcessor implements BeanPostProcessor{
// init-method 호출 전
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("before");
switch(beanName) {
case "t1" :
System.out.println("id가 t1인 bean 객체 생성");
break;
case "t2" :
System.out.println("id가 t2인 bean 객체 생성");
break;
}
return bean;
}
// init-method 호출 후
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("after");
return bean;
}
}
이번 시간에는 BeanPostProcessor에 대해 알아볼 수 있었습니다. 객체가 생성될 떄 호출되는 init-method가 호출 되기 전 후에 호출할 로직을 또 구현할 수 있다는 것을 알게 되었습니다. 만약 init-method가 정의되지 않아도 호출이 되는 것 역시 알 수 있었습니다.
특정 상황에서 이러한 로직이 필요한 경우에는 적절한 처리를 통해 구현할 수 있다는 것을 알게 되었습니다. 복잡한 로직을 구현해야하는 경우에는 이러한 스프링 기능을 잘활용한다면 좋은 서비스를 구현할 수 있을 것 같습니다.
반응형
'SW > Java' 카테고리의 다른 글
Java : Spring : Bean : Setter 메서드를 통한 의존성 주입 : 예제, 구현 (0) | 2020.04.29 |
---|---|
Java : Spring : 의존성 주입(Dependency Injection) : 개념, 예제, 구현 (0) | 2020.04.20 |
Java : Spring: Bean 생성, 소멸 시 메소드 호출 방법 : 예제, 구현 (0) | 2020.04.14 |
Java : Spring: bean : 객체 생성, 태그 : 개념, 예제, 구현 (0) | 2020.04.13 |
Java: Spring : IoC 개념 : ApplicationContext, BeanFactory : 예제, 구현 (0) | 2020.04.12 |