通过bean 后置处理器实现AOP功能(方法增强)
通过实现 BeanPostProcessor 创建自定义后置处理器。获取到对象的实例。
内部通过JDK动态代理或者 CGLIB完成对象代理实现方法的增强。
package com.yling.postProcessor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import com.yling.pojo.User;
import com.yling.test.Logger;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("a".equals(beanName)) {
User user = (User) bean;
user.setUsername("ydt");
user.setUid(1);
return user;
}
final Object target = bean;
if (bean.getClass().getInterfaces().length > 0) {
// jdk 动态代理
bean = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Logger.start();
Object obj = method.invoke(target, args);
Logger.stop();
return obj;
}
});
} else {
// cglib动态代理
Enhancer enhancer = new Enhancer(); // 创建增强器
enhancer.setSuperclass(target.getClass()); // 设置父类
enhancer.setCallback(new MethodInterceptor() {
Object invoke = null;
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy mProxy)
throws Throwable {
System.out.println("欢迎使用cglib");
Logger.start();
invoke = method.invoke(target, args);
Logger.stop();
return invoke;
}
});
return enhancer.create();
}
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
return bean;
}
}