BeanPostProcessor 定義
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@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");
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 dao = (IDao) configApplicationContext.getBean("indexDao");
dao.query();
}
}
複製代碼