-
BeanPostProcessor스프링 프레임워크 기초 공부 2020. 5. 23. 15:14
Bean객체를 정의할 때 init-method 속성을 설정하면 객체가 생성될 때 자동으로 호출될 메서드를 지정할 수 있다.
이때 BeanPostProcessor 인터페이스를 구현한 클래스를 정의하면 Bean 객체를 생성할 때 호출될 init 메서드 호출을 가로채 다른 메서드를 호출 수 있도록 할 수 있다.
BeanPostProcessor 인터페이스
메서드 2개
postProcessBeforeInitialization : init - method 에 지정된 메서드가 호출되기 전에 호출된다.
postProcessBeforeAfterInitialization : init - method 에 지정된 메서드가 호출된 후에 호출된다.
init - method 가 지정되고 있지 않더라도 자동으로 호출된다
bean객체
package kr.co.softcampus.beans; public class TestBean1 { public TestBean1() { System.out.println("TestBean1의 생성자"); } public void bean1_init() { System.out.println("TestBean1의 init 메서드"); } }
package kr.co.softcampus.beans; public class TestBean2 { public TestBean2() { System.out.println("TestBean2의 생성자"); } public void bean2_init() { System.out.println("TestBeean2의 init 메서드"); } }
BeanPostProcessor
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"); return bean; } // init-method 호출 후 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // TODO Auto-generated method stub System.out.println("after"); return bean; } }
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>
1.init-method가 실행되기 전에 BeanPostProcessor 클래스의 postProcessBeforeInitialization 메서드가 실행되고 init-method 실행 후에 postProcessAfterInitialization 메서드가 실행됨
2.t2 bean은 init-method를 설정하지않았다 이런 경우는 init-method는 호출되지않고
postProcessBeforeInitialization 메서드와 postProcessAfterInitialization 메서드가 순서대로 실행됨
main
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(); } }
출력
TestBean1의 생성자
before
TestBean1의 init 메서드
after
-------------------------------------------
TestBean2의 생성자
before
after
만약 객체 마다 postProcessBeforeInitialization 메서드와 postProcessAfterInitialization 메서드를
다르게 호출하고싶다면
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; } }
다음과 같이 swith(beanname)을 사용하여 case:객체id를 지정해줘서 각각 객체들마다 다르게 수행할 수 있다.
'스프링 프레임워크 기초 공부' 카테고리의 다른 글
spring mariadb 연동방법 (xml방식) (0) 2020.08.07 component (0) 2020.05.26 spring jdbc (0) 2020.05.16 xml namespace (0) 2020.05.01 12장 AOP (0) 2020.04.30