SW/Java

Java : Spring : BeanPostProcessor : 개념, 방법, 예제, 구현

얇은생각 2020. 4. 15. 19:30
반응형

Java : Spring : BeanPostProcessor : 개념, 방법, 예제, 구현

 

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가 정의되지 않아도 호출이 되는 것 역시 알 수 있었습니다. 

특정 상황에서 이러한 로직이 필요한 경우에는 적절한 처리를 통해 구현할 수 있다는 것을 알게 되었습니다. 복잡한 로직을 구현해야하는 경우에는 이러한 스프링 기능을 잘활용한다면 좋은 서비스를 구현할 수 있을 것 같습니다.

반응형