Spring源碼分析(五) -- Spring中的BeanPostProcessor

BeanPostProcessor 定義

public interface BeanPostProcessor {
	//這個方法會在bean實例化後,調用初始化方法以前執行
	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}
    //這個方法會在bean實例化後,調用初始化方法以後執行
    //這裏的before和after是相對於初始化方法的調用
	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}
複製代碼
  • 從定義中能夠看出BeanPostProcessor是一個接口
  • BeanPostProcessor定義了兩個方法,都是default修飾的。

BeanPostProcessor 使用

Dao 類

public interface IDao {
	void query();
}

@Repository("indexDao")
public class IndexDao implements IDao {
	@Override
	public void query() {
		System.out.println("index dao");
	}
}
複製代碼

InvocationHandler 類

public class InvocationHandlerTest implements InvocationHandler{

	private Object target;

	public InvocationHandlerTest(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("invoke proxy");
		return method.invoke(target, args);
	}
}
複製代碼

BeanPostProcessorTest 類

@Component
public class BeanPostProcessorTest implements BeanPostProcessor {
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if (beanName.equals("indexDao")) {
			System.out.println("before");
            //使用JDK動態代理,返回一個代理類
			return Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandlerTest(bean));
		}
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		if (beanName.equals("indexDao")) {
			System.out.println("after");
		}
		return bean;
	}
}
複製代碼

Appconfig 類

@Configuration
@ComponentScan("com.ktcatv")
public class Appconfig {
}
複製代碼

Test 類

public class Test {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(Appconfig.class);
        //這裏打斷點能夠看出,這個IDao對象是一個代理類
        //說明原始對象在BeanPostProcessorTest中被替換了
		IDao dao = (IDao) configApplicationContext.getBean("indexDao");
		dao.query();

	}
}
複製代碼
相關文章
相關標籤/搜索