ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.